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

📄 16key-b.lst

📁 单片机中LED显示/数码管显示/键盘控制/蜂鸣器输出/中断应用/定时器和计数器/串口通信/键控看门狗/数据交换
💻 LST
字号:
C51 COMPILER V8.02   16KEY_B                                                               01/02/2007 14:41:16 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 16KEY_B
OBJECT MODULE PLACED IN 16KEY-B.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 16KEY-B.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************/
   2          /*                                                                 */
   3          /* ME500单片机开发系统演示程序 - 矩阵键盘键值显示                  */
   4          /*                                                                 */
   5          /* LCD1602显示                                                     */
   6          /*                                                                 */
   7          /* 版本: V1.0 (2006/11/20)                                        */
   8          /* 作者: gguoqing (Email: gguoqing@willar.com)                    */
   9          /* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) */
  10          /* 时间: 2006/05/27                                               */
  11          /*                                                                 */
  12          /*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved */
  13          /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
  14          /*                                                                 */
  15          /*******************************************************************/
  16          
  17          #include <reg51.h>
  18          #include <intrins.h>
  19                                  
  20          #define uchar unsigned char
  21          #define uint  unsigned int
  22          
  23          sbit BEEP = P3^7;          //蜂鸣器驱动线
  24          uchar  dis_buf;            //显示缓存
  25          uchar  temp;
  26          uchar  key;                //键顺序吗
  27          
  28          void beep();               //蜂鸣器
  29          void delay0(uchar x);      //x*0.14MS
  30          
  31          sbit LCD_RS = P2^0;             
  32          sbit LCD_RW = P2^1;
  33          sbit LCD_EN = P2^2;
  34          
  35          uchar code  cdis1[ ] = {"   KEY NUMBER   "};
  36          uchar code  cdis2[ ] = {"  KEY-CODE:   H "};
  37          
  38          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  39          
  40          /*************************************************************/
  41          /*                                                           */
  42          /* 延时子程序                                                */
  43          /*                                                           */
  44          /*************************************************************/
  45          
  46          void  delay(uchar x)
  47          { uchar j;
  48   1          while((x--)!=0)
  49   1          { for(j=0;j<125;j++)
  50   2               {;}
  51   2          }
  52   1      }
  53          
  54          /*************************************************************/
  55          /*                                                           */
C51 COMPILER V8.02   16KEY_B                                                               01/02/2007 14:41:16 PAGE 2   

  56          /*检查LCD忙状态                                              */
  57          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据  */
  58          /*                                                           */
  59          /*************************************************************/ 
  60          bit lcd_busy()
  61           {                          
  62   1          bit result;
  63   1          LCD_RS = 0;
  64   1          LCD_RW = 1;
  65   1          LCD_EN = 1;
  66   1          delayNOP();
  67   1          result = (bit)(P0&0x80);
  68   1          LCD_EN = 0;
  69   1          return(result); 
  70   1       }
  71          
  72          /*******************************************************************/
  73          /*                                                                 */
  74          /*写指令数据到LCD                                                  */
  75          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  76          /*                                                                 */
  77          /*******************************************************************/
  78          void lcd_wcmd(uchar cmd)
  79          
  80          {                          
  81   1         while(lcd_busy());
  82   1          LCD_RS = 0;
  83   1          LCD_RW = 0;
  84   1          LCD_EN = 0;
  85   1          _nop_();
  86   1          _nop_(); 
  87   1          P0 = cmd;
  88   1          delayNOP();
  89   1          LCD_EN = 1;
  90   1          delayNOP();
  91   1          LCD_EN = 0;  
  92   1      }
  93          
  94          /*******************************************************************/
  95          /*                                                                 */
  96          /*写显示数据到LCD                                                  */
  97          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  98          /*                                                                 */
  99          /*******************************************************************/
 100          void lcd_wdat(uchar dat)
 101          {                          
 102   1         while(lcd_busy());
 103   1          LCD_RS = 1;
 104   1          LCD_RW = 0;
 105   1          LCD_EN = 0;
 106   1          P0 = dat;
 107   1          delayNOP();
 108   1          LCD_EN = 1;
 109   1          delayNOP();
 110   1          LCD_EN = 0; 
 111   1      }
 112          
 113          /*************************************************************/
 114          /*                                                           */
 115          /*  LCD初始化设定                                            */
 116          /*                                                           */
 117          /*************************************************************/
C51 COMPILER V8.02   16KEY_B                                                               01/02/2007 14:41:16 PAGE 3   

 118          void lcd_init()
 119          { 
 120   1          delay(15);                   
 121   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 122   1          delay(5);
 123   1          lcd_wcmd(0x38);         
 124   1          delay(5);
 125   1          lcd_wcmd(0x38);         
 126   1          delay(5);
 127   1      
 128   1          lcd_wcmd(0x0c);      //显示开,关光标
 129   1          delay(5);
 130   1          lcd_wcmd(0x06);      //移动光标
 131   1          delay(5);
 132   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 133   1          delay(5);
 134   1      }
 135          
 136          /*************************************************************/
 137          /*                                                           */
 138          /*  设定显示位置                                             */
 139          /*                                                           */
 140          /*************************************************************/
 141          
 142          void lcd_pos(uchar pos)
 143          {                          
 144   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 145   1      }
 146          
 147          /*************************************************************/
 148          /*                                                           */
 149          /* 键扫描子程序                                              */
 150          /*                                                           */
 151          /*************************************************************/
 152           void  keyscan(void)
 153           { 
 154   1          P1=0x0F;                 //低四位输入  
 155   1          delay(1);
 156   1              temp=P1;                 //读P1口 
 157   1          temp=temp&0x0F;
 158   1          temp=~(temp|0xF0);
 159   1          if(temp==1)
 160   1              key=0;
 161   1          else if(temp==2)
 162   1              key=1;
 163   1          else if(temp==4)
 164   1              key=2;
 165   1          else if(temp==8)
 166   1              key=3;
 167   1          else
 168   1              key=16;
 169   1              
 170   1          P1=0xF0;                //高四位输入
 171   1          delay(1);
 172   1              temp=P1;                //读P1口       
 173   1          temp=temp&0xF0;
 174   1          temp=~((temp>>4)|0xF0);
 175   1          if(temp==1)
 176   1              key=key+0;
 177   1          else if(temp==2)
 178   1              key=key+4;
 179   1          else if(temp==4)
C51 COMPILER V8.02   16KEY_B                                                               01/02/2007 14:41:16 PAGE 4   

 180   1              key=key+8;
 181   1          else if(temp==8)
 182   1              key=key+12;
 183   1          else
 184   1              key=16;
 185   1              
 186   1           dis_buf = key;                  //键值入显示缓存
 187   1           dis_buf = dis_buf & 0x0f;
 188   1       
 189   1               if(dis_buf>9)               //转换为ASCII码
 190   1            dis_buf = dis_buf+0x37;
 191   1           else
 192   1                dis_buf = dis_buf+0x30;
 193   1       }
 194          
 195          /*************************************************************/
 196          /*                                                           */
 197          /*判断键是否按下                                             */
 198          /*                                                           */
 199          /*************************************************************/
 200           void  keydown(void)
 201           {  
 202   1              P1=0xF0;
 203   1              if(P1!=0xF0)
 204   1              {
 205   2                keyscan();
 206   2                beep();
 207   2          }
 208   1       }
 209          
 210          /*************************************************************/
 211          /*                                                           */
 212          /* 蜂鸣器响一声                                              */
 213          /*                                                           */
 214          /*************************************************************/
 215          void beep()
 216          {
 217   1        unsigned char i;
 218   1        for (i=0;i<180;i++)
 219   1         {
 220   2         delay0(6);
 221   2         BEEP=!BEEP;       //BEEP取反
 222   2         } 
 223   1         BEEP=1;           //关闭蜂鸣器
 224   1         delay(250);       //延时     
 225   1      }
 226          
 227          /*************************************************************/
 228          /*                                                           */
 229          /* 延时 x*0.14ms                                             */
 230          /*                                                           */
 231          /*************************************************************/
 232          
 233          void delay0(uchar x)    
 234          {
 235   1       unsigned char i;
 236   1        while(x--)
 237   1       {
 238   2        for (i = 0; i<13; i++) {}
 239   2       }
 240   1      }
 241          /*************************************************************/
C51 COMPILER V8.02   16KEY_B                                                               01/02/2007 14:41:16 PAGE 5   

 242          /*                                                           */
 243          /* 主程序                                                    */
 244          /*                                                           */
 245          /*************************************************************/ 
 246              main()
 247           {
 248   1          uchar m;
 249   1          P0=0xFF;                    //置P0口
 250   1          P2=0xFF;                    //置P2口  
 251   1          delay(10);                  //延时
 252   1          lcd_init();                 //初始化LCD             
 253   1              
 254   1          lcd_pos(0);                 //设置显示位置为第一行
 255   1          for(m=0;m<16;m++)
 256   1          lcd_wdat(cdis1[m]);
 257   1      
 258   1          lcd_pos(0x40);              //设置显示位置为第二行
 259   1           
 260   1          for(m=0;m<16;m++)
 261   1          lcd_wdat(cdis2[m]);
 262   1          dis_buf = 0x2d;             //显示字符"-"
 263   1      
 264   1          while(1)
 265   1          { 
 266   2             keydown();
 267   2                 lcd_pos(0x4c);             
 268   2             lcd_wdat(dis_buf);        //第一位数显示   
 269   2          }
 270   1        }   
 271          
 272          /************************************************************/  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    435    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       1
   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 + -