⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563.lst

📁 本源代码是一个51单片机控制pcf8563时钟日历芯片的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.08   PCF8563                                                               03/23/2009 21:41:05 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE PCF8563
OBJECT MODULE PLACED IN pcf8563.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE pcf8563.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*---------------PCF8563修改历史----------------
   2             2008.5.4     添加启动停止函数
   3             2008.5.8     添加键值管理和识别函数
   4             2008.5.8     添加时间显示函数year_display()等
   5             2008.5.9     添加部分调节时间的代码
   6             2008.5.11    添加闹钟显示部分
   7             2008.5.14    添加时钟关闭程序
   8          -----------------------------------------------*/
   9          #include <reg52.h>
  10          #include <intrins.h>
  11          #include "lcd.h"
  12          #include "IIC.h"
  13          #include "common.h"
  14          
  15          
  16          
  17          //开始PCF8563T驱动程序
  18          
  19          /*--------------------------------------------------------------------------------
  20           调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
  21           函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
  22           的字节数,则会一次把时间读取到buff中。顺序是:
  23           0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
  24           ---------------------------------------------------------------------------------*/
  25           void GetPCF8563(uchar firsttype,uchar count,uchar *buff)
  26           {
  27   1       uchar i;
  28   1       start();
  29   1       sendbyte(0xA2);
  30   1       WaitAck();
  31   1       sendbyte(firsttype);
  32   1       WaitAck();
  33   1      
  34   1       start();
  35   1       sendbyte(0xA3);
  36   1       WaitAck();
  37   1      
  38   1       for (i=0;i<count;i++)
  39   1       {
  40   2       buff[i]=receivebyte();
  41   2       if (i!=count-1) ack();//除最后一个字节外,其他都要从MASTER发应答。
  42   2       }
  43   1       n_ack();
  44   1       stop();
  45   1      }
  46          
  47          
  48          
  49          //---------------------------------------------------------------------------------
  50           //调用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7
  51           //函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
  52           //0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
  53          //---------------------------------------------------------------------------------*/
  54          void SetPCF8563(uchar timetype,uchar value)
  55          {
C51 COMPILER V7.08   PCF8563                                                               03/23/2009 21:41:05 PAGE 2   

  56   1       start();
  57   1       sendbyte(0xA2);
  58   1       WaitAck();
  59   1       sendbyte(timetype);
  60   1       WaitAck();
  61   1       sendbyte(value);
  62   1       WaitAck();
  63   1       stop();
  64   1      }
  65          
  66          //---------------------PCF8563启动停止函数------------------------------------------
  67          void pcf8563start(void)
  68          {
  69   1      SetPCF8563(ctrl1,0x00);
  70   1      }
  71          
  72          void pcf8563stop(void)
  73          {
  74   1      SetPCF8563(ctrl1,0x20);
  75   1      }
  76          //---------------------PCF8563出始时间设定------------------------------------------
  77          void setime(void)
  78          { 
  79   1         /*SetPCF8563(year,0x08);
  80   1         SetPCF8563(month,0x03);
  81   1         SetPCF8563(week,0x01);
  82   1         SetPCF8563(day,0x03);
  83   1         SetPCF8563(hour,0x12);
  84   1         SetPCF8563(minute,0x00);*/
  85   1         GetPCF8563(minute,6,rbuf);
  86   1         time_display(rbuf);
  87   1         return;
  88   1      }
  89          /********************* 键盘识别程序 **********************/
  90          uint getch(void)
  91          {   uchar X,Y,Z;
  92   1          uint k;
  93   1              P1=0xff;
  94   1              P1=0x0f;       //先对P3置数  行扫描
  95   1              if(P1!=0x0f)     //判断是否有键按下
  96   1              {delay(10);    //延时,软件去干扰
  97   2          if(P1!=0x0f)   //确认按键按下X = P3;
  98   2              {       
  99   3          X=P1;       //保存行扫描时有键按下时状态
 100   3              P1=0xf0;       //列扫描
 101   3              Y=P1;          //保存列扫描时有键按下时状态
 102   3              Z=X|Y;         //取出键值
 103   3              
 104   3              switch ( Z )   //判断键值(那一个键按下)
 105   3              {
 106   4                      case 0xee: k=13; break; //对键值赋值
 107   4                      case 0xde: k=11; break; 
 108   4                      case 0xbe: k=0; break; 
 109   4                      case 0x7e: k=10; break; 
 110   4                      case 0xed: k=12; break; 
 111   4                      case 0xdd: k=9; break; 
 112   4                      case 0xbd: k=8; break; 
 113   4                      case 0x7d: k=7; break; 
 114   4                      case 0xeb: k=14; break; 
 115   4                      case 0xdb: k=6; break;  
 116   4                      case 0xbb: k=5;break; 
 117   4                      case 0x7b: k=4;break; 
C51 COMPILER V7.08   PCF8563                                                               03/23/2009 21:41:05 PAGE 3   

 118   4                      case 0xe7: k=15;break; 
 119   4                      case 0xd7: k=3;break; 
 120   4                      case 0xb7: k=2;break; 
 121   4                      case 0x77: k=1;break; 
 122   4                      default  : k=16;break;
 123   4              }                                      
 124   3              }
 125   2      }
 126   1        return k;
 127   1      }
 128          
 129          /********************* 键值判断程序**********************/
 130          void keyscan(void)
 131          {   uint key;
 132   1          uchar gw,sw;
 133   1              key=getch();
 134   1              delay(50);
 135   1          switch(key) //不同的键值做不同的处理
 136   1          {case 15:        count++;                          //mode 功能键
 137   2                               if((count>=1)&&(count<=6))
 138   2                               char_display(0x00,LabelCount++);
 139   2                                               else
 140   2                                               {count=0;
 141   3                                                LabelCount=0x3e;
 142   3                                                char_display(0x00,0x20);
 143   3                                               }
 144   2                                               break;  
 145   2           case 14:            GetPCF8563(second,1,vbuf);    
 146   2                           if(vbuf[0]&0x80)
 147   2                                               {lcd_init();
 148   3                                                lcd_display(0x41,battery_low);
 149   3                                                delay(1500);
 150   3                                                lcd_init();
 151   3                                                vbuf[0]=vbuf[0]&0x7f;
 152   3                            SetPCF8563(second,vbuf[0]);                                         count=0;           
 153   3                                               }
 154   2                                           else
 155   2                                               {lcd_init();
 156   3                                                lcd_display(0x01,battery_ok);
 157   3                                                delay(1500);
 158   3                                                lcd_init();
 159   3                                               }
 160   2                                               count=0;
 161   2                                               EnterCount=0;
 162   2                                               AlarmCount=0;
 163   2                                               DataCount=0;
 164   2                                               LightCount=0;
 165   2                                           break;
 166   2               case 12:                if(count==1)                      //相加键,递增键为1是调节年寄存器中的数值!
 167   2                                               {    
 168   3                                                        gw=rbuf[5]&0x0f;             //年的个位十位分离
 169   3                                sw=(rbuf[5]>>4)&0x0f;
 170   3                                                        if(gw==0x09)                 //判断个位和十位是否为9
 171   3                                                        {
 172   4                                                           if(sw==0x09)
 173   4                                                               {gw=0;
 174   5                                                                sw=0;
 175   5                                                               }
 176   4                                                               else
 177   4                                                               {  gw=0;
 178   5                                                                  sw+=1;
 179   5                                                               }
C51 COMPILER V7.08   PCF8563                                                               03/23/2009 21:41:05 PAGE 4   

 180   4                                                        }               
 181   3                                                    else
 182   3                                                        gw+=1;
 183   3                                                        
 184   3                                                        rbuf[5]=(sw<<4)+gw;
 185   3                                                        SetPCF8563(year,rbuf[5]);
 186   3                                              }
 187   2                                              else if(count==2)                         //调节月寄存器中的数值!
 188   2                                              {    
 189   3                                                   rbuf[4]=rbuf[4]&0x1f;
 190   3                                                       if(rbuf[4]==0x09)
 191   3                                                       rbuf[4]=0x10;
 192   3                                                       else if(rbuf[4]==0x12)
 193   3                                                       rbuf[4]=0x01;
 194   3                                                       else
 195   3                                                       rbuf[4]+=1;
 196   3                                                       SetPCF8563(month,rbuf[4]);
 197   3                                              }
 198   2                                              else if(count==4)
 199   2                                              {    
 200   3                                                   rbuf[3]=rbuf[3]&0x07;
 201   3                                                       if(rbuf[3]==0x06)
 202   3                                                       rbuf[3]=0x00;
 203   3                                                       else
 204   3                                                       rbuf[3]=rbuf[3]+1;
 205   3                                                       SetPCF8563(week,rbuf[3]);
 206   3                                              }
 207   2                                              else if(count==3)
 208   2                                              {   
 209   3                                           rbuf[2]=rbuf[2]&0x3f;
 210   3                                                       gw=rbuf[2]&0x0f;
 211   3                               sw=(rbuf[2]>>4)&0x0f;
 212   3                                                   if(rbuf[2]==0x31)                 //判断个位和十位是否为9
 213   3                                                        {gw=1;
 214   4                                                         sw=0;
 215   4                                                        }       
 216   3                                                   else if(gw==0x09)
 217   3                                                        {gw=0;
 218   4                                                         sw+=1;
 219   4                                                        }      
 220   3                                                       else 
 221   3                                                         gw+=1;
 222   3                                                        rbuf[2]=(sw<<4)+gw;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -