lesson 10.lst

来自「有51单片机C语言基础后在较短时间内学会51单片机C。」· LST 代码 · 共 385 行 · 第 1/2 页

LST
385
字号
C51 COMPILER V8.05a   LESSON_10                                                            02/05/2009 23:23:38 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE LESSON_10
OBJECT MODULE PLACED IN lesson 10.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lesson 10.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          
   5          uchar table1[]=" 2009-02-05";
   6          uchar table2[]="    23:23:55";
   7          uchar count,switch_num,flag,judge,day_full,week;
   8          uint year;
   9          char table3[7][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"}};
  10          char hour,minute,second,day,month,year1,year2;
  11          
  12          sbit s1=P3^2;
  13          sbit s2=P3^4;
  14          sbit rs=P3^0;
  15          sbit en=P3^1;
  16          sbit switch1=P3^5;       //功能键
  17          sbit switch2=P3^6;        //加1键
  18          sbit switch3=P3^7;        //减1键
  19          
  20          void delay(uint z);               //延时
  21          void intial_T0();         //定时器T0初始化
  22          void initial_LCD();                              //液晶显示初始化
  23          void write_cmd(uchar cmd_data);  //写命令
  24          void write_data(uchar data1);    //写数据
  25          void LCD_display(uchar address,uchar temp);  //年、月、日、时、分、秒显示
  26          void week_display(uchar week);            //星期显示
  27          void keyscan();         //键盘
  28          void count_month_year(); //判断闰年和非闰年个月的天数
  29          void count_day();               //年、月
  30          
  31          void main()
  32          {
  33   1              intial_T0();
  34   1              initial_LCD();
  35   1              while(1)
  36   1              {
  37   2                      keyscan();
  38   2              }
  39   1      }
  40          
  41          void delay(uint z)                        //延时
  42          {
  43   1              uint x,y;
  44   1              for(x=z;x>0;x--)
  45   1                      for(y=110;y>0;y--);
  46   1      }
  47          
  48          void intial_T0()   //T0初始化
  49          {
  50   1          second=56;minute=23;hour=23; week=4;
  51   1              day=5; month=2; year1=9; year2=20;
  52   1              TMOD=0x01;                      
  53   1              TH0=(65536-50000)/256;
  54   1              TL0=(65536-50000)%256;
  55   1              EA=1;
C51 COMPILER V8.05a   LESSON_10                                                            02/05/2009 23:23:38 PAGE 2   

  56   1              ET0=1;
  57   1              TR0=1;
  58   1      }
  59          
  60          void initial_LCD()
  61          {
  62   1              uchar i;
  63   1              en=0; switch1=1; switch2=1; switch3=1;
  64   1              write_cmd(0x38);        // 16X2 5X8显示
  65   1              write_cmd(0x0c);        //开显示 光标 闪烁
  66   1              write_cmd(0x06);        //地址指针自动加一,不移动
  67   1              write_cmd(0x01);        //清屏
  68   1              write_cmd(0x80);    //数据指针设置
  69   1          for(i=0;i<12;i++)
  70   1              {
  71   2                      write_data(table1[i]);
  72   2              }
  73   1              write_cmd(0x80+0x40);    //数据指针设置
  74   1              for(i=0;i<12;i++)
  75   1              {
  76   2                      write_data(table2[i]);   
  77   2              }
  78   1              week_display(4);           //写星期
  79   1      }
  80           
  81          void write_cmd(uchar cmd_data)   //1602液晶写命令子程序
  82          {
  83   1              rs=0;
  84   1              P2=cmd_data;    delay(1);          //P2为数据口
  85   1              en=1;   delay(1);
  86   1              en=0;
  87   1      }
  88          
  89          void write_data(uchar data1)  //1602液晶写数据子程序
  90          {
  91   1              rs=1;
  92   1              P2=data1;       delay(1);         //P2为数据口
  93   1              en=1;   delay(1);
  94   1              en=0;
  95   1      }
  96          
  97          void LCD_display(uchar address,uchar temp)
  98          {                                                                //LCD显示程序
  99   1          uchar shi,ge;
 100   1              shi=temp/10;
 101   1              ge=temp%10;
 102   1              write_cmd(0x80+0x40+address);    //数据指针设置
 103   1              if(flag==1)     write_cmd(0x80+address);
 104   1              write_data(0x30+shi);           
 105   1              write_data(0x30+ge);
 106   1              flag=0;
 107   1      }
 108          
 109          void week_display(uchar week1)
 110          {
 111   1              uchar i;
 112   1              write_cmd(0x80+12);
 113   1              for(i=0;i<3;i++)
 114   1              {
 115   2                      write_data(table3[week1][i]);
 116   2              }
 117   1      }
C51 COMPILER V8.05a   LESSON_10                                                            02/05/2009 23:23:38 PAGE 3   

 118          
 119          void keyscan()
 120          {
 121   1              if(switch1==0)                     //判断功能键是否按下
 122   1              {
 123   2                      delay(5);                        //去抖动
 124   2                      if(switch1==0)           //在判断功能键是否按下
 125   2                      {
 126   3                              while(!switch1);         //松手检测
 127   3                              delay(5);
 128   3                              switch_num++;            //功能键次数加一
 129   3                              TR0=0;
 130   3                              if(0<switch_num<=8)       //功能键1到3次液晶显示对应位闪烁
 131   3                                      write_cmd(0x0d);
 132   3                              if(switch_num==9)        //按4次功能键时钟运行
 133   3                              {
 134   4                                      switch_num=0;
 135   4                                      TR0=1;                     //时钟重新运行
 136   4                                      write_cmd(0x0c);   //消除闪烁
 137   4                              }
 138   3                  switch(switch_num)  //时 分 秒对应位闪烁
 139   3                              {       
 140   4                                      case 1: { write_cmd(0x80+0x40+11);}break;
 141   4                                      case 2: { write_cmd(0x80+0x40+8);}break;                                              
 142   4                                      case 3: { write_cmd(0x80+0x40+5);}break;
 143   4                                      case 4: { write_cmd(0x80+2);}break;
 144   4                                      case 5: { write_cmd(0x80+4);}break;
 145   4                                      case 6: { write_cmd(0x80+7);}break;
 146   4                                      case 7: { write_cmd(0x80+10);}break;
 147   4                                      case 8: { write_cmd(0x80+13);}break;                                  
 148   4                              }       
 149   3                      }       
 150   2              }
 151   1              if(switch_num!=0)                //判断功能键是否按下过
 152   1              {
 153   2                      if(switch2==0)           //判断加1键是否按下
 154   2                      {
 155   3                              delay(5);                 //去抖动
 156   3                              if(switch2==0)
 157   3                              {
 158   4                                      while(!switch2);
 159   4                                      delay(5);
 160   4                                      switch(switch_num)       
 161   4                                      {
 162   5                                              case 1:{second++;        //秒加1并刷新显示
 163   6                                                              if(second==60) second=0;
 164   6                                                              LCD_display(10,second);
 165   6                                                              write_cmd(0x80+0x40+11);}break;
 166   5                                              case 2:{minute++;        //分加1并刷新显示
 167   6                                                              if(minute==60) minute=0;
 168   6                                                              LCD_display(7,minute);
 169   6                                                              write_cmd(0x80+0x40+8);}break;
 170   5                                              case 3:{hour++;    //时加1并刷新显示
 171   6                                                              if(hour==24) hour=0;
 172   6                                                              LCD_display(4,hour);
 173   6                                                              write_cmd(0x80+0x40+5);}break;
 174   5                                              case 4:{year2++;           //年高二位加1并刷新显示
 175   6                                                              if(year2==100) year2=0;
 176   6                                                              flag=1;
 177   6                                                              LCD_display(1,year2);
 178   6                                                              write_cmd(0x80+2);}break;
 179   5                                              case 5:{year1++;             //年低二位加1并刷新显示
C51 COMPILER V8.05a   LESSON_10                                                            02/05/2009 23:23:38 PAGE 4   

⌨️ 快捷键说明

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