首页 > 学院 > 开发设计 > 正文

单片机lcd改进版时钟

2019-11-11 04:12:41
字体:
来源:转载
供稿:网友
#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);    /*ÏÔʾ¿ª¼°¹â±êÉèÖÃ*/   }   /*------------------------------------------------                    Ö÷º¯Êý------------------------------------------------*/  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表