www.pudn.com > test20070811V10.rar > main.c, change:2007-08-11,size:68466b
//ICC-AVR application builder : 2007-5-12 23:12:06
// Target : M16
// Crystal: 1.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
//#include <math.h>
#define uint unsigned int
#define uchar unsigned char
#define TRUE 1
#define FALSE 0
#define VERSION_CONTROL 1
#define YEAR_SETUP 0x07
#define MONTH_SETUP 0x06
#define DAY_SETUP 0x10
#define INIT_YEAR 0x07
#define INIT_MONTH 0x06
#define INIT_DATE 0x10
#define INIT_DAY 0x07
#define INIT_HOUR 0x19
#define INIT_MINUTE 0x07
#define INIT_SECOND 0x00
#if 1
#define KEY_FUNCTION 0x43 //pc7 ,K1
#define KEY_UP 0x83 //pc6 ,K2
#define KEY_DOWN 0xc2 //pc0 ,K3
#define KEY_K4 0xc1 //pc1 ,K4
#define KEY_K1K4RST 0x41 //k1k4
#define KEY_K3K4RST 0xc0 //k3k4
#else
#define KEY_UP 0xc2 //pc0 ,K2
#define KEY_DOWN 0xc1 //pc1 ,K3
#define KEY_FUNCTION 0x83 //pc6 ,K1
#define KEY_K4 0x43 //pc7 ,K4
#define KEY_K1K4RST 0x03 //k1k4
#define KEY_K3K4RST 0x41 //k3k4
#endif
#define KEY_RESET 0xd
#define MAXVAL_LENGHT 9999
//#define MINVAL_LENGHT 8
#define MINVAL_LENGHT 4
#define MAXVAL_KIND 112
#define MINVAL_KIND 0
#define MODE_NOMALE 1
#define MODE_LENGHT 2
#define MODE_KIND 3
#define MODE_PASSWORD 4
//#define CLASSNUMBER 32
#define CLASSNUMBER 4
//从前向后,正向。
#define DIR0 0x00
//从后向前,反向。
#define DIR1 0x04
//从中间向两边。
#define DIR2 0x08
//从两边向中间。
#define DIR3 0x0c
//整体
//#define DIR4 0x40
//全彩
#define KIND0 0x00
//慧星拖尾
#define KIND1 0x10
//红-青-红
#define KIND2 0x20
//六色刷色
#define KIND3 0x30
//混合色
#define KIND4 0x40
//三路交叠
#define KIND5 0x50
//多彩
#define KIND6 0x60
#define KIND7 0x70
#define ALLBLACK 0x95 //10010101
#define UNLOCKDATA 0x15 //00010101
#define SPEED0 0x00
#define SPEED1 0x01
#define SPEED2 0x02
#define SPEED3 0x03
#define PASSWORDLENGHT 6
#define PASS_DISABLE 0xff
#define PASSWORD_SETUP 0x11
#define DATE_SETUP 0x22
#define INVALE_SETUP 0x33
//#define PASSWORD_ENTER 0x44
#define MAXDATE 250
#define MAXNUMBER 99
//typedef struct {
char ModeStatus;
char CurrentKey;
char BackKey;
char K1Count;
uchar K4Count;
char CurrentKind;
char val_kind;
uchar Password_alarm;
uchar Password_Enable;
uchar PassDate_flag; //0x11 : password setup ; 0x22 : date setup
uint val_lenght;
uint BLenghtCount;
uint FLenghtCount;
uint HalfLenght;
uint left;
uint right;
uint PwModify_flag;
//}WORKLED;
//WORKLED WorkLed;
unsigned char KindData[MAXVAL_KIND];
uchar PasswordData[PASSWORDLENGHT];
uchar DateValue[4];
uchar DayData[2];
uchar Oneday;
//uchar tc1,tc2;
uchar color1,color2,SI_Count;
/*
KindDataStr[MAXVAL_KIND][2]:
mode data 8bit; dir data 4bit + speed data 4bit
1 byte 2byte
speed data:
0 -->speed 1
1 -->speed 2
2 -->speed 3
3 -->speed 4
dir data:
0 --> 正向
1 --> 反向
2 -->中间向两边
3 -->两边向中间
*/
#define RBASE 0x94 //D2D1
#define GBASE 0x85 //D6D5
#define BBASE 0x91 //D4D3
#define YBASE 0xbf&RBASE&GBASE
#define WBASE 0xbf&RBASE&GBASE&BBASE
#define RBBASE 0xbf&RBASE&BBASE
#define GBBASE 0xbf&GBASE&BBASE
//亮00
#define SDATA0 0x00
//灭01
#define SDATA1 0x01
//渐暗10
#define SDATA2 0x02
//渐明11
#define SDATA3 0x03
#define BDATA 0x80
#define GBIT 4
#define BBIT 2
#define RBIT 0
//全彩
#define ALLCOLOR BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //0xb1
#define SEVENCOLOR0 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT)
#define SEVENCOLOR1 BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA3<<RBIT)
#define SEVENCOLOR2 BDATA |(SDATA3<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT)
#define SEVENCOLOR3 BDATA |(SDATA2<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT)
#define SEVENCOLOR4 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA2<<RBIT)
#define SEVENCOLOR5 BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA3<<RBIT)
#define THREECOLORR BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT)
#define THREECOLORG BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT)
#define THREECOLORB BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT)
#define THREECOLORR1 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT)
#define THREECOLORG1 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA2<<RBIT)
#define THREECOLORB1 BDATA |(SDATA2<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT)
#define ALLCOLOR0 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT)
#define ALLCOLOR4 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA3<<RBIT)
#define ALLCOLOR3 BDATA |(SDATA0<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT)
#define ALLCOLOR2 BDATA |(SDATA3<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT)
#define ALLCOLOR1 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA3<<RBIT)
#define ALLCOLOR5 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA0<<RBIT)
#if 1
#define ALLSTAR0 BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT) //red
#define ALLSTAR1 BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT) //green
#define ALLSTAR2 BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT) //blue
#define ALLSTAR3 BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA2<<RBIT) //0xb1
#define ALLSTAR4 BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT) //0xb1
#define ALLSTAR5 BDATA |(SDATA2<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT) //0xb1
#define ALLSTAR6 BDATA |(SDATA2<<GBIT)|(SDATA2<<BBIT)|(SDATA2<<RBIT) //0xb1
#else
#define ALLSTAR0 BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //red
#define ALLSTAR1 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT) //green
#define ALLSTAR2 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT) //blue
#define ALLSTAR3 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA0<<RBIT) //0xb1
#define ALLSTAR4 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //0xb1
#define ALLSTAR5 BDATA |(SDATA0<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT) //0xb1
#endif
//#define UNITEC0 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA2<<RBIT) //red
//#define UNITEC1 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT) //green
//#define UNITEC2 BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA3<<RBIT) //blue
#define UNITEC0 BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //red
#define UNITEC1 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT) //green
#define UNITEC2 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT) //blue
#define UNITEC3 BDATA |(SDATA2<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT) //0xb1
#define UNITEC4 BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA3<<RBIT) //0xb1
#define UNITEC5 BDATA |(SDATA3<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT) //0xb1
#define ALL_ID 0
#define STAR_ID 1
#define SIX_ID 2
#define SEVEN_ID 3
//整体三路交叠渐变
#define THREE_ID 4
//三路交叠飘动
#define THREE1_ID 5
//整体全彩渐变
#define ALLCOLOR_ID 6
//混合色交叠渐变
#define UNITEC_ID 7
const unsigned char KindGroudData[8][7]=
{
//全彩
{ALLCOLOR0,ALLCOLOR1,ALLCOLOR2,ALLCOLOR3,ALLCOLOR4,ALLCOLOR5,0x00},
//慧星拖尾
{ALLSTAR0,ALLSTAR1,ALLSTAR2,ALLSTAR3,ALLSTAR4,ALLSTAR5,0x00},
// {ALLSTAR0,ALLSTAR1,ALLSTAR2,0x00,0x00,0x00,0x00},
//六色刷色: 红 绿 兰 黄 紫 青
{RBASE,GBASE,BBASE,YBASE,RBBASE,GBBASE,0x00},
//多彩: 红 绿 兰 黄 紫 青 白
{SEVENCOLOR0,SEVENCOLOR1,SEVENCOLOR2,SEVENCOLOR3,SEVENCOLOR4,SEVENCOLOR5,0x00},
//整体三路交叠渐变: 红 绿 兰
{THREECOLORR,THREECOLORG,THREECOLORB,0x00,0x00,0x00,0x00},
//三路交叠飘动: 红 绿 兰
{THREECOLORR1,THREECOLORB1,THREECOLORG1,0x00,0x00,0x00,0x00},
//整体全彩渐变
{ALLCOLOR0,ALLCOLOR1,ALLCOLOR2,ALLCOLOR3,ALLCOLOR4,ALLCOLOR5,0x00},
//混合色交叠渐变
{UNITEC0,0x00,0x00,0x00,0x00,0x00,0x00},
// {UNITEC0,UNITEC1,UNITEC2,UNITEC3,UNITEC4,UNITEC5,0x00},
};
const unsigned char KindDataValue[60][2]=
{
//0 -->52
{GBBASE ,RBASE},{GBBASE ,RBASE},{GBBASE ,RBASE},{GBBASE ,RBASE},
//-->56
{GBBASE ,RBASE},{GBBASE ,GBASE},{GBBASE ,GBASE},{GBBASE ,GBASE},
//8 -->60
{GBBASE,GBASE},{GBBASE,GBASE},{WBASE,YBASE},{WBASE,YBASE},
//12-->64
{WBASE,YBASE},{WBASE,YBASE},{WBASE,YBASE},{RBBASE,BBASE},
//16-->68
{RBBASE,BBASE},{RBBASE,BBASE},{RBBASE,BBASE},{RBBASE,BBASE},
//20-->72
{YBASE,GBASE},{YBASE,GBASE},{YBASE,GBASE},{YBASE,GBASE},
//24-->76
{YBASE,GBASE},{WBASE,GBBASE},{WBASE,GBBASE},{WBASE,GBBASE},
//28-->80 v
{WBASE,GBBASE},{WBASE,GBBASE},{GBBASE,BBASE},{GBBASE,BBASE},
//32-->84
{GBBASE,BBASE},{GBBASE,BBASE},{GBBASE,BBASE},{YBASE,RBASE},
//36-->88
{YBASE,RBASE},{YBASE,RBASE},{YBASE,RBASE},{YBASE,RBASE},
//40-->92
{WBASE,RBBASE},{WBASE,RBBASE},{WBASE,RBBASE},{WBASE,RBBASE},
//44-->96
{WBASE,RBBASE},{WBASE,GBASE},{WBASE,GBASE},{WBASE,GBASE},
//48-->100
{WBASE,GBASE},{WBASE,GBASE},{WBASE,RBASE},{WBASE,RBASE},
//52-->104
{WBASE,RBASE},{WBASE,RBASE},{WBASE,RBASE},{WBASE,BBASE},
//56-->108
{WBASE,BBASE},{WBASE,BBASE},{WBASE,BBASE},{WBASE,BBASE}
};
const unsigned char KindDataStr[MAXVAL_KIND][2]=
{
//0 v
{ALL_ID,KIND0|DIR0|SPEED0},{ALL_ID,KIND0|DIR0|SPEED1},{ALL_ID,KIND0|DIR0|SPEED2},{ALL_ID,KIND0|DIR0|SPEED3},
// 4 v
{ALL_ID,KIND0|DIR1|SPEED0},{ALL_ID,KIND0|DIR1|SPEED1},{ALL_ID,KIND0|DIR2|SPEED0},{ALL_ID,KIND0|DIR2|SPEED1},
//8 v
{ALL_ID,KIND0|DIR3|SPEED0},{ALL_ID,KIND0|DIR3|SPEED1},{STAR_ID,KIND1|DIR0|SPEED0},{STAR_ID,KIND1|DIR0|SPEED1},
//12
{STAR_ID,KIND1|DIR0|SPEED2},{STAR_ID,KIND1|DIR1|SPEED0},{STAR_ID,KIND1|DIR1|SPEED1},{STAR_ID,KIND1|DIR2|SPEED0},
//16
{STAR_ID,KIND1|DIR2|SPEED1},{STAR_ID,KIND1|DIR3|SPEED0},{STAR_ID,KIND1|DIR3|SPEED1},{ALLCOLOR_ID,KIND0|DIR0|SPEED0},
//20v
{SIX_ID,KIND3|DIR0|SPEED0},{SIX_ID,KIND3|DIR0|SPEED1},{SIX_ID,KIND3|DIR0|SPEED2},{SIX_ID,KIND3|DIR0|SPEED3},
//24v
{SIX_ID,KIND3|DIR1|SPEED0},{SIX_ID,KIND3|DIR1|SPEED1},{SIX_ID,KIND3|DIR2|SPEED0},{SIX_ID,KIND3|DIR2|SPEED1},
//28v
{SIX_ID,KIND3|DIR3|SPEED0},{SIX_ID,KIND3|DIR3|SPEED1},{THREE_ID,KIND0|DIR0|SPEED0},{UNITEC_ID,KIND0|DIR0|SPEED0},
//32
{UNITEC_ID,KIND0|DIR0|SPEED1},{UNITEC_ID,KIND0|DIR0|SPEED2},{UNITEC_ID,KIND0|DIR0|SPEED3},{UNITEC_ID,KIND0|DIR1|SPEED0},
//36
{UNITEC_ID,KIND0|DIR1|SPEED1},{UNITEC_ID,KIND0|DIR2|SPEED0},{UNITEC_ID,KIND0|DIR2|SPEED1},{UNITEC_ID,KIND0|DIR3|SPEED0},
//40
{UNITEC_ID,KIND0|DIR3|SPEED1},{THREE1_ID,KIND0|DIR0|SPEED0},{THREE1_ID,KIND0|DIR0|SPEED1},{THREE1_ID,KIND0|DIR0|SPEED2},
//44 v
{THREE1_ID,KIND0|DIR1|SPEED0},{THREE1_ID,KIND0|DIR1|SPEED1},{SEVEN_ID,KIND0|DIR0|SPEED0},{SEVEN_ID,KIND0|DIR0|SPEED1},
//48 v
{SEVEN_ID,KIND0|DIR0|SPEED2},{SEVEN_ID,KIND0|DIR0|SPEED3},{SEVEN_ID,KIND0|DIR1|SPEED0},{SEVEN_ID,KIND0|DIR1|SPEED1},
//52
{RBASE,KIND2|DIR0|SPEED0},{RBASE,KIND2|DIR0|SPEED1},{RBASE,KIND2|DIR0|SPEED2},{RBASE,KIND2|DIR1|SPEED0},
//56
{RBASE,KIND2|DIR1|SPEED1},{GBASE,KIND2|DIR0|SPEED0},{GBASE,KIND2|DIR0|SPEED1},{GBASE,KIND2|DIR0|SPEED2},
//60
{GBASE,KIND2|DIR1|SPEED0},{GBASE,KIND2|DIR1|SPEED1},{YBASE,KIND2|DIR0|SPEED0},{YBASE,KIND2|DIR0|SPEED1},
//64
{YBASE,KIND2|DIR0|SPEED2},{YBASE,KIND2|DIR1|SPEED0},{YBASE,KIND2|DIR1|SPEED1},{BBASE,KIND2|DIR0|SPEED0},
//68
{BBASE,KIND2|DIR0|SPEED1},{BBASE,KIND2|DIR0|SPEED2},{BBASE,KIND2|DIR1|SPEED0},{BBASE,KIND2|DIR1|SPEED1},
//72
{GBASE,KIND2|DIR0|SPEED0},{GBASE,KIND2|DIR0|SPEED1},{GBASE,KIND2|DIR0|SPEED2},{GBASE,KIND2|DIR1|SPEED0},
//76
{GBASE,KIND2|DIR1|SPEED1},{GBBASE,KIND2|DIR0|SPEED0},{GBBASE,KIND2|DIR0|SPEED1},{GBBASE,KIND2|DIR0|SPEED2},
//80
{GBBASE,KIND2|DIR1|SPEED0},{GBBASE,KIND2|DIR1|SPEED1},{BBASE,KIND2|DIR0|SPEED0},{BBASE,KIND2|DIR0|SPEED1},
//84
{BBASE,KIND2|DIR0|SPEED2},{BBASE,KIND2|DIR1|SPEED0},{BBASE,KIND2|DIR1|SPEED1},{RBASE,KIND2|DIR0|SPEED0},
//88
{RBASE,KIND2|DIR0|SPEED1},{RBASE,KIND2|DIR0|SPEED2},{RBASE,KIND2|DIR1|SPEED0},{RBASE,KIND2|DIR1|SPEED1},
//92
{RBBASE,KIND2|DIR0|SPEED0},{RBBASE,KIND2|DIR0|SPEED1},{RBBASE,KIND2|DIR0|SPEED2},{RBBASE,KIND2|DIR1|SPEED0},
//96
{RBBASE,KIND2|DIR1|SPEED1},{GBASE,KIND2|DIR0|SPEED0},{GBASE,KIND2|DIR0|SPEED1},{GBASE,KIND2|DIR0|SPEED2},
//100
{GBASE,KIND2|DIR1|SPEED0},{GBASE,KIND2|DIR1|SPEED1},{RBASE,KIND2|DIR0|SPEED0},{RBASE,KIND2|DIR0|SPEED1},
//104
{RBASE,KIND2|DIR0|SPEED2},{RBASE,KIND2|DIR1|SPEED0},{RBASE,KIND2|DIR1|SPEED1},{BBASE,KIND2|DIR0|SPEED0},
//108
{BBASE,KIND2|DIR0|SPEED1},{BBASE,KIND2|DIR0|SPEED2},{BBASE,KIND2|DIR1|SPEED0},{BBASE,KIND2|DIR1|SPEED1}
};
#define SIZE 20
unsigned char SPI_rx_buff[SIZE];
unsigned char SPI_tx_buff[SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsigned char tx_wr_index,tx_rd_index,tx_counter;
char DispBuffer[6];
const char CharFont[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xc7,0x8c,0xa1};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f - L P d
long val;
unsigned char KeyCode;
void Display(void);
void Display_Fast(void);
char PressKeyProcess(void);
void spi_init(void);
void putSPIchar(char c);
unsigned char getSPIchar(void);
void spi_stc_isr(void);
void WatchDog(char tim);
unsigned char SendKindData(char kind);
void EepromICnumberWr(void);
void EepromICnumberRd(void);
void FactorySetup(void);
void EepromViewModeWr(void);
void EepromViewModeRd(void);
void EepromPasswordRd(void);
void EepromPasswordWr(void);
void EepromDateValueRd(void);
void EepromDateValueWr(void);
void EepromDayDataRd(void);
void EepromDayDataWr(void);
int CompareDate(void);
int CalMonthDay(uchar month,uchar day);
uchar ProcessEdgeToMiddle(char data,uchar mode,uchar BC,uchar class);
uchar ProcessMiddleToEdge(char data,uchar mode,uchar BC,uchar class );
void AllClearICBuffer(void);
void DelayNs(char tim);
uchar SendFirstToEnd(uchar kind,uchar mode,uchar si_flag,uchar ss_flag);
char SpeedDelay(uchar speed);
void AllStarRight(uchar da1,uchar da2,uchar da3,uchar da4,uint init);
uchar AllStarMiddleToEdge(uchar da1,uchar da2,uchar da3,uchar da4,uchar mode);
void timer0_init(void) ;
void Enable_Time0_Interrupt(void);
void Disable_Time0_Interrupt(void);
void FullProcess(uchar fullflag,uchar looplenght,uchar *data);
void Delay(char tim)
{
unsigned char i,j;
for(j=0;j<tim;j++)
{
for(i=200;i>0;i--)
{
asm("nop");
asm("nop");
asm("nop");
}
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
}
void DelayNs(char tim)
{
unsigned char j;
for(j=0;j<tim;j++)
{
asm("nop");
asm("nop");
asm("nop");
}
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
void SendSS(uchar loop )
{
if(loop==0) return;
PORTB |= 0x10; //SS output high 电平
DelayNs(20);
PORTB &=(~0x10); //SS output low 电平
}
void SendSI(uchar loop)
{
uchar i;
if(loop==0) return;
for(i=0;i<loop;i++)
{
PORTB |= 0x08; //S_I output high 电平
Display_Fast();
PORTB &=(~0x08); //S_I output low 电平
Display_Fast();
}
}
uint hmod(uint source,uint dest)
{
uchar i,src;
src=source;
if(src<dest) return src;
for(i=0;i<source;i++)
{
src=src-dest;
if(src<dest) break;
}
return src;
}
void Send_Data(uchar dat,uchar loop )
{
uchar i;
for(i=0;i<loop;i++)
{
putSPIchar(dat);
DelayNs(50);
}
}
void PasswordCannel(void)
{
PasswordData[0]=PASS_DISABLE;
PasswordData[1]=PASS_DISABLE;
PasswordData[2]=PASS_DISABLE;
PasswordData[3]=PASS_DISABLE;
PasswordData[4]=PASS_DISABLE;
PasswordData[5]=0x00;
Password_alarm=FALSE;
Password_Enable=FALSE;
}
//mega16 7.3728MHz石英晶体 iccavr6.31a
/*
去掉电池:
year/mon/day =00/01/01
hour/min/second=00/00/00
去掉芯片:
year/mon/day =ff/1f/3f
hour/min/second=3f/7f/7f
重新扦入芯片,永远为:
year/mon/day =00/01/01
hour/min/second=00/00/00
*/
//相关定义:
#define DS1302_RST 2 //pd2
#define DS1302_SDA 0 //pd0
#define DS1302_SCLK 1 //pd1
//ds1302相关
//DS1302_RST=1
#define Set_DS1302_RST() PORTD|=1<<DS1302_RST
//DS1302_RST=0
#define Clr_DS1302_RST() PORTD&=~(1<<DS1302_RST)
//DS1302_SDA=1
#define Set_DS1302_SDA() PORTD|=1<<DS1302_SDA
//DS1302_SDA=0
#define Clr_DS1302_SDA() PORTD&=~(1<<DS1302_SDA)
//DS1302_SCLK=1
#define Set_DS1302_SCLK() PORTD|=1<<DS1302_SCLK
//DS1302_SCLK=0
#define Clr_DS1302_SCLK() PORTD&=~(1<<DS1302_SCLK)
//DS1302的SDA置为输出脚
#define Set_DS1302_DDRSDA() DDRD|=1<<DS1302_SDA
//DS1302的SDA置为输入脚
#define Clr_DS1302_DDRSDA() DDRD&=~(1<<DS1302_SDA)
#define DS1302_SEC_Reg 0x80
#define DS1302_MIN_Reg 0x82
#define DS1302_HR_Reg 0x84
#define DS1302_DATE_Reg 0x86
#define DS1302_MONTH_Reg 0x88
#define DS1302_DAY_Reg 0x8a
#define DS1302_YEAR_Reg 0x8c
#define DS1302_CONTROL_Reg 0x8e
#define DS1302_CHARGER_Reg 0x90
#define DS1302_CLKBURST_Reg 0xbe
//全局变量
//为了方便,我把个位和十位分开了
uchar year1=0x88;
uchar year0=0x88;
uchar month1=0x88;
uchar month0=0x88;
uchar date0=0x88;
uchar date1=0x88;
uchar day=0x88;
uchar hour1=0x88;
uchar hour0=0x88;
uchar minute1=0x88;
uchar minute0=0x88;
uchar second1=0x88;
uchar second0=0x88;
void DS1302_Init(void);
uchar Check_DS1302(void);
uchar DS1302_Read(uchar reg);
void DS1302_Write(uchar reg,uchar data);
void ReadTime(void);
//////////////////////////////////////////////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff;//PORTA0-PORTA7 ==> OUTPUT CHAR DATA
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0xc3;//PORTC7,PORTC6,PORTC1,PORTC0 ==> key input ,enable_up
DDRC = 0x00;//PC7,PC6,PC1,PC0 ==> PRESS KEY INPUT ; PC2PC3PC4PC5 ==>JTAG USE
PORTD = 0xf8;//PORTD3-PORTD7 ==> LED CS ,enable_up ;
DDRD = 0xff;//PD3,PD4,PD5,PD6,PD7 ==>LED CS USE ;PD2,PD1,PD0 OUTPUT DS1302 USE
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
// CLI(); //disable all interrupts
port_init();
spi_init(); //初始化SPI接口
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
// SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void PasswordProcess(void)
{
int val;
EepromDayDataRd();
if(DayData[0]==0)
{
Password_alarm=TRUE;
}
else
{
ReadTime();
EepromDateValueRd();
// if((year0==0 && year1==0 &&month1==0 &&month0==1 &&date1==0&&date0==1)||(year0==0xf && year1==0xf &&month1==0x1 &&month0==0xf &&date1==0x3&&date0==0xf))
if((year1==0 && month1==0 && date1==0)||(year1==0xa5 && month1==0x1f && date1==0x3f)) //070616 modify
{
Password_alarm=TRUE;
}
else
{
val=CompareDate();
if((val==-1) ||( val > DayData[0])) Password_alarm=TRUE;
else
{
if(val!=Oneday)
{
Oneday=val;
DayData[0]=DayData[0]-val;
EepromDayDataWr();
}
Password_alarm=FALSE;
}
}
}
}
void main(void)
{
char bit,i=0,kind=0;
uint loop=0,KK=0,pwloop=0;
uchar tempPW[PASSWORDLENGHT];
val=0;
KeyCode=0;
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
DispBuffer[2]=CharFont[0];
DispBuffer[3]=CharFont[0];
DispBuffer[4]=CharFont[0];
DispBuffer[5]=0x00;
SI_Count=0;
CLI(); //关中断
init_devices();
// timer0_init();
// FactorySetup();
ModeStatus=MODE_NOMALE;
CurrentKey=KEY_FUNCTION;
BackKey=KEY_FUNCTION;
CurrentKind=KIND0;
K1Count=0;
val_kind=0;
Password_alarm=FALSE;
EepromDateValueRd();
#ifdef VERSION_CONTROL
if(DateValue[0]==0xff && DateValue[1]==0xff && DateValue[2]==0xff && DateValue[3]==0xff ) //070617 mask
#endif
{
FactorySetup();
val_lenght=MINVAL_LENGHT;
EepromICnumberWr();
EepromViewModeWr();
DS1302_Init();
EepromDateValueWr();
EepromDayDataWr();
PasswordCannel();
}
EepromICnumberRd();
EepromViewModeRd();
for(i=MAXVAL_KIND-1;i>=0;i--)
{
if(KindData[i]!=0)
{
i=i+1;
break;
}
}
val_kind=i;
EepromPasswordRd();
if(Password_Enable==TRUE)
{
PasswordProcess();
}
SEI(); //开中断
#ifdef VERSION_CONTROL
WatchDog(7);
#endif
while(1)
{ if(KeyCode==0) KeyCode=PressKeyProcess();
if(KeyCode!=0){
switch(KeyCode)
{
case KEY_UP://k2
if(ModeStatus==MODE_LENGHT)
{
if(val_lenght<MAXVAL_LENGHT)
val_lenght++;
K1Count=5;
}
else if(ModeStatus==MODE_KIND)
{
if(val_kind<MAXVAL_KIND)
{
KindData[val_kind]=TRUE;
val_kind++;
}
else val_kind=0;
}
else if(ModeStatus==MODE_PASSWORD)
{
if(PassDate_flag==PASSWORD_SETUP)
{
if(KK<MAXNUMBER) KK++;
}
else
{
if(KK<MAXDATE) KK++;
}
K1Count=0;
//K4Count=0;
}
break;
case KEY_DOWN://k3
// DS1302_Init();
// ReadTime();
if(ModeStatus==MODE_LENGHT)
{
if(val_lenght>MINVAL_LENGHT)
val_lenght--;
K1Count=5;
}
else if(ModeStatus==MODE_KIND)
{
if(val_kind<MAXVAL_KIND)
{
KindData[val_kind]=FALSE;
val_kind++;
}
else val_kind=0;
}
else if(ModeStatus==MODE_PASSWORD)
{
if(KK>0) KK--;
K1Count=0;
// K4Count=0;
}
break;
case KEY_FUNCTION://k1
BackKey=CurrentKey;
CurrentKey=KEY_FUNCTION;
K1Count++;
switch(ModeStatus)
{
case MODE_NOMALE:
ModeStatus=MODE_LENGHT;
break;
case MODE_LENGHT:
if(K1Count==2)
{
ModeStatus=MODE_KIND;
}
else if(K1Count==7) //base 5
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
EepromICnumberWr();
}
break;
case MODE_KIND:
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
EepromViewModeWr();
break;
case MODE_PASSWORD:
if(PassDate_flag==INVALE_SETUP || PassDate_flag==DATE_SETUP)
{
PassDate_flag=DATE_SETUP;
if(K1Count==2)
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
DayData[0]=KK;
DayData[1]=0x00;
EepromDayDataWr();
}
}
break;
default:
break;
}
break;
case KEY_K4: //k4
if(ModeStatus==MODE_PASSWORD)
{
if(PassDate_flag==INVALE_SETUP || PassDate_flag==PASSWORD_SETUP){
PassDate_flag=PASSWORD_SETUP;
// if(KK==0 && K4Count>0)
if(K4Count>5)
{
if(Password_Enable==FALSE)
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
EepromPasswordWr();
Password_Enable=TRUE;
break;
}
else
{
if(tempPW[0]==PasswordData[0] &&tempPW[1]==PasswordData[1]&&tempPW[2]==PasswordData[2]&&tempPW[3]==PasswordData[3]&&tempPW[4]==PasswordData[4])
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=PASSWORD_SETUP;
PwModify_flag=TRUE;
K1Count=0;
K4Count=0;
KK=0;
break;
}
else
{
if(PwModify_flag==3)
{
EepromPasswordWr();
}
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
break;
}
}
}
K4Count++;
switch(K4Count)
{
case 2: //byte1
PasswordData[0]=KK;
break;
case 3: //byte2
PasswordData[1]=KK;
break;
case 4: //byte3
PasswordData[2]=KK;
break;
case 5: //byte4
PasswordData[3]=KK;
break;
case 6: //byte5
PasswordData[4]=KK;
break;
default:
break;
}
// if(Password_Enable==TRUE && PwModify_flag>=TRUE)
if(Password_Enable==TRUE && PwModify_flag==TRUE) //070616 modify
{
if(K4Count==2 && PasswordData[0]==0x3)
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=PASSWORD_SETUP;
PwModify_flag=3;
K1Count=0;
K4Count=0;
KK=0;
}
else if(K4Count==2 && PasswordData[0]==0x8)
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=DATE_SETUP;
K1Count=0;
K4Count=0;
KK=0;
}
else if(K4Count==3 && PasswordData[0]==38&& PasswordData[1]==83)
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
PasswordCannel();
break;
}
}
KK=0;
}
}
break;
case KEY_K1K4RST://k1k4
FactorySetup();
EepromICnumberWr();
EepromViewModeWr();
WatchDog(0);
while(1);
break;
case KEY_K3K4RST: //k3k4
EepromPasswordRd();
PwModify_flag=FALSE;
if(Password_Enable==FALSE)
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=INVALE_SETUP;
K1Count=0;
K4Count=0;
KK=0;
}
else
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=PASSWORD_SETUP;
K1Count=0;
K4Count=0;
for(i=0;i<PASSWORDLENGHT;i++)
tempPW[i]=PasswordData[i];
KK=0;
}
break;
default:
break;
}
KeyCode=0;
if(ModeStatus==MODE_LENGHT)
{
DispBuffer[0]=CharFont[17];
loop=val_lenght;
bit=loop/1000;
DispBuffer[1]=CharFont[bit];
loop=loop-bit *1000;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
BLenghtCount=val_lenght;
}
else if(ModeStatus==MODE_KIND)
{
DispBuffer[0]=CharFont[0];
loop=val_kind;
DispBuffer[1]=CharFont[16];
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
else if(ModeStatus==MODE_PASSWORD)
{
if(PassDate_flag==PASSWORD_SETUP)
{
DispBuffer[0]=CharFont[18];
DispBuffer[2]=CharFont[0];
switch(K4Count)
{
case 1: //byte1
DispBuffer[1]=CharFont[1];
break;
case 2: //byte2
DispBuffer[1]=CharFont[2];
break;
case 3: //byte3
DispBuffer[1]=CharFont[3];
break;
case 4: //byte4
DispBuffer[1]=CharFont[4];
break;
case 5: //byte5
DispBuffer[1]=CharFont[5];
break;
default:
if(PwModify_flag==TRUE) //070616 modify
DispBuffer[1]=CharFont[18];
else if(PwModify_flag==3)//070616 modify
DispBuffer[1]=CharFont[16];
else
DispBuffer[1]=CharFont[6];
break;
}
loop=KK;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
else if(PassDate_flag==DATE_SETUP)
{
DispBuffer[0]=CharFont[19];
DispBuffer[1]=CharFont[19];
loop=KK;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
else
{
DispBuffer[0]=CharFont[18];
DispBuffer[1]=CharFont[19];
loop=KK;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
}
else
{
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
DispBuffer[2]=CharFont[0];
DispBuffer[3]=CharFont[0];
DispBuffer[4]=CharFont[0];
}
DispBuffer[5]=0x00;
}
if(ModeStatus==MODE_NOMALE)
{
if(Password_alarm==FALSE)
{
if(KindData[kind]==TRUE)
{
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
loop=kind;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
Display();
SendKindData(kind);
/* for(i=1;i<val_lenght;i++)
{
if(SendKindData(0x0 | 0x80)==1) break;
}
*/
}
kind++;
if(kind>=MAXVAL_KIND)
kind=0;
}
else
{
kind=0;
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
loop=kind;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
Display();
SendKindData(kind);
}
}
/*
KK++;
if(KK>1500)
{KK=0;
ReadTime();
DispBuffer[0]=CharFont[hour1];
DispBuffer[1]=CharFont[hour0];
DispBuffer[2]=CharFont[minute1];
DispBuffer[3]=CharFont[minute0];
DispBuffer[4]=CharFont[second0];
}
*/
Display();
if(pwloop>100)
{
pwloop=0;
if(Password_Enable==TRUE)
{
PasswordProcess();
}
}
else pwloop++;
}
}
void Display(void)
{
PORTD=0xf7;
PORTA=DispBuffer[0];
Delay(10);
PORTD=0xef;
PORTA=DispBuffer[1];
Delay(10);
PORTD=0xdf;
PORTA=DispBuffer[2];
Delay(10);
PORTD=0xbf;
PORTA=DispBuffer[3];
Delay(10);
PORTD=0x7f;
PORTA=DispBuffer[4];
Delay(10);
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
void Display_Fast(void)
{
PORTD=0xf7;
PORTA=DispBuffer[0];
Delay(1);
PORTD=0xef;
PORTA=DispBuffer[1];
Delay(1);
PORTD=0xdf;
PORTA=DispBuffer[2];
Delay(1);
PORTD=0xbf;
PORTA=DispBuffer[3];
Delay(1);
PORTD=0x7f;
PORTA=DispBuffer[4];
Delay(1);
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
char PressKeyProcess(void)
{
char temp1,temp2;
temp1=PINC;
temp1 &=0xc3;//get pc0,pc1,pc6,pc7
if(temp1==0xc3)return 0;
Display();
Delay(50);
Display();
Delay(50);
Display();
Delay(50);
//
temp2=PINC;
temp2 &=0xc3;//get pc0,pc1,pc6,pc7
if(temp2==0xc3)return 0;
Display();
Delay(50);
Display();
Delay(50);
//
temp1=PINC;
temp1 &=0xc3;//get pc0,pc1,pc6,pc7
temp2 &=temp1;
if(temp2==0xc3)return 0;
if(temp2==KEY_K1K4RST ||temp2==KEY_K3K4RST )
{
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
return temp2;
}
Display();
Delay(50);
Display();
Delay(50);
return temp2;
}
//#pragma interrupt_handler spi_stc_isr:18 //atmega128 ,SPI_vecter
#pragma interrupt_handler spi_stc_isr:11
//spi_stc_isr:11 ;atmega16 ,SPI_vecter
void spi_stc_isr(void)
{
SPI_rx_buff[0] = SPDR; //从ISP口读出收到的字节
}
unsigned char getSPIchar(void)
{
unsigned char data;
return 0;
while (rx_counter == 0); //无接收数据,等待
data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据
if (++rx_rd_index == SIZE) rx_rd_index = 0; //调整指针
CLI();
--rx_counter;
SEI();
return data;
}
void putSPIchar(char c)
{
CLI();
SPDR = c; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
SEI();
}
void spi_init(void)
{
unsigned char temp;
// DDRB |= 0x10; //SS = output
DDRB = (1<<7)|(1<<5)|(1<<4)|(1<<3); //SS = output ,PB3 ==>output S_I use
PORTB = 0x00; //SS 平时为low 电平
// SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
SPCR = 0x55; //SPI允许,主机模式,MSB,disable SPI中断,极性方式01,1/16系统时钟速率
SPSR = 0x00;
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
PORTB &=(~0x10); //SS output low 电平
PORTB &=(~0x08); //S_I output low 电平
}
void WatchDog(char tim)
{
/* WDT 复位*/
_WDR();
/* 置位 WDTOE 和 WDE*/
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* run WDT 16.3ms*/
WDTCR = (1<<WDE) |(tim);
}
void WDT_off(void)
{
/* WDT 复位*/
_WDR();
/* 置位 WDTOE 和 WDE*/
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* 关闭WDT */
WDTCR = 0x00;
}
char SpeedDelay(uchar speed)
{
uchar tim,i;
switch(speed)
{
case SPEED1:
tim=10;//6;
break;
case SPEED2:
tim=15;//9;
break;
case SPEED3:
tim=20;//12;
break;
case SPEED0:
default:
tim=5;//3;
break;
}
for(i=0;i<tim;i++)
{
Display_Fast();
KeyCode=PressKeyProcess();
if(KeyCode!=0) return 1 ;
Display_Fast();
}
return 0;
}
uchar SendFirstToEnd(uchar kind,uchar mode,uchar si_flag,uchar ss_flag)
{
uchar tim,i;
Send_Data(kind,2);
SendSS(ss_flag);
SendSI(si_flag);
if(SpeedDelay(mode & 0x03)) return 1;
else
return 0;
}
char SendEndToFirst(uchar kind,uchar mode,uchar BC,uchar si_flag,uchar ss_flag)
{
uchar tim,i;
for(i=0;i<FLenghtCount;i++)
{
Send_Data(BC,2);
}
Send_Data(kind,2);
for(i=i+1;i<BLenghtCount;i++)
{
Send_Data(BC,2);
}
SendSS(ss_flag);
SendSI(si_flag);
if(SpeedDelay(mode & 0x03)) return 1;
else return 0;
}
void AllColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght ;tim++)
{
Send_Data(value,2);
// if(SendFirstToEnd(value,mode & 0x0f,0,0)==1) return;
}
SendSS(1);
Display();
Display();
Display();
Display();
Display();
for(tim=0;tim<128;tim ++)
{
SendSI(1);
Delay(1);
if(SpeedDelay(0x0)) return ;
}
}
}
}
void Three1ColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
SendFirstToEnd(value,mode & 0x0f,CLASSNUMBER,1);
for(tim=1;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(UNLOCKDATA,mode & 0x0f,CLASSNUMBER,1)==1) return;
}
}
}
}
void Three1ColorProcess_1(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
FLenghtCount=0;
SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1);
for(tim=1;tim<val_lenght;tim++)
{
FLenghtCount++;
if(SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1)==1) return;
}
}
}
}
void ThreeColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght ;tim++)
{
// if(SendFirstToEnd(value, 0,0,0)==1) return;
Send_Data(value,2);
}
SendSS(1);
Display();
Display();
Display();
Display();
Display();
// for(tim=0;tim<200;tim +=2) //20070715 modify
for(tim=0;tim<128;tim ++)
{
// SendSI(2);//20070715 modify
SendSI(1);
Delay(1);
// if(tim==127) break ;
if(SpeedDelay(0)) return ;
}
}
}
}
uchar UniteColor(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uchar mode)
{
uchar tim,i=0;//,mode;
uchar loop1=16,loop2=70;
for(i=0;i<val_lenght;i++)
{
Send_Data(da1,2);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
Send_Data(da2,2);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
Send_Data(da3,2);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
Send_Data(da4,2);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
Send_Data(da5,2);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
Send_Data(da6,2);
SendSS(1);
SendSI(loop1);
if(SpeedDelay(mode & 0x03)==1) return 1;
}
// if(SpeedDelay(mode & 0x03)==1) return 1;
return 0;
}
void UniteColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// GetMiddleColor(value);
if(UniteColor( value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,mode)==1) return;
}
}
}
void UniteColorRight(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uint init)
{
// uchar tim;//,i;
uchar loop1=16,loop2=70;
uint val1=0x00,i;
if(FLenghtCount!=0)
{
val1=hmod(FLenghtCount,6);
switch(val1)
{
case 5:
Send_Data(da5,2);
case 4:
Send_Data(da4,2);
case 3:
Send_Data(da3,2);
case 2:
Send_Data(da2,2);
case 1:
Send_Data(da1,2);
break;
default:
break;
}
if(FLenghtCount>val1)
{
i=val1;
for(;i<FLenghtCount;i+=6)
{
Send_Data(da6,2);
Send_Data(da5,2);
Send_Data(da4,2);
Send_Data(da3,2);
Send_Data(da2,2);
if(BLenghtCount==0 && (i+6)>=FLenghtCount)break;
else
{
Send_Data(da1,2);
}
}
}
}
i=init;
for(;i<BLenghtCount;i++)
{
Send_Data(UNLOCKDATA,2);
}
}
void UniteColorProcess_1(uchar kind,uchar mode)
{
uchar i,value,j;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// GetMiddleColor(value);
FLenghtCount=0;
BLenghtCount=val_lenght;
for(j=0;j<val_lenght;j++)
{
FLenghtCount++;
UniteColorRight(value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,FLenghtCount);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return;;
}
}
}
}
void UniteColorLeft(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uint loop)
{
uint tim,i;//,mode;
// uchar loop1=16,loop2=70;
if(loop>6)
{
// tim=loop;
for(;loop>=6;loop-=6)
{
Send_Data(da1,2);
Send_Data(da2,2);
Send_Data(da3,2);
Send_Data(da4,2);
Send_Data(da5,2);
Send_Data(da6,2);
}
}
i=0;
if(i<loop){
Send_Data(da1,2);
}
if(i+1<loop){
Send_Data(da2,2);
}
if(i+2<loop){
Send_Data(da3,2);
}
if(i+3<loop){
Send_Data(da4,2);
}
if(i+4<loop){
Send_Data(da5,2);
}
if(i+5<loop){
Send_Data(da6,2);
}
}
uchar UniteColorMiddleToEdge(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uchar mode)
{
uint tim,i,diff,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght/2;
FLenghtCount=1;
BLenghtCount=HalfLenght+1;
Send_Data(da1,2);
for(i=1;i<BLenghtCount;i++)
{
Send_Data(UNLOCKDATA,2);
}
SendSS(1);
/// if(SpeedDelay(mode & 0x03)) return 1;
for(i=1;i<BLenghtCount;i++)
{
UniteColorLeft(da1, da2, da3, da4,da5,da6,i);
FLenghtCount++;
UniteColorRight(da1, da2, da3, da4,da5,da6,FLenghtCount);
SendSS(1);
SendSI(16);
}
// if(SpeedDelay(mode & 0x03)) return 1;
return 0;
}
//从中间向两边。
void UniteColorProcess_2(uchar kind,uchar mode)
{
uchar i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
if(UniteColorMiddleToEdge(value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,mode)==1) break;
}
if(SpeedDelay(mode & 0x03)) return;
}
}
uchar UniteColorEdgeToMiddle(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uchar mode)
{
uint tim,i,diff,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght/2;
FLenghtCount=1;
BLenghtCount=val_lenght-2;
for(i=1;i<=HalfLenght;i++)
{
UniteColorRight(da1, da2, da3, da4,da5,da6,0);
FLenghtCount++;
UniteColorLeft(da1, da2, da3, da4,da5,da6,i);
SendSS(1);
SendSI(16);
if(BLenghtCount==1)
{
BLenghtCount=0;
UniteColorRight(da1, da2, da3, da4,da5,da6,0);
UniteColorLeft(da1, da2, da3, da4,da5,da6,i+1);
SendSS(1);
SendSI(16);
// if(SpeedDelay(mode & 0x03)) return 1;
return 0;
}
else
BLenghtCount-=2;
}
// if(SpeedDelay(mode & 0x03)) return 1;
return 0;
}
//从两边向中间.
void UniteColorProcess_3(uchar kind,uchar mode)
{
uchar i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
if(UniteColorEdgeToMiddle(value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,mode)==1) break;
}
if(SpeedDelay(mode & 0x03)) return ;
}
}
void AllStarProcess(uchar kind,uchar mode,uchar class,uchar ic_count)
{
uchar tim,i,value,k,j;
// uchar tim,i=0;//,mode;
// uchar loop1=16,loop2=120;
k=0;
for(i=0;i<val_lenght;)
{
value=KindGroudData[kind][k];
if(value==0x00)
{
k=0;
value=KindGroudData[kind][k];
}
// GetMiddleColor_all(value);
k++;
putSPIchar(value);
DelayNs(50);
SendSS(1);
SendSI(class);
putSPIchar(UNLOCKDATA);
DelayNs(50);
SendSS(1);
i=i+1;
if(i>val_lenght)return;
for(j=0;j<ic_count;j++)
{
SendSI(class);
putSPIchar(UNLOCKDATA);
DelayNs(50);
SendSS(1);
SendSI(class);
putSPIchar(UNLOCKDATA);
DelayNs(50);
SendSS(1);
i=i+1;
if(i>val_lenght)return;
}
if(SpeedDelay(mode & 0x03)==1) return ;
// i=i+1;
}
}
//从中间向两边。
void AllStarProcess_2(uchar kind,uchar mode,uchar cclass,uchar ic_count)
{
uchar tim,value,k,j;
uchar level;
uchar data[6],data1[6],fullflag,looplenght;
uint newlenght,jj,i;
uchar one_l,two_l,three_l,four_l,five_l,six_l;
uchar one,two,three,four,five,six;
//芯片数为双数, 为单数
HalfLenght=val_lenght;
// FLenghtCount=0;
newlenght=val_lenght;
BLenghtCount=newlenght;
data[0] =KindGroudData[kind][0];
data[1] =KindGroudData[kind][1];
data[2] =KindGroudData[kind][2];
data[3] =KindGroudData[kind][3];
data[4] =KindGroudData[kind][4];
data[5] =KindGroudData[kind][5];
data1[0] =KindGroudData[kind][5];
data1[1] =KindGroudData[kind][4];
data1[2] =KindGroudData[kind][3];
data1[3] =KindGroudData[kind][2];
data1[4] =KindGroudData[kind][1];
data1[5] =KindGroudData[kind][0];
k=0;
level=0;
one=0;two=0;three=0;four=0;five=0;six=0;
one_l=0; two_l=0; three_l=0;four_l=0;five_l=0; six_l=0;
fullflag=0;
looplenght=2*ic_count;
i=0;
for(i=0;i<newlenght;)
{
for(k=0;k<looplenght;k++){
////////////////////////////////////////
if(fullflag)
{
FullProcess(fullflag,looplenght,data);
}
if(one<looplenght)
one++;
Send_Data(data[0],1);
for(j=1;j<one;j++)
{
Send_Data(UNLOCKDATA,1);
}
if(level>=1)
{
if(two<looplenght)
two++;
Send_Data(data[1],1);
for(j=1;j<two;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=2)
{
if(three<looplenght)
three++;
Send_Data(data[2],1);
for(j=1;j<three;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=3)
{
if(four<looplenght)
four++;
Send_Data(data[3],1);
for(j=1;j<four;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=4)
{
if(five<looplenght)
five++;
Send_Data(data[4],1);
for(j=1;j<five;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=5)
{
if(six<looplenght)
six++;
Send_Data(data[5],1);
for(j=1;j<six;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
////////////////////////////////////////
switch(level)
{
case 5:
if(six_l<looplenght)
six_l++;
for(j=1;j<six_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[5],1);
case 4:
if(five_l<looplenght)
five_l++;
for(j=1;j<five_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[4],1);
case 3:
if(four_l<looplenght)
four_l++;
for(j=1;j<four_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[3],1);
case 2:
if(three_l<looplenght)
three_l++;
for(j=1;j<three_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[2],1);
case 1:
if(two_l<looplenght)
two_l++;
for(j=1;j<two_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[1],1);
case 0:
default:
if(one_l<looplenght)
one_l++;
for(j=1;j<one_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[0],1);
if(fullflag)
{
FullProcess(fullflag,looplenght,data1);
}
jj=one_l+two_l+three_l+four_l+five_l+six_l+fullflag *60;
i=jj;
for(;jj<BLenghtCount;jj++)
{
Send_Data(UNLOCKDATA,1);
}
SendSS(1);
SendSI(cclass);
if(i>=newlenght)return;
break;
}
}
level++;
if(level>5)
{
level=0;
fullflag++;
one=0;two=0;three=0;four=0;five=0;six=0;
one_l=0; two_l=0; three_l=0;four_l=0;five_l=0; six_l=0;
}
if(SpeedDelay(mode & 0x03)==1) return ;
}
}
//从两边向中间。
void AllStarProcess_3(uchar kind,uchar mode,uchar cclass,uchar ic_count)
{
uchar tim,value,k,j;
uchar level;
uchar data[6],data1[6],fullflag,looplenght;
uint newlenght,jj,i;
uchar one_l,two_l,three_l,four_l,five_l,six_l;
uchar one,two,three,four,five,six;
//芯片数为双数, 为单数
HalfLenght=val_lenght;
FLenghtCount=val_lenght;
newlenght=val_lenght;
BLenghtCount=newlenght;
data[0] =KindGroudData[kind][0];
data[1] =KindGroudData[kind][1];
data[2] =KindGroudData[kind][2];
data[3] =KindGroudData[kind][3];
data[4] =KindGroudData[kind][4];
data[5] =KindGroudData[kind][5];
data1[0] =KindGroudData[kind][5];
data1[1] =KindGroudData[kind][4];
data1[2] =KindGroudData[kind][3];
data1[3] =KindGroudData[kind][2];
data1[4] =KindGroudData[kind][1];
data1[5] =KindGroudData[kind][0];
k=0;
level=0;
one=0;two=0;three=0;four=0;five=0;six=0;
one_l=0; two_l=0; three_l=0;four_l=0;five_l=0; six_l=0;
fullflag=0;
looplenght=2*ic_count;
i=0;
for(i=0;i<newlenght;)
{
for(k=0;k<looplenght;k++){
switch(level)
{
case 5:
if(six_l<looplenght)
six_l++;
for(j=1;j<six_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[5],1);
case 4:
if(five_l<looplenght)
five_l++;
for(j=1;j<five_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[4],1);
case 3:
if(four_l<looplenght)
four_l++;
for(j=1;j<four_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[3],1);
case 2:
if(three_l<looplenght)
three_l++;
for(j=1;j<three_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[2],1);
case 1:
if(two_l<looplenght)
two_l++;
for(j=1;j<two_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[1],1);
case 0:
default:
if(one_l<looplenght)
one_l++;
for(j=1;j<one_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[0],1);
if(fullflag)
{
FullProcess(fullflag,looplenght,data1);
}
jj=one_l+two_l+three_l+four_l+five_l+six_l+fullflag *60;
i=jj;
for(;jj<BLenghtCount;jj++)
{
Send_Data(UNLOCKDATA,1);
}
////////////////////////////////////////
FLenghtCount--;
Send_Data(UNLOCKDATA,FLenghtCount);
if(fullflag)
{
FullProcess(fullflag,looplenght,data);
}
if(one<looplenght)
one++;
Send_Data(data[0],1);
for(j=1;j<one;j++)
{
Send_Data(UNLOCKDATA,1);
}
if(level>=1)
{
if(two<looplenght)
two++;
Send_Data(data[1],1);
for(j=1;j<two;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=2)
{
if(three<looplenght)
three++;
Send_Data(data[2],1);
for(j=1;j<three;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=3)
{
if(four<looplenght)
four++;
Send_Data(data[3],1);
for(j=1;j<four;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=4)
{
if(five<looplenght)
five++;
Send_Data(data[4],1);
for(j=1;j<five;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
if(level>=5)
{
if(six<looplenght)
six++;
Send_Data(data[5],1);
for(j=1;j<six;j++)
{
Send_Data(UNLOCKDATA,1);
}
}
////////////////////////////////////////
SendSS(1);
SendSI(cclass);
if(i>=newlenght)return;
break;
}
}
level++;
if(level>5)
{
level=0;
fullflag++;
one=0;two=0;three=0;four=0;five=0;six=0;
one_l=0; two_l=0; three_l=0;four_l=0;five_l=0; six_l=0;
}
if(SpeedDelay(mode & 0x03)==1) return ;
}
}
void FullProcess(uchar fullflag,uchar looplenght,uchar *data)
{
uchar i,j,l;
for(l=0;l<fullflag;l++)
{
for(i=0;i<6;i++)
{
for(j=1;j<looplenght;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[i],1);
}
}
}
void SevenColorProcess_1(uchar kind,uchar mode,uchar cclass,uchar ic_count)
{
uchar k,j,level;
uchar data[6],data1[6],fullflag,looplenght;
uint newlenght,jj,i;
uchar two_l,three_l,four_l,five_l,six_l;
newlenght=2*val_lenght;
data[0] =KindGroudData[kind][0];
data[1] =KindGroudData[kind][1];
data[2] =KindGroudData[kind][2];
data[3] =KindGroudData[kind][3];
data[4] =KindGroudData[kind][4];
data[5] =KindGroudData[kind][5];
data1[0] =KindGroudData[kind][5];
data1[1] =KindGroudData[kind][4];
data1[2] =KindGroudData[kind][3];
data1[3] =KindGroudData[kind][2];
data1[4] =KindGroudData[kind][1];
data1[5] =KindGroudData[kind][0];
k=0;
level=0;
FLenghtCount=0;
two_l=0;
three_l=0;
four_l=0;
five_l=0;
six_l=0;
BLenghtCount=newlenght;
fullflag=0;
looplenght=2*ic_count;
i=0;
for(i=0;i<newlenght;)
{
for(k=0;k<looplenght;k++){
switch(level)
{
case 5:
if(six_l<looplenght)
six_l++;
for(j=1;j<six_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[5],1);
case 4:
if(five_l<looplenght)
five_l++;
for(j=1;j<five_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[4],1);
case 3:
if(four_l<looplenght)
four_l++;
for(j=1;j<four_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[3],1);
case 2:
if(three_l<looplenght)
three_l++;
for(j=1;j<three_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[2],1);
case 1:
if(two_l<looplenght)
two_l++;
for(j=1;j<two_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[1],1);
case 0:
default:
if(FLenghtCount<looplenght)
FLenghtCount++;
for(j=1;j<FLenghtCount;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data[0],1);
if(fullflag)
{
FullProcess(fullflag,looplenght,data1);
}
jj=FLenghtCount+two_l+three_l+four_l+five_l+six_l+fullflag *60;
i=jj;
for(;jj<BLenghtCount;jj++)
{
Send_Data(UNLOCKDATA,1);
}
SendSS(1);
SendSI(cclass);
if(i>=newlenght)return;
break;
}
}
level++;
if(level>5)
{
level=0;
fullflag++;
FLenghtCount=0;
two_l=0;
three_l=0;
four_l=0;
five_l=0;
six_l=0;
}
if(SpeedDelay(mode & 0x03)==1) return ;
}
}
void SixColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(value,mode & 0x0f,0,1)==1) return;
}
}
}
}
void SixColorProcess_1(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
FLenghtCount=0;
// SendEndToFirst(value,mode & 0x0f,ALLBLACK);
SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1);
for(tim=1;tim<val_lenght;tim++)
{
FLenghtCount++;
// if(SendEndToFirst(value,mode & 0x0f,ALLBLACK)==1) break;
if(SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1)==1) return;
}
}
}
}
void SixColorProcess_2(uchar kind,uchar mode,uchar class)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// for(tim=0;tim<val_lenght;tim++)
{
if(ProcessMiddleToEdge(value,mode,UNLOCKDATA,class)==1) return;
}
}
if(SpeedDelay(mode & 0x03)) return;
}
}
void SixColorProcess_3(uchar kind,uchar mode,uchar class)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// for(tim=0;tim<val_lenght;tim++)
{
if(ProcessEdgeToMiddle(value,mode,UNLOCKDATA,class)==1) return;
}
}
if(SpeedDelay(mode & 0x03)) return;
}
}
char SendKindData(char kind)
{
uchar mode,tim,i,diff,j=0;
uchar c1,c2,c3,data;
mode =KindDataStr[kind][1];
data =KindDataStr[kind][0];
switch(mode & 0x0c)
{
case DIR0:
//从前向后,正向。
switch(data)
{
case SIX_ID:
SixColorProcess(SIX_ID,mode);
break;
case ALL_ID:
// SevenColorProcess(ALL_ID,mode);
AllStarProcess(ALL_ID,mode,16,4);
break;
case STAR_ID:
AllStarProcess(STAR_ID,mode,10,21);
break;
case SEVEN_ID:
AllStarProcess(SEVEN_ID,mode,16,4);
// SevenColorProcess(SEVEN_ID,mode);
break;
case THREE_ID:
ThreeColorProcess(THREE_ID,mode);
break;
case THREE1_ID:
Three1ColorProcess(THREE1_ID,mode);
break;
case ALLCOLOR_ID:
AllColorProcess(ALLCOLOR_ID,mode);
break;
case UNITEC_ID:
UniteColorProcess(UNITEC_ID,mode);
break;
default:
break;
}
break;
case DIR1:
//从后向前,反向。
BLenghtCount=val_lenght;
switch(data)
{
case SIX_ID:
SixColorProcess_1(SIX_ID,mode);
break;
case ALL_ID:
SevenColorProcess_1(ALL_ID,mode,8,5);
break;
case STAR_ID:
SevenColorProcess_1(STAR_ID,mode,10,21);
break;
case SEVEN_ID:
SevenColorProcess_1(SEVEN_ID,mode,8,5);
break;
case THREE1_ID:
Three1ColorProcess_1(THREE1_ID,mode);
break;
case UNITEC_ID:
UniteColorProcess_1(UNITEC_ID,mode);
break;
default:
break;
}
break;
case DIR2:
//从中间向两边。
switch(data)
{
case SIX_ID:
SixColorProcess_2(SIX_ID,mode,0);
break;
case ALL_ID:
AllStarProcess_2(ALL_ID,mode,8,5);
break;
case STAR_ID:
AllStarProcess_2(STAR_ID,mode,10,21);
break;
case UNITEC_ID:
UniteColorProcess_2(UNITEC_ID,mode);
break;
default:
break;
}
break;
case DIR3:
//从两边向中间。
switch(data)
{
case SIX_ID:
SixColorProcess_3(SIX_ID,mode,0);
break;
case ALL_ID:
AllStarProcess_3(ALL_ID,mode,8,5);
break;
case STAR_ID:
AllStarProcess_3(STAR_ID,mode,10,21);
break;
case UNITEC_ID:
UniteColorProcess_3(UNITEC_ID,mode);
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
uchar ProcessMiddleToEdge(char data,uchar mode,uchar BC,uchar cclass )
{
//从中间向两边。
uint i,one_l,one,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght;
BLenghtCount=val_lenght;
one=0;
one_l=0;
for(i=0;i<BLenghtCount;i++)
{
if(one<BLenghtCount)
one++;
Send_Data(data,1);
for(j=1;j<one;j++)
{
Send_Data(UNLOCKDATA,1);
}
////////////////////////////////
if(one_l<BLenghtCount)
one_l++;
for(j=1;j<one_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data,1);
for(j=one_l;j<BLenghtCount;j++)
{
Send_Data(UNLOCKDATA,1);
}
SendSS(1);
// SendSI(cclass);
Display();
}
// if(SpeedDelay(mode & 0x03)==1) return 1;
return 0;
}
uchar ProcessEdgeToMiddle(char data,uchar mode,uchar BC,uchar cclass)
{
//从两边向中间。
uint i,one_l,one,j;
//芯片数为双数, 为单数
FLenghtCount=val_lenght;
BLenghtCount=val_lenght;
one=0;
one_l=0;
for(i=0;i<BLenghtCount;i++)
{
if(one_l<BLenghtCount)
one_l++;
for(j=1;j<one_l;j++)
{
Send_Data(UNLOCKDATA,1);
}
Send_Data(data,1);
for(;j<BLenghtCount;j++)
{
Send_Data(UNLOCKDATA,1);
}
FLenghtCount--;
Send_Data(UNLOCKDATA,FLenghtCount);
if(one<BLenghtCount)
one++;
Send_Data(data,1);
for(j=1;j<one;j++)
{
Send_Data(UNLOCKDATA,1);
}
SendSS(1);
Display();
// SendSI(cclass);
}
return 0;
}
#if 0
void EEPROM_write1(unsigned int uiAddress, unsigned char ucData)
{
/* 等待上一次写操作结束 */
while(EECR & (1<<EEWE)) ;
/* 设置地址和数据寄存器*/
EEAR = uiAddress;
EEDR = ucData;
/* 置位EEMWE */
EECR |= (1<<EEMWE);
/* 置位EEWE 以启动写操作*/
EECR |= (1<<EEWE);
}
unsigned char EEPROM_read1(unsigned int uiAddress)
{
/* 等待上一次写操作结束 */
while(EECR & (1<<EEWE));
/* 设置地址寄存器*/
EEAR = uiAddress;
/* 设置EERE 以启动读操作*/
EECR |= (1<<EERE);
/* 自数据寄存器返回数据 */
return EEDR;
}
void EepromTest(void)
{
unsigned char temp1,temp2; /*定义变量*/
unsigned char buffer[10]; /*定义数组*/
unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/
EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/
temp1 = EEPROMread(0x10); /*读一个字符到temp1*/
EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/
EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/
EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */
EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/
}
#endif
void EepromICnumberWr(void)
{
//use 4 bytes save IC number
//address: 0x02,0x03,0x04,0x05
unsigned char bit; /*定义变量*/
unsigned char buffer[5]; /*定义数组*/
long loop;
if(val_lenght > MAXVAL_LENGHT) val_lenght = MINVAL_LENGHT;
loop=val_lenght;
bit=loop/1000;
buffer[0]=bit;
loop=loop-bit *1000;
bit=loop/100;
buffer[1]=bit;
loop=loop-bit *100;
bit=loop/10;
buffer[2]=bit;
loop=loop-bit *10;
buffer[3]=loop;
buffer[4]=0x00;
EEPROM_WRITE(0x02,buffer); /*数组中的值写到EEPROM中:0X02开始为*/
}
void EepromICnumberRd(void)
{
//use 4 bytes save IC number
//address: 0x02,0x03,0x04,0x05
unsigned char buffer[5]; /*定义数组*/
EEPROM_READ(0x02,buffer); /*读字符串到数组中 buffer[10]=abcdefg */
val_lenght=buffer[0] * 1000+buffer[1] * 100+buffer[2] * 10+buffer[3];
if(val_lenght > MAXVAL_LENGHT) val_lenght = MINVAL_LENGHT;
}
void FactorySetup(void)
{
uchar i;
ModeStatus=MODE_NOMALE;
CurrentKey=KEY_FUNCTION;
BackKey=KEY_FUNCTION;
CurrentKind=KIND0;
K1Count=0;
val_kind=0;
Oneday=0xff;
// val_lenght=MINVAL_LENGHT;
for(i=0;i<MAXVAL_KIND;i++)
{
KindData[i]=FALSE;//TRUE;
}
DayData[0]=200;
DayData[1]=0;
}
void EepromViewModeWr(void)
{
//use 112 bytes save View mode
//address: 0x20,0x21,0x22, ... , 0x20+112
EEPROM_WRITE(0x20,KindData); /*数组中的值写到EEPROM中:0X10开始为*/
}
void EepromViewModeRd(void)
{
//use 112 bytes save View mode
//address: 0x20,0x21,0x22, ... , 0x20+112
// unsigned char buffer[5]; /*定义数组*/
EEPROM_READ(0x20,KindData); /*读字符串到数组中 buffer[10]=abcdefg */
}
void EepromPasswordRd(void)
{
//use 5 bytes save password
//address: 0x08,0x09,0x0a,0x0b,0x0c;
uchar i;
EEPROM_READ(0x08,PasswordData); /*读字符串到数组中 buffer[10]=abcdefg */
for(i=0;i<(PASSWORDLENGHT-1);i++)
{
if(PasswordData[i] !=PASS_DISABLE)
{
Password_Enable=TRUE;
return;
}
}
Password_Enable=FALSE;
}
void EepromPasswordWr(void)
{
//use 5 bytes save password
//address: 0x08,0x09,0x0a,0x0b,0x0c;
EEPROM_WRITE(0x08,PasswordData); /*数组中的值写到EEPROM中:0X10开始为*/
}
void EepromDayDataRd(void)
{
//use 2 bytes save date value
//address: 0x0d,0e;
EEPROM_READ(0x0d,DayData); /*读字符串到数组中 buffer[10]=abcdefg */
}
void EepromDayDataWr(void)
{
//use 2 bytes save date value
//address: 0x0d,0e;
EEPROM_WRITE(0x0d,DayData); /*数组中的值写到EEPROM中:0X10开始为*/
}
void EepromDateValueRd(void)
{
//use 6 bytes save date value
//address: 0x10,0x11,0x12,0x13,0x14,0x15;
EEPROM_READ(0x10,DateValue); /*读字符串到数组中 buffer[10]=abcdefg */
}
void EepromDateValueWr(void)
{
//use 6 bytes save date value
//address: 0x10,0x11,0x12,0x13,0x14,0x15;
DateValue[0]=(YEAR_SETUP & 0x0f)+((YEAR_SETUP & 0xf0) >>4) *10;
DateValue[1]=(MONTH_SETUP & 0x0f)+((MONTH_SETUP & 0x10) >>4) *10;
DateValue[2]=(DAY_SETUP & 0x0f)+((DAY_SETUP & 0x30) >>4) *10;
DateValue[3]=0x0;
EEPROM_WRITE(0x10,DateValue); /*数组中的值写到EEPROM中:0X10开始为*/
}
//////////////////////////////////////////////
//程序开始
void DS1302_Write(uchar reg,uchar data)
{
uchar i;
Set_DS1302_DDRSDA();
Clr_DS1302_RST();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
Set_DS1302_RST();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01) Set_DS1302_SDA();
else Clr_DS1302_SDA();
asm("nop");
asm("nop");
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
reg>>=1;
}
for(i=8;i>0;i--)
{
if(data&0x01) Set_DS1302_SDA();
else Clr_DS1302_SDA();
asm("nop");
asm("nop");
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
data>>=1;
}
Clr_DS1302_RST();
asm("nop");
asm("nop");
Clr_DS1302_DDRSDA();
}
uchar DS1302_Read(uchar reg)
{
uchar data=0,i;
reg+=1;//读标志
Set_DS1302_DDRSDA();
Clr_DS1302_RST();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
Set_DS1302_RST();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01) Set_DS1302_SDA();
else Clr_DS1302_SDA();
asm("nop");
asm("nop");
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
reg>>=1;
}
Clr_DS1302_DDRSDA();
for(i=8;i>0;i--)
{
data>>=1;
if((PIND&(1<<DS1302_SDA))==(1<<DS1302_SDA)) data|=0x80;
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
}
Clr_DS1302_RST();
asm("nop");
asm("nop");
return(data);
}
uchar Check_DS1302(void)
{
DS1302_Write(DS1302_CONTROL_Reg,0x80);
if(DS1302_Read(DS1302_CONTROL_Reg)==0x80) return 1;
return 0;
}
void DS1302_Init(void)
{
DS1302_Write(DS1302_CONTROL_Reg,0x00);//关闭写保护
DS1302_Write(DS1302_SEC_Reg,0x80);//暂停
DS1302_Write(DS1302_CHARGER_Reg,0xa9);//涓流充电
DS1302_Write(DS1302_YEAR_Reg,INIT_YEAR); //年
DS1302_Write(DS1302_MONTH_Reg,INIT_MONTH); //月
DS1302_Write(DS1302_DATE_Reg,INIT_DATE); //日
DS1302_Write(DS1302_DAY_Reg,INIT_DAY); //周
DS1302_Write(DS1302_HR_Reg,INIT_HOUR); //时
DS1302_Write(DS1302_MIN_Reg,INIT_MINUTE); //分
DS1302_Write(DS1302_SEC_Reg,INIT_SECOND); //秒
DS1302_Write(DS1302_CONTROL_Reg,0x80);//打开写保护
}
#if 0
void ReadTime(void)
{
uchar data;
data=DS1302_Read(DS1302_YEAR_Reg);//年
year0=data&0x0f;
year1=data>>4;
data=DS1302_Read(DS1302_MONTH_Reg);//月
month0=data&0x0f;
month1=(data>>4)&0x01;
data=DS1302_Read(DS1302_DATE_Reg);//日
date0=data&0x0f;
date1=(data>>4)&0x03;
data=DS1302_Read(DS1302_DAY_Reg);//周
day=data&0x07;
data=DS1302_Read(DS1302_HR_Reg);//时
hour0=data&0x0f;
hour1=(data>>4)&0x03;
data=DS1302_Read(DS1302_MIN_Reg);//分
minute0=data&0x0f;
minute1=(data>>4)&0x07;
data=DS1302_Read(DS1302_SEC_Reg);//秒
second0=data&0x0f;
second1=(data>>4)&0x07;
}
#endif
void ReadTime(void)
{
uchar data;
data=DS1302_Read(DS1302_YEAR_Reg);//年
year0=data&0x0f;
year1=data>>4;
year1=year1 * 10 +year0;
data=DS1302_Read(DS1302_MONTH_Reg);//月
month0=data&0x0f;
month1=(data>>4)&0x01;
month1=month1 * 10 + month0;
data=DS1302_Read(DS1302_DATE_Reg);//日
date0=data&0x0f;
date1=(data>>4)&0x03;
date1=date1 * 10 + date0;
}
int CalMonthDay(uchar month,uchar day)
{
uint total;
switch(month)
{
case 2:
total=31;
break;
case 3:
total=59;
break;
case 4:
total=90;
break;
case 5:
total=120;
break;
case 6:
total=151;
break;
case 7:
total=181;
break;
case 8:
total=212;
break;
case 9:
total=243;
break;
case 10:
total=273;
break;
case 11:
total=304;
break;
case 12:
total=334;
break;
case 1:
default:
total=0;
break;
}
total=total+day;
return total;
}
int CompareDate(void)
{
int temp1,temp2;
int day_diff=-1;
if(year1 > DateValue[0])
{
temp1=year1-DateValue[0];
temp2= temp1 * 365;
temp1=temp2+CalMonthDay(month1, date1);
temp2=CalMonthDay(DateValue[1], DateValue[2]);
day_diff=temp1-temp2;
}
else if(year1 == DateValue[0])
{
temp1=CalMonthDay(month1, date1);
temp2=CalMonthDay(DateValue[1], DateValue[2]);
if(temp1>=temp2)
day_diff=temp1-temp2;
}
return day_diff;
}
//时钟定为8MHz,F_CPU=8000000
//全局变量
volatile unsigned char T0OCR; //设置T0的时间值
void timer0_init(void) //CTC模式输出1KHz/2KHz方波
{
T0OCR=61;
OCR0 = T0OCR; //设定TOP值
//TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS)
//TOP=8000000/(2*64*2000)-1=30.25 选30 2.016KHz(0.496ms)
//TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
//64分频,CTC模式,OC0取反输出方波
TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
//64分频,CTC模式,OC0
// TIMSK = (1<<OCIE0)|(1<<TOIE0); //T0输出比较匹配中断(作定时用)
TIMSK = (1<<OCIE0); //T0输出比较匹配中断(作定时用)
}
void Enable_Time0_Interrupt(void)
{
TIMSK = (1<<OCIE0); //T0输出比较匹配中断(作定时用)
}
void Disable_Time0_Interrupt(void)
{
TIMSK = (0<<OCIE0); //T0输出比较匹配中断(作定时用)
}
//#pragma interrupt_handler tim0_ovf_isr:10
//tim0_ovf_isr:11 ;atmega16 ,TIME0_ovf_vecter
#pragma interrupt_handler tim0_comp_isr:20
//tim0_comp_isr:20 ;atmega16 ,TIME0_comp_vecter
void tim0_comp_isr(void)
{
if(SI_Count>0)
{
SI_Count--;
SendSI(1);
}
}