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

📄 12864 万年历.lst

📁 自己写的万年历程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   12864_万年繽                                                          03/11/2009 21:07:34 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 12864_万年繽
OBJECT MODULE PLACED IN 12864 万年历.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 12864 万年历.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*====================================
   2          程序设计:王树茂
   3          程序名称:12864万年历
   4          设计日期:2008年10月 9日-10日
   5          =====================================*/
   6          #include <reg52.h>
   7          #include<intrins.h>
   8          #define uchar unsigned char
   9          #define uint unsigned int
  10          /*口定义*/
  11          #define lcd P0       
  12          sbit lcdrs=P1^2;
  13          sbit lcden=P1^4;
  14          sbit lcdpsb=P1^1;
  15          sbit lcdwr=P1^3;
  16          sbit tem_in=P2^3;
  17          /*按键定义*/
  18          sbit K1 = P3^4; //设定   
  19          sbit K2 = P3^5; //加
  20          sbit K3 = P3^6; //减
  21          /*变量定义*/
  22          uchar hour,min,sec,sec100,nian,yue,ri,xq,wendu;
  23          uchar temp_h,temp_l; //温度值变量
  24          uint a;
  25          uchar keynum;
  26          
  27          /*函数声明*/
  28          void write_op(uchar instruction);
  29          void write_dat(uchar indata);
  30          void ini_dis();
  31          void lcd_ini();
  32          void inc_sec();
  33          void inc_min();
  34          void inc_hour();
  35          void inc_nian();
  36          void inc_yue();
  37          void inc_ri();
  38          void inc_xq();
  39          
  40          void dec_min();
  41          void dec_hour();
  42          void dec_nian();
  43          void dec_yue();
  44          void dec_ri();
  45          void dec_xq();
  46          void showxq();
  47          
  48          void key_scan();
  49          
  50          /*字符表*/
  51          uchar code dis_char[16]="电气信息工程学院";
  52          uchar code dis_char1[16]="公元08年10月01日";
  53          uchar code dis_char2[16]="下午12时00分00秒";
  54          uchar code dis_char3[16]="星期三温度:+00度";
  55          uchar code dis_code[10]={'0','1','2','3','4','5','6','7','8','9'};
C51 COMPILER V7.06   12864_万年繽                                                          03/11/2009 21:07:34 PAGE 2   

  56          uchar code dis_code1[14]="一二三四五六日";
  57          /*延时函数*/
  58          void delayms(uint m)    
  59          {
  60   1              uchar x,y;
  61   1              for(x=m;x>0;x--)
  62   1                      for(y=110;y>0;y--);
  63   1      }
  64          
  65          
  66          /*====================================
  67          以下是温度的函数模块
  68          =====================================*/
  69          
  70          void Delay_us(uchar n)
  71          {
  72   1              uchar i;
  73   1              i=0;
  74   1              while(i<n)
  75   1              i++;
  76   1      }
  77          
  78          /*====================================
  79          函数功能:DS18B20重设
  80          =====================================*/
  81          
  82          void dsreset(void)
  83          {
  84   1              uint i;
  85   1              tem_in=0;
  86   1              i=100;
  87   1              while(i>0)i--;
  88   1              tem_in=1;
  89   1              i=4;
  90   1              while(i>0)i--;
  91   1      }
  92          
  93          /*====================================
  94          函数功能:直接读一字节程序
  95          =====================================*/
  96          
  97          uchar ReadByte(void)
  98          {
  99   1              uchar i,k;
 100   1              i=8;
 101   1              k=0;
 102   1              while(i--)
 103   1              {       
 104   2                  tem_in=1;
 105   2                      Delay_us(2);
 106   2                      tem_in=0;
 107   2                      k=k>>1;
 108   2                      tem_in=1;
 109   2                      if(tem_in)
 110   2                      k |= 0x80;
 111   2                      Delay_us(2);
 112   2                      
 113   2              }
 114   1              return(k);
 115   1      }
 116          
 117          /*====================================
C51 COMPILER V7.06   12864_万年繽                                                          03/11/2009 21:07:34 PAGE 3   

 118          函数功能:向B20写一字节
 119          =====================================*/
 120          
 121          void tmpwrite(unsigned char dat)
 122          {       
 123   1              uint i;
 124   1              uchar j;
 125   1              bit testb;
 126   1              for(j=1;j<=8;j++)
 127   1              {       testb=dat&0x01;
 128   2                      dat=dat>>1;
 129   2                      if(testb)
 130   2                      {       tem_in=0;
 131   3                              i++;
 132   3                              i++;
 133   3                              tem_in=1;
 134   3                              i=8;
 135   3                              while(i>0)
 136   3                              i--;
 137   3                      }
 138   2                      else
 139   2                      {
 140   3                              tem_in=0;
 141   3                              i=8;
 142   3                              while(i>0)
 143   3                              i--;
 144   3                              tem_in=1;
 145   3                              i++;
 146   3                              i++;
 147   3                      }
 148   2              }
 149   1      }
 150          
 151          /*====================================
 152          函数功能:启动温度转换
 153          =====================================*/
 154          void tmpchange(void)                    
 155          {
 156   1              dsreset();                                              /*复位*/
 157   1              delayms(1);
 158   1              tmpwrite(0xcc);                                 //跳过序列号命令
 159   1              tmpwrite(0x44);                                 //转换命令
 160   1      }
 161          
 162          /*====================================
 163          函数功能:将温度值读出来并转化为显示数组
 164          =====================================*/
 165          
 166          void tmp(void)
 167          {       
 168   1              uint dis;
 169   1              dsreset();
 170   1      
 171   1              delayms(1);
 172   1              tmpwrite(0xcc);
 173   1              tmpwrite(0xbe);
 174   1              temp_l=ReadByte();//低位在前                            
 175   1              temp_h=ReadByte();//高位在后
 176   1              
 177   1              if((temp_h&0xf8)==0)
 178   1              {
 179   2                      dis=temp_h*16+temp_l/16;
C51 COMPILER V7.06   12864_万年繽                                                          03/11/2009 21:07:34 PAGE 4   

 180   2                      write_op(0x9d);
 181   2                      write_dat(':');
 182   2                      write_dat('+');
 183   2                      write_op(0x9e);
 184   2              write_dat(dis_code[((dis)%100)/10]);
 185   2                      write_dat(dis_code[((dis)%100)%10]);
 186   2              }
 187   1              else
 188   1              {   
 189   2                      dis=temp_h*16+temp_l/16;
 190   2                      dis=~dis+1;
 191   2                      write_op(0x9d);
 192   2                      write_dat(':');
 193   2                      write_dat('-');
 194   2                      write_op(0x9e);
 195   2                      write_dat(dis_code[dis/10]);
 196   2                      write_dat(dis_code[dis%10]);
 197   2              }       
 198   1      }
 199          
 200          /*====================================
 201          以下是液晶12864的模块函数
 202          =====================================*/
 203          /*====================================
 204          函数功能:写控制字给12864
 205          =====================================*/
 206          void write_op(uchar instruction)
 207          {
 208   1              delayms(5);
 209   1              lcdrs=0;
 210   1              lcdwr=0;
 211   1              lcd=instruction;
 212   1              lcden=1;
 213   1              _nop_();
 214   1              lcden=0;
 215   1      }
 216          /*====================================
 217          函数功能:写显示数据给12864
 218          =====================================*/
 219          void write_dat(uchar indata)
 220          {       
 221   1              delayms(5);
 222   1              lcdrs=1;
 223   1              lcdwr=0;
 224   1              lcd=indata;
 225   1              lcden=1;
 226   1          _nop_();
 227   1              lcden=0;
 228   1      }
 229          /*====================================
 230          函数功能:初始化12864
 231          =====================================*/
 232          void lcd_ini()
 233          {       
 234   1          lcdpsb=1;   
 235   1          write_op(0x30);//功能设定
 236   1              write_op(0x01);//清除显示
 237   1          write_op(0x0c);//显示设定
 238   1          write_op(0x06);
 239   1      }
 240          /*====================================
 241          以下是和时间相关的函数模块
C51 COMPILER V7.06   12864_万年繽                                                          03/11/2009 21:07:34 PAGE 5   

 242          =====================================*/
 243          /*====================================
 244          函数功能:秒加
 245          =====================================*/
 246          void inc_sec()
 247          {
 248   1              sec++;
 249   1              tmpchange();                                    /*启动温度转换  每秒转换一次*/
 250   1              delayms(2);                                             /*等待转换结束,可不用,会对显示产生影响*/
 251   1              tmp();                                                  /*读取温度转换结果*/
 252   1              if(sec==60)
 253   1              {
 254   2                      sec = 0;
 255   2                      inc_min();
 256   2              }
 257   1              write_op(0x8e);
 258   1              write_dat(dis_code[sec / 10]);
 259   1              write_dat(dis_code[sec % 10]);
 260   1      }
 261          /*====================================
 262          函数功能:分加
 263          =====================================*/
 264          void inc_min()
 265          {
 266   1              min++;
 267   1              if(min ==60)
 268   1              {
 269   2                      min = 0;
 270   2                      inc_hour();
 271   2              }
 272   1              write_op(0x8c);
 273   1              write_dat(dis_code[min / 10]);
 274   1              write_dat(dis_code[min % 10]);
 275   1      }
 276          /*====================================
 277          函数功能:时加
 278          =====================================*/
 279          void inc_hour()
 280          {
 281   1              hour++;
 282   1              if(hour == 24)
 283   1              {
 284   2                      hour = 0;
 285   2                      inc_ri();
 286   2              }
 287   1              if(hour>=6&&hour<12)
 288   1              {
 289   2                      write_op(0x88);
 290   2                      write_dat(0xc9);
 291   2                      write_dat(0xcf);
 292   2                      write_dat(0xce);

⌨️ 快捷键说明

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