#include<reg52.h>#include<intrins.h>#define KeyPort P3//?¨ò?°′?ü???ú#define _Nop() _nop_() //?¨ò?????á?#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0#define Led Port P1 //?¨ò?êy?Y???ú 3ìDò?Dó?μ?DataPort ?òó?P0 ì???sbit SPK=P2^2;sbit SDA=P2^1; //?£?aI2Cêy?Y′??í??sbit SCL=P2^0; //?£?aI2Cê±?ó??????sbit RS = P2^4; //?¨ò????ú sbit RW = P2^5;sbit EN = P2^6;bit ack; //ó|′e±ê????unsigned char hour,minute,second;//?¨ò?ê±·???unsigned int num ;unsigned char flag1,flag2,flag3;unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char TempData[8]; //′?′¢??ê??μμ?è???±?á?void LCD_Init(void); bit LCD_Check_Busy(void); void LCD_Write_Com(unsigned char com); void LCD_Write_Data(unsigned char Data); void LCD_Clear(void); void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s); void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data); void DelayUs2x(unsigned char t);//us???óê±oˉêyéù?÷ void DelayMs(unsigned char t); //ms???óê±void Display();//êy??1ü??ê?oˉêyunsigned char KeyScan(void);//?ü?ìé¨?èvoid Init_Timer0(void);//?¨ê±?÷3?ê??ˉvoid ISR_Key(void) interrupt 0 using 1{ P1=~P1; //??è??D??3ìDò?′DD3ìDò£?//′?ê±?éò?í¨1y EA=0??á??Yê±1?μ??D?? }void Start_I2c(){ SDA=1; //·¢?í?eê?ì??tμ?êy?YD?o? _Nop(); SCL=1; _Nop(); //?eê?ì??t?¨á¢ê±??′óóú4.7us,?óê± _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; //·¢?í?eê?D?o? _Nop(); //?eê?ì??t???¨ê±??′óóú4|ì _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; //?ˉ×?I2C×ü??£?×?±?·¢?í?ò?óê?êy?Y _Nop(); _Nop();}/*------------------------------------------------ ?áê?×ü??------------------------------------------------*/void Stop_I2c(){ SDA=0; //·¢?í?áê?ì??tμ?êy?YD?o? _Nop(); //·¢?í?áê?ì??tμ?ê±?óD?o? SCL=1; //?áê?ì??t?¨á¢ê±??′óóú4|ì _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; //·¢?íI2C×ü???áê?D?o? _Nop(); _Nop(); _Nop(); _Nop();}/*---------------------------------------------------------------- ×??úêy?Y′??íoˉêy oˉêy?-Dí: void SendByte(unsigned char c);1|?ü: ??êy?Yc·¢?í3?è¥,?éò?ê?μ??·,ò2?éò?ê?êy?Y,·¢íêoóμè′yó|′e,2¢?? ′?×′ì?????DD2ù×÷.(2?ó|′e?ò·?ó|′e??ê1ack=0 ?ù) ·¢?íêy?Y?y3££?ack=1; ack=0±íê?±????÷?Tó|′e?ò?e?μ?£------------------------------------------------------------------*/void SendByte(unsigned char c){ unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //òa′??íμ?êy?Y3¤?è?a8?? { if((c<<BitCnt)&0x80)SDA=1; //?D??·¢?í?? else SDA=0; _Nop(); SCL=1; //??ê±?ó???a??£?í¨?a±????÷?aê??óê?êy?Y?? _Nop(); _Nop(); //±£?¤ê±?ó??μ????ü?ú′óóú4|ì _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; //8??·¢?ííêoóêí·?êy?Y??£?×?±??óê?ó|′e?? _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; //?D??ê?·??óê?μ?ó|′eD?o? SCL=0; _Nop(); _Nop();}/*---------------------------------------------------------------- ×??úêy?Y′??íoˉêy oˉêy?-Dí: unsigned char RcvByte();1|?ü: ó?à′?óê?′ó?÷?t′?à′μ?êy?Y,2¢?D??×ü??′í?ó(2?·¢ó|′eD?o?)£? ·¢íêoó??ó?ó|′eoˉêy?£ ------------------------------------------------------------------*/unsigned char RcvByte(){ unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; //??êy?Y???aê?è?·?ê? for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; //??ê±?ó???aμí£?×?±??óê?êy?Y?? _Nop(); _Nop(); //ê±?óμíμ????ü?ú′óóú4.7us _Nop(); _Nop(); _Nop(); SCL=1; //??ê±?ó???a??ê1êy?Y??é?êy?YóDD§ _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; //?áêy?Y??,?óê?μ?êy?Y??·?è?retc?D _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc);}/*---------------------------------------------------------------- ó|′e×óoˉêy?-Dí: void Ack_I2c(void); ----------------------------------------------------------------*/void Ack_I2c(void){ SDA=0; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //ê±?óμíμ????ü?ú′óóú4|ì _Nop(); _Nop(); _Nop(); SCL=0; //??ê±?ó??£??ˉ×?I2C×ü??ò?±??ìD??óê? _Nop(); _Nop(); }/*---------------------------------------------------------------- ·?ó|′e×óoˉêy?-Dí: void NoAck_I2c(void); ----------------------------------------------------------------*/void NoAck_I2c(void){ SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //ê±?óμíμ????ü?ú′óóú4|ì _Nop(); _Nop(); _Nop(); SCL=0; //??ê±?ó??£??ˉ×?I2C×ü??ò?±??ìD??óê? _Nop(); _Nop(); }/*---------------------------------------------------------------- ?ò?T×óμ??·?÷?t·¢?í×??úêy?Yoˉêy oˉêy?-Dí: bit ISendByte(unsigned char sla,ucahr c); 1|?ü: ′ó???ˉ×ü??μ?·¢?íμ??·£?êy?Y£??áê?×ü??μ?è?1y3ì,′ó?÷?tμ??·sla. è?1?·μ??1±íê?2ù×÷3é1|£?·??ò2ù×÷óD?ó?£×¢òa£o ê1ó??°±?D?ò??áê?×ü???£----------------------------------------------------------------*//*bit ISendByte(unsigned char sla,unsigned char c){ Start_I2c(); //???ˉ×ü?? SendByte(sla); //·¢?í?÷?tμ??· if(ack==0)return(0); SendByte(c); //·¢?íêy?Y if(ack==0)return(0); Stop_I2c(); //?áê?×ü?? return(1);}*//*---------------------------------------------------------------- ?òóD×óμ??·?÷?t·¢?í?à×??úêy?Yoˉêy oˉêy?-Dí: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 1|?ü: ′ó???ˉ×ü??μ?·¢?íμ??·£?×óμ??·,êy?Y£??áê?×ü??μ?è?1y3ì,′ó?÷?t μ??·sla£?×óμ??·suba£?·¢?í?úèYê?s???òμ??úèY£?·¢?íno??×??ú?£ è?1?·μ??1±íê?2ù×÷3é1|£?·??ò2ù×÷óD?ó?£×¢òa£o ê1ó??°±?D?ò??áê?×ü???£----------------------------------------------------------------*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //???ˉ×ü?? SendByte(sla); //·¢?í?÷?tμ??· if(ack==0)return(0); SendByte(suba); //·¢?í?÷?t×óμ??· if(ack==0)return(0); for(i=0;i<no;i++) { SendByte(*s); //·¢?íêy?Y DelayMs(1); if(ack==0)return(0); s++; } Stop_I2c(); //?áê?×ü?? return(1);}/*---------------------------------------------------------------- ?ò?T×óμ??·?÷?t?á×??úêy?Yoˉêy oˉêy?-Dí: bit IRcvByte(unsigned char sla,ucahr *c); 1|?ü: ′ó???ˉ×ü??μ?·¢?íμ??·£??áêy?Y£??áê?×ü??μ?è?1y3ì,′ó?÷?tμ? ?·sla£?·μ???μ?úc. è?1?·μ??1±íê?2ù×÷3é1|£?·??ò2ù×÷óD?ó?£×¢òa£o ê1ó??°±?D?ò??áê?×ü???£----------------------------------------------------------------*//*bit IRcvByte(unsigned char sla,unsigned char *c){ Start_I2c(); //???ˉ×ü?? SendByte(sla+1); //·¢?í?÷?tμ??· if(ack==0)return(0); *c=RcvByte(); //?áè?êy?Y NoAck_I2c(); //·¢?í·??í′e?? Stop_I2c(); //?áê?×ü?? return(1);}*//*---------------------------------------------------------------- ?òóD×óμ??·?÷?t?áè??à×??úêy?Yoˉêy oˉêy?-Dí: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 1|?ü: ′ó???ˉ×ü??μ?·¢?íμ??·£?×óμ??·,?áêy?Y£??áê?×ü??μ?è?1y3ì,′ó?÷?t μ??·sla£?×óμ??·suba£??á3?μ??úèY·?è?s???òμ?′?′¢??£??áno??×??ú?£ è?1?·μ??1±íê?2ù×÷3é1|£?·??ò2ù×÷óD?ó?£×¢òa£o ê1ó??°±?D?ò??áê?×ü???£----------------------------------------------------------------*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //???ˉ×ü?? SendByte(sla); //·¢?í?÷?tμ??· if(ack==0)return(0); SendByte(suba); //·¢?í?÷?t×óμ??· if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i<no-1;i++) { *s=RcvByte(); //·¢?íêy?Y Ack_I2c(); //·¢?í?í′e?? s++; } *s=RcvByte(); NoAck_I2c(); //·¢?í·?ó|?? Stop_I2c(); //?áê?×ü?? return(1);}/*------------------------------------------------ ?÷oˉêy------------------------------------------------*/void main (void){unsigned char num1;unsigned char temp = 0;unsigned char i,j = 0; LCD_Init(); LCD_Clear(); LCD_Write_String(6,1,"clock"); while (1) //?÷?-?· {if(flag2 == 1){DelayMs(1); SPK=!SPK;Display();flag2 = 0;}if(minute == 0&&second <= 10) { if(second%2)P1 = 0x55;elseP1 = 0xaa;}elseP1 = 0xff;while(flag1){ if(num%2) SPK=1; else SPK = 0; i++; if(i==200) {i=0;flag1++;break; } }num1=KeyScan();switch(num1) { case 1:hour++;if(hour==24)hour=0; //?y3£ê±?? D?ê± ?ó1 break;case 2:hour--;if(hour==255)hour=23; //?y3£ê±?? D?ê±??1 break;case 3:minute++;if(minute==60)minute=0; //·??ó?ó1 break;case 4:minute--;if(minute==255)minute=59; //·??ó??1 break;case 5:{Init_Timer0();IRcvStr(0xae,4,&hour,1); IRcvStr(0xae,5,&minute,1); IRcvStr(0xae,6,&second,1); break; }case 6:{if(temp%2 == 0)EA = 1;elseEA = 0;temp++;break;}case 7: hour = 0;minute = 0;second = 0; break; default:break; }}}/*------------------------------------------------ uS?óê±oˉêy£?o?óDê?è?2?êy unsigned char t£??T·μ???μ unsigned char ê??¨ò??T·?o?×?·?±?á?£????μμ?·??§ê? 0~255 ?aà?ê1ó??§??12M£???è·?óê±??ê1ó???±à,′ó???óê± 3¤?èè??? T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){ while(--t);}/*------------------------------------------------ mS?óê±oˉêy£?o?óDê?è?2?êy unsigned char t£??T·μ???μ unsigned char ê??¨ò??T·?o?×?·?±?á?£????μμ?·??§ê? 0~255 ?aà?ê1ó??§??12M£???è·?óê±??ê1ó???±à------------------------------------------------*/void DelayMs(unsigned char t){ while(t--) { //′ó???óê±1mS DelayUs2x(245);DelayUs2x(245); }}/*------------------------------------------------ ??ê?oˉêy£?ó?óú?ˉì?é¨?èêy??1ü ê?è?2?êy FirstBit ±íê?Dèòa??ê?μ?μúò???£?è??3?μ2±íê?′óμúèy??êy??1ü?aê???ê? è?ê?è?0±íê?′óμúò?????ê??£ Num±íê?Dèòa??ê?μ???êy£?è?Dèòa??ê?99á???êy?μ?ò???μê?è?2------------------------------------------------*/void Display(){ unsigned char h0,h1, m0,m1 ,s0,s1; h0 = hour/10+48; h1 = hour%10+48; m0 = minute/10+48; m1 = minute%10+48; s0 = second/10+48; s1 = second%10+48; LCD_Write_Char(3,0,h0); LCD_Write_Char(4,0,h1); LCD_Write_Char(5,0,':'); LCD_Write_Char(6,0,m0); LCD_Write_Char(7,0,m1); LCD_Write_Char(8,0,':'); LCD_Write_Char(9,0,s0); LCD_Write_Char(10,0,s1); ISendStr(0xae,4,&hour,1); ISendStr(0xae,5,&minute,1); ISendStr(0xae,6,&second,1); }/*------------------------------------------------ ?¨ê±?÷3?ê??ˉ×ó3ìDò------------------------------------------------*/void Init_Timer0(void){ TMOD |= 0x01; //ê1ó??£ê?1£?16???¨ê±?÷£?ê1ó?"|"·?o??éò??úê1ó??à???¨ê±?÷ê±2?êüó°?ì //TH0=0x00; //???¨3??μ //TL0=0x00; EA=1; //×ü?D??′ò?a ET0=1; //?¨ê±?÷?D??′ò?a TR0=1; //?¨ê±?÷?a1?′ò?a}/*------------------------------------------------ ?¨ê±?÷?D??×ó3ìDò------------------------------------------------*/void Timer0_isr(void) interrupt 1 { TH0=(65536-2000)/256;//??D??3?μ 2ms TL0=(65536-2000)%256; num++; if(num==500) //′ó??1s { num=0;second++; flag2 = 1; if(second==60) //??μ?60£?·??ó?ó1{ second=0; minute++; if(minute==60)//·??óμ?60£?D?ê±?ó1 {flag1 = 1;minute=0;hour++;if(hour==24)//D?ê±μ?24£???á? hour=0;}} }}/*------------------------------------------------°′?üé¨?èoˉêy£?·μ??é¨?è?ü?μ------------------------------------------------*/unsigned char KeyScan(void){ unsigned char keyvalue; if(KeyPort!=0xff) { DelayMs(10); if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff);switch(keyvalue){case 0xfe:return 1;break;case 0xfd:return 2;break;case 0xfb:return 3;break;case 0xf7:return 4;break;case 0xef:return 5;break;case 0xdf:return 6;break;case 0xbf:return 7;break;case 0x7f:return 8;break;default:return 0;break;} } } return 0;} /*------------------------------------------------ ?D?|oˉêy------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); }/*------------------------------------------------ D′è??üá?oˉêy------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { // while(LCD_Check_Busy()); //?|?òμè′y DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; }/*------------------------------------------------ D′è?êy?Yoˉêy------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); //?|?òμè′y DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; }/*------------------------------------------------ ???áoˉêy------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); }/*------------------------------------------------ D′è?×?·?′?oˉêy------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //±íê?μúò?DD } else { LCD_Write_Com(0xC0 + x); //±íê?μú?tDD } while (*s) { LCD_Write_Data( *s); s ++; } }/*------------------------------------------------ D′è?×?·?oˉêy------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); }/*------------------------------------------------ 3?ê??ˉoˉêy------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*??ê??£ê?éè??*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*??ê?1?±?*/ LCD_Write_Com(0x01); /*??ê????á*/ LCD_Write_Com(0x06); /*??ê?1a±êò??ˉéè??*/ DelayMs(5); LCD_Write_Com(0x0C); /*??ê??a?°1a±êéè??*/ } /*------------------------------------------------ ?÷oˉêy------------------------------------------------*/