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

📄 main.lst

📁 基于AT89S52控制芯片的电子万年历程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "reg52.h"
   2          #include "intrins.h"
   3          #include "1602lib.h"
   4          #include "PCF8563lib.h"
*** WARNING C318 IN LINE 6 OF PCF8563lib.h: can't open file 'IIClib.h'
   5          
   6          #define PAI_BASE 15
   7          #define SCAN_CYCLE 10000
   8          
   9          #define SECONDL 12                                  /*定义显示字符位置*/
  10          #define SECONDH 11
  11          #define MINUTEL 9
  12          #define MINUTEH 8
  13          #define HOURL 6
  14          #define HOURH 5
  15          #define DAYL 10
  16          #define DAYH 9
  17          #define WEEKDAY 15
  18          #define MONTHS 5
  19          #define YEARL 15
  20          #define YEARH 14
  21          #define AMPM 14
  22          
  23          typedef enum{                                     /*定义枚举以标识当前设定位置*/
  24              CUR_SECOND,
  25              CUR_MINUTE,
  26              CUR_HOUR,
  27              CUR_DAY,
  28              CUR_WEEKDAY,
  29              CUR_MONTH,
  30              CUR_YEAR
  31          } Current;
  32          
  33          typedef enum{                                     /*定义枚举以标识显示内容*/
  34              SHOW_TIME,
  35              SHOW_ALARM
  36          } ShowItem;
  37          
  38          uchar str1[] = "TIME:15:23:14 W7";                  /*初始显示时间*/
  39          uchar str2[] = "DATE:JUN.30,2007";
  40          bit alarmflg = 0;
  41          bit timerflg = 0;
  42          bit flg_100ms = 0;
  43          struct c_s cs;
  44          struct time tm;
  45          struct alarm alm;
  46          uchar set_min = 0,set_hour = 0,set_day = 0,set_weekday = 0,set_month = 0,set_year = 0,set_second = 0;
  47          uchar setalarm_min = 0,setalarm_hour = 0;
  48          Current current = CUR_MINUTE;
  49          ShowItem showitem = SHOW_TIME;
  50          uint keyFlag;
  51          
  52          bit Int0Flag = 0;
  53          uchar s_tableCounter,musicplayflg = 0;
  54          uchar TH0Temp,TL0Temp;
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 2   

  55          const char code c_music[] = { 0x82,0x01,0x81,0x94,0x84,     /*闹钟用生日快乐歌*/
  56                                        0xb4,0xa4,0x04,
  57                                        0x82,0x01,0x81,0x94,0x84,
  58                                        0xc4,0xb4,0x04,
  59                                        0x82,0x01,0x81,0xf4,0xd4,
  60                                        0xb4,0xa4,0x94,
  61                                        0xe2,0x01,0xe1,0xd4,0xb4,
  62                                        0xc4,0xb4,0x04,
  63                                        0x00};
  64          const uint code c_musicFreq[] = {64260,64400,64524,64580,  /*低音5,6,7,中音1*/
  65                                            64684,64777,64820,64898,  /*中音2,3,4,5*/
  66                                            64968,65030,65058,65110,  /*中音6,7,高音1,2*/
  67                                            65157,65178,65217};       /*高音2,3,4,5*/
  68                                            
  69          void TxData(uchar dat);
  70          void Delay(uint n);
  71          void ModShow(struct time tm);                         /*调整显示内容函数*/
  72          uchar Ascii(uchar dat);                                /*获取数字ASCII码函数*/
  73          void Months(uchar dat);                               /*月份数字转字符函数*/
  74          void PCF8563_Init(void);                 /*初始化PCF8563,包括控制状态寄存器,时间及闹钟*/
  75          void ModAlarm(struct alarm* alm);                    /*调整闹钟时间模块*/
  76          void ModTime(struct time * tm);                       /*调整时间模块*/
  77          void ScanKeys(void);                                 /*扫描键盘模块*/
  78          uchar KeyJudge(void);                                  /*按键预处理*/    
  79          void KeyHandle(uchar KeyIndex);                       /*按键处理模块*/
  80          
  81          void main(void)
  82          {
  83   1          TMOD = 0x11;          /*TIMER0工作在MODE1,16位定时器,TIMER1工作在MODE2,自动重新装载模式*/
  84   1          
  85   1          TH0 = 65536;
  86   1          TL0 = 65536;
  87   1          TH1 = (65536-SCAN_CYCLE)/256;       /*设定TIMER1每隔SCAN_CYCLE 毫秒中断一次*/
  88   1          TL1 = (65536-SCAN_CYCLE)%256;
  89   1          TR1 = 1;                               /*启动TIMER1*/
  90   1          T2CON =0X38;                           /*令定时器2作为串口波特率发生器*/
  91   1          TL2 = 0Xd9;                             /*设定串口波特率为9600,晶振为12MHz*/
  92   1          TH2 = 0Xff;
  93   1          RCAP2L = 0Xd9;                           /*根据串口波特率9600设定自动重载寄存器*/
  94   1          RCAP2H = 0xff;
  95   1          TR2 = 1;
  96   1          SCON = 0X50;         /*设定UART工作在MODE3模式,可传送和接收数据,REN=1*/
  97   1          IE = 0X8a;            /*使能中断,TIMER0,1中断,外部中断1,2*/
  98   1          P2 = 0Xff;
  99   1          
 100   1          LCD_init();                         /*LCD初始化*/
 101   1          DisplayString(0,0,str1);            /*显示第一行字符*/
 102   1          DisplayString(0,1,str2);            /*显示第二行字符*/
 103   1          PCF8563_Init();                     /*PCF8563初始化*/
 104   1          
 105   1      while(1)
 106   1      {
 107   2          uchar keyPtr;
 108   2          keyPtr = KeyJudge();                /*键盘扫描判断*/
 109   2          if(keyPtr!=0x55)                    /*如果按某键则进行相应处理*/
 110   2          {
 111   3              KeyHandle(keyPtr);
 112   3          }
 113   2          
 114   2          if(flg_100ms){                      /*判断100MS到否*/
 115   3             flg_100ms = 0;
 116   3             if(showitem == SHOW_TIME){       /*如果需要时间显示*/
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 3   

 117   4                  PCF8563_ReadTime(&tm);        /*读PCF8563时间*/
 118   4                  ModShow(tm);                  /*调整显示内容*/
 119   4                  DisplayString(0,0,str1);      /*显示第一行字符*/
 120   4                  DisplayString(0,1,str2);      /*显示第二行字符*/
 121   4                  
 122   4                  PCF8563_ReadCS(&cs);          /*读PCF8563控制/状态字*/
 123   4                  if((cs.cs2&0x08)==0x08){      /*如果闹钟时间到*/
 124   5                      musicplayflg = 1;         /*设置播放音乐标志*/
 125   5                      TR0 = 1;                  /*启动TIMER0*/
 126   5                      cs.cs2 &= 0xf7;           /*清闹钟标志位*/
 127   5                      PCF8563_SetCS(cs);        /*写PCF8563控制/状态字*/
 128   5                  }      
 129   4             }else if(showitem == SHOW_ALARM);{  /*如果需要显示闹钟时间*/
 130   4                  ModAlarm(&alm);                /*调整闹钟时间*/
 131   4                  tm.minutes = alm.minute;        /*将闹钟时间作为时间显示*/
 132   4                  tm.hours = alm.hour;
 133   4                  tm.days = alm.day;
 134   4                  tm.weekdays = alm.weekday;
 135   4                  ModShow(tm);                     /*调整显示内容*/
 136   4                  DisplayString(0,0,str1);         /*显示第一行字符*/
 137   4                  DisplayString(0,1,str2);          /*显示第二行字符*/
 138   4                  }
 139   3              }
 140   2      }
 141   1      }
 142          void PCF8563_Init(void)
 143          {
 144   1          cs.cs1 = 0x00;
 145   1          cs.cs2 = 0x02;                            /*使能闹钟*/
 146   1          PCF8563_SetCS(cs);                        /*设置控制/状态字*/
 147   1          
 148   1          tm.seconds = 50;                          /*设置初始时间*/
 149   1          tm.minutes = 58;
 150   1          tm.hours = 23;
 151   1          tm.days = 31;
 152   1          tm.weekdays = 2;
 153   1          tm.mon_cen = 12;
 154   1          tm.years = 6;
 155   1          PCF8563_SetTime(tm);                      
 156   1          
 157   1          alm.minute = 59;                          /*设定初始闹钟时间*/
 158   1          alm.hour = 23;
 159   1          alm.day = 00;
 160   1          alm.weekday = 2;
 161   1          PCF8563_SetAlarm(alm,1,1,0,0);              /*设置闹钟*/   
 162   1      }
 163          
 164          void ModShow(struct time tm)
 165          {
 166   1          uchar tmpL,tmpH;
 167   1          
 168   1          tmpL = tm.seconds & 0x0f;                   /*调整秒显示*/
 169   1          tmpH = (tm.seconds & 0x7f)>>4;               /*屏蔽VL位*/
 170   1          str1[SECONDL] = Ascii(tmpL);
 171   1          str1[SECONDH] = Ascii(tmpH);
 172   1          
 173   1          tmpL = tm.minutes & 0x0f;                    /*调整分钟显示*/
 174   1          tmpH = tm.minutes>>4;
 175   1          str1[MINUTEL] = Ascii(tmpL);
 176   1          str1[MINUTEH] = Ascii(tmpH);
 177   1          
 178   1          tmpL = tm.hours & 0x0f;                     /*调整小时显示*/
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 4   

 179   1          tmpH = tm.hours>>4;
 180   1          str1[HOURL] = Ascii(tmpL);
 181   1          str1[HOURH] = Ascii(tmpH);
 182   1          
 183   1          tmpL = tm.days & 0x0f;                    /*调整天显示*/
 184   1          tmpH = tm.days>>4;
 185   1          str2[DAYL] = Ascii(tmpL);
 186   1          str2[DAYH] = Ascii(tmpH);
 187   1          
 188   1          tmpL = tm.weekdays & 0x07;              /*调整星期显示*/
 189   1          str1[WEEKDAY] = Ascii(tmpL);
 190   1          
 191   1          tmpL = ((tm.mon_cen&0x7f)>>4)*10 + tm.mon_cen & 0x0f; /*体制哦啊横月份显示(BCD到HEX)*/
 192   1          Months(tmpL);                             /*月份数字转字符*/
 193   1          
 194   1          tmpL = tm.years & 0x0f;                    /*调整年显示*/
 195   1          tmpH = tm.years>>4;
 196   1          str2[YEARL] = Ascii(tmpL);
 197   1          str2[YEARH] = Ascii(tmpH);
 198   1      }
 199          
 200          uchar Ascii(uchar dat)
 201          {
 202   1            return dat + 0x30;                     /*0~9得Ascii码为其+0x30*/
 203   1      }
 204          
 205          void Months(uchar dat)
 206          {
 207   1          switch(dat){
 208   2          case 1:str2[MONTHS]='J';str2[MONTHS+1]='A';str2[MONTHS+2]='N';break;
 209   2          case 2:str2[MONTHS]='F';str2[MONTHS+1]='E';str2[MONTHS+2]='B';break;
 210   2          case 3:str2[MONTHS]='M';str2[MONTHS+1]='A';str2[MONTHS+2]='R';break;
 211   2          case 4:str2[MONTHS]='A';str2[MONTHS+1]='P';str2[MONTHS+2]='R';break;
 212   2          case 5:str2[MONTHS]='M';str2[MONTHS+1]='A';str2[MONTHS+2]='Y';break;
 213   2          case 6:str2[MONTHS]='J';str2[MONTHS+1]='U';str2[MONTHS+2]='N';break;

⌨️ 快捷键说明

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