#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 //¶¨ÒåÊý¾Ý¶Ë¿Ú ³ÌÐòÖÐÓöµ½DataPort ÔòÓÃP0 Ìæ»»sbit SPK=P2^2;sbit SDA=P2^1; //Ä£ÄâI2CÊý¾Ý´«ËÍλsbit SCL=P2^0; //Ä£ÄâI2CʱÖÓ¿ØÖÆλsbit RS = P2^4; //¶¨Òå¶Ë¿Ú sbit RW = P2^5;sbit EN = P2^6;bit ack; //Ó¦´ð±ê־λ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¼¶ÑÓʱº¯ÊýÉùÃ÷ void DelayMs(unsigned char t); //ms¼¶ÑÓʱvoid Display();//ÊýÂë¹ÜÏÔʾº¯Êýunsigned char KeyScan(void);//¼üÅÌɨÃèvoid Init_Timer0(void);//¶¨Ê±Æ÷³õʼ»¯void ISR_Key(void) interrupt 0 using 1{ P1=~P1; //½øÈëÖжϳÌÐòÖ´ÐгÌÐò£¬//´Ëʱ¿ÉÒÔͨ¹ý EA=0Ö¸ÁîÔÝʱ¹ØµôÖÐ¶Ï }void Start_I2c(){ SDA=1; //·¢ËÍÆðʼÌõ¼þµÄÊý¾ÝÐźŠ_Nop(); SCL=1; _Nop(); //ÆðʼÌõ¼þ½¨Á¢Ê±¼ä´óÓÚ4.7us,ÑÓʱ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; //·¢ËÍÆðʼÐźŠ_Nop(); //ÆðʼÌõ¼þËø¶¨Ê±¼ä´óÓÚ4¦Ì _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; //ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý _Nop(); _Nop();}/*------------------------------------------------ ½áÊø×ÜÏß------------------------------------------------*/void Stop_I2c(){ SDA=0; //·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźŠ_Nop(); //·¢ËͽáÊøÌõ¼þµÄʱÖÓÐźŠSCL=1; //½áÊøÌõ¼þ½¨Á¢Ê±¼ä´óÓÚ4¦Ì _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; //·¢ËÍI2C×ÜÏß½áÊøÐźŠ_Nop(); _Nop(); _Nop(); _Nop();}/*---------------------------------------------------------------- ×Ö½ÚÊý¾Ý´«Ëͺ¯Êý º¯ÊýÔÐÍ: void SendByte(unsigned char c);¹¦ÄÜ: ½«Êý¾Ýc·¢ËͳöÈ¥,¿ÉÒÔÊǵØÖ·,Ò²¿ÉÒÔÊÇÊý¾Ý,·¢ÍêºóµÈ´ýÓ¦´ð,²¢¶Ô ´Ë״̬λ½øÐвÙ×÷.(²»Ó¦´ð»ò·ÇÓ¦´ð¶¼Ê¹ack=0 ¼Ù) ·¢ËÍÊý¾ÝÕý³££¬ack=1; ack=0±íʾ±»¿ØÆ÷ÎÞÓ¦´ð»òË𻵡£------------------------------------------------------------------*/void SendByte(unsigned char c){ unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //Òª´«Ë͵ÄÊý¾Ý³¤¶ÈΪ8λ { if((c<<BitCnt)&0x80)SDA=1; //ÅжϷ¢ËÍλ else SDA=0; _Nop(); SCL=1; //ÖÃʱÖÓÏßΪ¸ß£¬Í¨Öª±»¿ØÆ÷¿ªÊ¼½ÓÊÕÊý¾Ýλ _Nop(); _Nop(); //±£Ö¤Ê±ÖӸߵçƽÖÜÆÚ´óÓÚ4¦Ì _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; //8λ·¢ËÍÍêºóÊÍ·ÅÊý¾ÝÏߣ¬×¼±¸½ÓÊÕÓ¦´ðλ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; //ÅжÏÊÇ·ñ½ÓÊÕµ½Ó¦´ðÐźŠSCL=0; _Nop(); _Nop();}/*---------------------------------------------------------------- ×Ö½ÚÊý¾Ý´«Ëͺ¯Êý º¯ÊýÔÐÍ: unsigned char RcvByte();¹¦ÄÜ: ÓÃÀ´½ÓÊÕ´ÓÆ÷¼þ´«À´µÄÊý¾Ý,²¢ÅжÏ×ÜÏß´íÎó(²»·¢Ó¦´ðÐźÅ)£¬ ·¢ÍêºóÇëÓÃÓ¦´ðº¯Êý¡£ ------------------------------------------------------------------*/unsigned char RcvByte(){ unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; //ÖÃÊý¾ÝÏßΪÊäÈ뷽ʽ for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; //ÖÃʱÖÓÏßΪµÍ£¬×¼±¸½ÓÊÕÊý¾Ýλ _Nop(); _Nop(); //ʱÖӵ͵çƽÖÜÆÚ´óÓÚ4.7us _Nop(); _Nop(); _Nop(); SCL=1; //ÖÃʱÖÓÏßΪ¸ßʹÊý¾ÝÏßÉÏÊý¾ÝÓÐЧ _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; //¶ÁÊý¾Ýλ,½ÓÊÕµÄÊý¾Ýλ·ÅÈëretcÖÐ _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc);}/*---------------------------------------------------------------- Ó¦´ð×Óº¯ÊýÔÐÍ: void Ack_I2c(void); ----------------------------------------------------------------*/void Ack_I2c(void){ SDA=0; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //ʱÖӵ͵çƽÖÜÆÚ´óÓÚ4¦Ì _Nop(); _Nop(); _Nop(); SCL=0; //ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ _Nop(); _Nop(); }/*---------------------------------------------------------------- ·ÇÓ¦´ð×Óº¯ÊýÔÐÍ: void NoAck_I2c(void); ----------------------------------------------------------------*/void NoAck_I2c(void){ SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //ʱÖӵ͵çƽÖÜÆÚ´óÓÚ4¦Ì _Nop(); _Nop(); _Nop(); SCL=0; //ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ _Nop(); _Nop(); }/*---------------------------------------------------------------- ÏòÎÞ×ÓµØÖ·Æ÷¼þ·¢ËÍ×Ö½ÚÊý¾Ýº¯Êý º¯ÊýÔÐÍ: bit ISendByte(unsigned char sla,ucahr c); ¹¦ÄÜ: ´ÓÆô¶¯×ÜÏßµ½·¢Ë͵ØÖ·£¬Êý¾Ý£¬½áÊø×ÜÏßµÄÈ«¹ý³Ì,´ÓÆ÷¼þµØÖ·sla. Èç¹û·µ»Ø1±íʾ²Ù×÷³É¹¦£¬·ñÔò²Ù×÷ÓÐÎó¡£×¢Ò⣺ ʹÓÃÇ°±ØÐëÒѽáÊø×ÜÏß¡£----------------------------------------------------------------*//*bit ISendByte(unsigned char sla,unsigned char c){ Start_I2c(); //Æô¶¯×ÜÏß SendByte(sla); //·¢ËÍÆ÷¼þµØÖ· if(ack==0)return(0); SendByte(c); //·¢ËÍÊý¾Ý if(ack==0)return(0); Stop_I2c(); //½áÊø×ÜÏß return(1);}*//*---------------------------------------------------------------- ÏòÓÐ×ÓµØÖ·Æ÷¼þ·¢ËͶà×Ö½ÚÊý¾Ýº¯Êý º¯ÊýÔÐÍ: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); ¹¦ÄÜ: ´ÓÆô¶¯×ÜÏßµ½·¢Ë͵ØÖ·£¬×ÓµØÖ·,Êý¾Ý£¬½áÊø×ÜÏßµÄÈ«¹ý³Ì,´ÓÆ÷¼þ µØÖ·sla£¬×ÓµØÖ·suba£¬·¢ËÍÄÚÈÝÊÇsÖ¸ÏòµÄÄÚÈÝ£¬·¢ËÍno¸ö×Ö½Ú¡£ Èç¹û·µ»Ø1±íʾ²Ù×÷³É¹¦£¬·ñÔò²Ù×÷ÓÐÎó¡£×¢Ò⣺ ʹÓÃÇ°±ØÐëÒѽáÊø×ÜÏß¡£----------------------------------------------------------------*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //Æô¶¯×ÜÏß SendByte(sla); //·¢ËÍÆ÷¼þµØÖ· if(ack==0)return(0); SendByte(suba); //·¢ËÍÆ÷¼þ×ÓµØÖ· if(ack==0)return(0); for(i=0;i<no;i++) { SendByte(*s); //·¢ËÍÊý¾Ý DelayMs(1); if(ack==0)return(0); s++; } Stop_I2c(); //½áÊø×ÜÏß return(1);}/*---------------------------------------------------------------- ÏòÎÞ×ÓµØÖ·Æ÷¼þ¶Á×Ö½ÚÊý¾Ýº¯Êý º¯ÊýÔÐÍ: bit IRcvByte(unsigned char sla,ucahr *c); ¹¦ÄÜ: ´ÓÆô¶¯×ÜÏßµ½·¢Ë͵ØÖ·£¬¶ÁÊý¾Ý£¬½áÊø×ÜÏßµÄÈ«¹ý³Ì,´ÓÆ÷¼þµØ Ö·sla£¬·µ»ØÖµÔÚc. Èç¹û·µ»Ø1±íʾ²Ù×÷³É¹¦£¬·ñÔò²Ù×÷ÓÐÎó¡£×¢Ò⣺ ʹÓÃÇ°±ØÐëÒѽáÊø×ÜÏß¡£----------------------------------------------------------------*//*bit IRcvByte(unsigned char sla,unsigned char *c){ Start_I2c(); //Æô¶¯×ÜÏß SendByte(sla+1); //·¢ËÍÆ÷¼þµØÖ· if(ack==0)return(0); *c=RcvByte(); //¶ÁÈ¡Êý¾Ý NoAck_I2c(); //·¢ËͷǾʹðλ Stop_I2c(); //½áÊø×ÜÏß return(1);}*//*---------------------------------------------------------------- ÏòÓÐ×ÓµØÖ·Æ÷¼þ¶ÁÈ¡¶à×Ö½ÚÊý¾Ýº¯Êý º¯ÊýÔÐÍ: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); ¹¦ÄÜ: ´ÓÆô¶¯×ÜÏßµ½·¢Ë͵ØÖ·£¬×ÓµØÖ·,¶ÁÊý¾Ý£¬½áÊø×ÜÏßµÄÈ«¹ý³Ì,´ÓÆ÷¼þ µØÖ·sla£¬×ÓµØÖ·suba£¬¶Á³öµÄÄÚÈÝ·ÅÈësÖ¸ÏòµÄ´æ´¢Çø£¬¶Áno¸ö×Ö½Ú¡£ Èç¹û·µ»Ø1±íʾ²Ù×÷³É¹¦£¬·ñÔò²Ù×÷ÓÐÎó¡£×¢Ò⣺ ʹÓÃÇ°±ØÐëÒѽáÊø×ÜÏß¡£----------------------------------------------------------------*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //Æô¶¯×ÜÏß SendByte(sla); //·¢ËÍÆ÷¼þµØÖ· if(ack==0)return(0); SendByte(suba); //·¢ËÍÆ÷¼þ×ÓµØÖ· if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i<no-1;i++) { *s=RcvByte(); //·¢ËÍÊý¾Ý Ack_I2c(); //·¢Ë;ʹðλ s++; } *s=RcvByte(); NoAck_I2c(); //·¢ËÍ·ÇӦλ Stop_I2c(); //½áÊø×ÜÏß return(1);}/*------------------------------------------------ Ö÷º¯Êý------------------------------------------------*/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; //Õý³£Ê±¼ä Сʱ ¼Ó1 break;case 2:hour--;if(hour==255)hour=23; //Õý³£Ê±¼ä Сʱ¼õ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ÑÓʱº¯Êý£¬º¬ÓÐÊäÈë²ÎÊý unsigned char t£¬ÎÞ·µ»ØÖµ unsigned char ÊǶ¨ÒåÎÞ·ûºÅ×Ö·û±äÁ¿£¬ÆäÖµµÄ·¶Î§ÊÇ 0~255 ÕâÀïʹÓþ§Õñ12M£¬¾«È·ÑÓʱÇëʹÓûã±à,´óÖÂÑÓʱ ³¤¶ÈÈçÏ T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){ while(--t);}/*------------------------------------------------ mSÑÓʱº¯Êý£¬º¬ÓÐÊäÈë²ÎÊý unsigned char t£¬ÎÞ·µ»ØÖµ unsigned char ÊǶ¨ÒåÎÞ·ûºÅ×Ö·û±äÁ¿£¬ÆäÖµµÄ·¶Î§ÊÇ 0~255 ÕâÀïʹÓþ§Õñ12M£¬¾«È·ÑÓʱÇëʹÓûã±à------------------------------------------------*/void DelayMs(unsigned char t){ while(t--) { //´óÖÂÑÓʱ1mS DelayUs2x(245);DelayUs2x(245); }}/*------------------------------------------------ ÏÔʾº¯Êý£¬ÓÃÓÚ¶¯Ì¬É¨ÃèÊýÂë¹Ü ÊäÈë²ÎÊý FirstBit ±íʾÐèÒªÏÔʾµÄµÚһ룬È縳ֵ2±íʾ´ÓµÚÈý¸öÊýÂë¹Ü¿ªÊ¼ÏÔʾ ÈçÊäÈë0±íʾ´ÓµÚÒ»¸öÏÔʾ¡£ Num±íʾÐèÒªÏÔʾµÄλÊý£¬ÈçÐèÒªÏÔʾ99Á½Î»ÊýÖµÔò¸ÃÖµÊäÈë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); }/*------------------------------------------------ ¶¨Ê±Æ÷³õʼ»¯×Ó³ÌÐò------------------------------------------------*/void Init_Timer0(void){ TMOD |= 0x01; //ʹÓÃģʽ1£¬16λ¶¨Ê±Æ÷£¬Ê¹ÓÃ"|"·ûºÅ¿ÉÒÔÔÚʹÓöà¸ö¶¨Ê±Æ÷ʱ²»ÊÜÓ°Ïì //TH0=0x00; //¸ø¶¨³õÖµ //TL0=0x00; EA=1; //×ÜÖжϴò¿ª ET0=1; //¶¨Ê±Æ÷Öжϴò¿ª TR0=1; //¶¨Ê±Æ÷¿ª¹Ø´ò¿ª}/*------------------------------------------------ ¶¨Ê±Æ÷ÖжÏ×Ó³ÌÐò------------------------------------------------*/void Timer0_isr(void) interrupt 1 { TH0=(65536-2000)/256;//ÖØи³Öµ 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£¬Ð¡Ê±¼Ó1 {flag1 = 1;minute=0;hour++;if(hour==24)//Сʱµ½24£¬»ØÁã hour=0;}} }}/*------------------------------------------------°´¼üɨÃ躯Êý£¬·µ»ØɨÃè¼üÖµ------------------------------------------------*/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;} /*------------------------------------------------ ÅÐ溯Êý------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); }/*------------------------------------------------ дÈëÃüÁÊý------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { // while(LCD_Check_Busy()); //æÔòµÈ´ý DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; }/*------------------------------------------------ дÈëÊý¾Ýº¯Êý------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); //æÔòµÈ´ý DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; }/*------------------------------------------------ ÇåÆÁº¯Êý------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); }/*------------------------------------------------ дÈë×Ö·û´®º¯Êý------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //±íʾµÚÒ»ÐÐ } else { LCD_Write_Com(0xC0 + x); //±íʾµÚ¶þÐÐ } while (*s) { LCD_Write_Data( *s); s ++; } }/*------------------------------------------------ дÈë×Ö·ûº¯Êý------------------------------------------------*/ 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); }/*------------------------------------------------ ³õʼ»¯º¯Êý------------------------------------------------*/ 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); /*ÏÔʾ¹Ø±Õ*/ LCD_Write_Com(0x01); /*ÏÔʾÇåÆÁ*/ LCD_Write_Com(0x06); /*ÏÔʾ¹â±êÒƶ¯ÉèÖÃ*/ DelayMs(5); LCD_Write_Com(0x0C); /*ÏÔʾ¿ª¼°¹â±êÉèÖÃ*/ } /*------------------------------------------------ Ö÷º¯Êý------------------------------------------------*/