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

📄 51

📁 51单片机大量源码
💻
字号:
C51 COMPILER V8.09   SHIZHONG                                                              07/12/2010 14:21:40 PAGE 1   


C51 COMPILER V8.09, COMPILATION OF MODULE SHIZHONG
OBJECT MODULE PLACED IN shizhong.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE shizhong.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //按4X4键盘的F键 进入设定状态
   2          //E D 键是前后移动键
   3          //C按键是调整数值按键
   4          #include "reg52.h"
   5          #define uchar unsigned char
   6          sbit RW=P2^6;
   7          sbit RS=P2^7;
   8          sbit E=P2^5;
   9          bit at=0;
  10          uchar code shen[]={"CLOCK!"};
  11          uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};
  12          uchar dispbuf[8],h,m,s,counter;
  13          void delay()
  14          {
  15   1        uchar i;
  16   1       for(i=0;i<255;i++);
  17   1      }
  18          
  19           
  20          
  21          /*******写命令**********/
  22          void lcd_wmc(uchar i)
  23          {
  24   1      
  25   1        P0=i;
  26   1        RS=0;
  27   1        RW=0;
  28   1        E=0;
  29   1        delay();
  30   1        E=1;
  31   1      }
  32          
  33           
  34          
  35          /*******写数据***********/
  36          
  37          void lcd_wmd(uchar i)
  38          {
  39   1      
  40   1        P0=i;
  41   1        RS=1;
  42   1        RW=0;
  43   1        E=0;
  44   1        delay();
  45   1        E=1;
  46   1      }
  47          
  48           
  49          
  50          
  51          /*******初始化液晶*******/
  52          void lcd_init()
  53          {
  54   1        uchar i;
  55   1        lcd_wmc(0x01);
C51 COMPILER V8.09   SHIZHONG                                                              07/12/2010 14:21:40 PAGE 2   

  56   1        lcd_wmc(0x38);
  57   1        lcd_wmc(0x0c);
  58   1        lcd_wmc(0x06);
  59   1        lcd_wmc(0xc9);
  60   1        for(i=0;i<6;i++)
  61   1        lcd_wmd(shen[i]);
  62   1        lcd_wmc(0xc0);
  63   1      }
  64          
  65           
  66          
  67           
  68          
  69          /*******更新缓冲区子程序*******/
  70          void newbuf()
  71          {
  72   1       dispbuf[0]=s%10;
  73   1       dispbuf[1]=s/10;
  74   1       dispbuf[3]=m%10;
  75   1       dispbuf[4]=m/10;
  76   1       dispbuf[6]=h%10;
  77   1       dispbuf[7]=h/10;
  78   1      }
  79          
  80           
  81          
  82          /*******显示子程序**********/
  83          void disp(uchar dispadd)
  84          {
  85   1         uchar tmp;
  86   1         lcd_wmc(dispadd);
  87   1         tmp=dispbuf[7];
  88   1         tmp=word[tmp];
  89   1         lcd_wmd(tmp);
  90   1         tmp=dispbuf[6];
  91   1         tmp=word[tmp];
  92   1         lcd_wmd(tmp);
  93   1         tmp=dispbuf[5];
  94   1         tmp=word[tmp];
  95   1         lcd_wmd(tmp);
  96   1         tmp=dispbuf[4];
  97   1         tmp=word[tmp];
  98   1         lcd_wmd(tmp);
  99   1         tmp=dispbuf[3];
 100   1         tmp=word[tmp];
 101   1         lcd_wmd(tmp);
 102   1         tmp=dispbuf[2];
 103   1         tmp=word[tmp];
 104   1         lcd_wmd(tmp);
 105   1         tmp=dispbuf[1];
 106   1         tmp=word[tmp];
 107   1         lcd_wmd(tmp);
 108   1         tmp=dispbuf[0];
 109   1         tmp=word[tmp];
 110   1         lcd_wmd(tmp); 
 111   1      }
 112          
 113           
 114          
 115           
 116          
 117          /*********************键盘子程序***********************/
C51 COMPILER V8.09   SHIZHONG                                                              07/12/2010 14:21:40 PAGE 3   

 118          
 119          uchar keypro(void)
 120          {
 121   1        uchar scanl,scanh;
 122   1        P1=0x0f;//先将所有行线拉低
 123   1        if((P1&0x0f)!=0x0f) //如果列线有变化
 124   1        {
 125   2          delay();//延迟一段时间。
 126   2          if((P1&0x0f)!=0x0f)//如果此时此刻列线还有变化,说明确实有按键按下
 127   2          {
 128   3            scanl=0xfe;
 129   3            while((scanl&0x10)!=0)
 130   3            {
 131   4              P1=scanl; //给P1口赋扫描码,每次只拉低一行
 132   4              if((P1&0xf0)!=0xf0) //如果判断为真,则说明找到了按键按下的行
 133   4              {
 134   5                scanh=(P1&0xf0)|0x0f; //计算识别码
 135   5                return (~scanh)+(~scanl);
 136   5               }
 137   4              else scanl=(scanl<<1)|0x01; //否则依次将第二,第三,第四行拉低 
 138   4      
 139   4            }
 140   3          } 
 141   2        } 
 142   1        return 0;//没有按键  按下 返回0
 143   1      }
 144          
 145          
 146          /********************时间调整子程序********************/
 147          void adjustime()
 148          {
 149   1        uchar k;
 150   1        static uchar add;
 151   1        k=keypro();
 152   1        switch(k)
 153   1        {
 154   2         case 0x88: if(!at){add=0xc1;EA=0;lcd_wmc(0xc1);lcd_wmc(0x0f);at=1;}
 155   2                     else {lcd_wmc(0xc0);lcd_wmc(0x0c);at=0;EA=1;} break;
 156   2      
 157   2         case 0x48:  if(at)
 158   2                   {
 159   3             if(add==0xc1){add=0xc7; lcd_wmc(add);}
 160   3                       else {add=add-3;lcd_wmc(add);}
 161   3                     }
 162   2               break;
 163   2        
 164   2        case 0x28:  if(at)
 165   2                   {
 166   3                     if(add==0xc7) {add=0xc1;lcd_wmc(add);}
 167   3                       else {add=add+3;lcd_wmc(add);}
 168   3                 }
 169   2             break;
 170   2      
 171   2         case 0x18: if(at)
 172   2                  {
 173   3                    if(add==0xc1) h++;
 174   3                      if(h==24)
 175   3                h=0;
 176   3                      if(add==0xc4) m++;
 177   3               if(m==60)
 178   3                 m=0;
 179   3                      if(add==0xc7) s++;
C51 COMPILER V8.09   SHIZHONG                                                              07/12/2010 14:21:40 PAGE 4   

 180   3                if(s==60)
 181   3                 s=0;
 182   3                 newbuf();
 183   3            disp(0xc0);
 184   3            lcd_wmc(add);
 185   3                    }
 186   2                     break;
 187   2        default: break;
 188   2        }
 189   1        if(k!=0)
 190   1         {
 191   2        while((P1&0xf0)!=0xf0)
 192   2        P1=0xf0;
 193   2       }
 194   1      
 195   1      }
 196          
 197           
 198          
 199           
 200          
 201           
 202          
 203          /*********************初始化子程序**********************/
 204          void init()
 205          {
 206   1      
 207   1        TMOD=0x01;
 208   1        TH0=0x4c;
 209   1        TL0=0x00;
 210   1        EA=1;
 211   1        ET0=1;
 212   1        TR0=1;
 213   1        counter=0;
 214   1        h=12;m=0;s=0;
 215   1        dispbuf[2]=10;
 216   1        dispbuf[5]=10;
 217   1      }
 218          
 219           
 220          
 221           
 222          
 223           
 224          
 225          /***************************主程序************************/
 226          
 227          void main(void)
 228          { 
 229   1        init();
 230   1        lcd_init();
 231   1      
 232   1        while(1)
 233   1        {
 234   2         adjustime();
 235   2         if(!at)
 236   2       {
 237   3           //闪烁
 238   3            if(counter<10)        
 239   3            {
 240   4             dispbuf[2]=10;
 241   4             dispbuf[5]=10;
C51 COMPILER V8.09   SHIZHONG                                                              07/12/2010 14:21:40 PAGE 5   

 242   4            }
 243   3            else
 244   3            {            
 245   4             dispbuf[2]=11;
 246   4             dispbuf[5]=11;
 247   4            }
 248   3            //更新显示缓冲区及调用显示程序
 249   3            if(counter==0)
 250   3            {
 251   4             newbuf();
 252   4             disp(0xc0);
 253   4             }
 254   3            else if(counter==10)
 255   3            disp(0xc0);  
 256   3          }
 257   2         }
 258   1      }
 259          
 260           
 261          
 262           
 263          
 264           
 265          
 266          
 267          /*************************定时器0的中断**********************/
 268          void Time0() interrupt 1 using 2    //再次强调中断子程序执行时间越短越好
 269          {
 270   1        TH0=(65536-46075)/256;
 271   1        TL0=(65536-46075)%256;
 272   1        counter++;
 273   1        if(counter==20)
 274   1        {
 275   2          s++;
 276   2        counter=0;
 277   2        if(s==60)
 278   2        { 
 279   3          m++;
 280   3          s=0;
 281   3            if(m==60)
 282   3          {
 283   4            h++;
 284   4          m=0;
 285   4          if(h==24)
 286   4           h=0;
 287   4               }
 288   3             }
 289   2      
 290   2        }
 291   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    588    ----
   CONSTANT SIZE    =     19    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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