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); 
	} 
 }