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

📄 keyscan.lst

📁 键盘扫描程序
💻 LST
字号:
C51 COMPILER V8.02   KEYSCAN                                                               06/04/2007 21:32:09 PAGE 1   


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

line level    source

   1          #include <reg52.h>                              // 引用标准库的头文件
   2          #include <intrins.h>
   3          
   4          #define  uchar  unsigned  char 
   5          #define  uint   unsigned  int 
   6          
   7          sbit DIN = P2^0;                                        // 串行数据输入
   8          sbit CLK = P2^1;                                        // 串行时钟
   9          sbit LOAD = P2^2;                                       // 显示数据锁存控制
  10          
  11          
  12          
  13          #define Digit0 0x01                     // 数码管1寄存器
  14          #define Digit1 0x02                     // 数码管2寄存器
  15          #define Digit2 0x03                     // 数码管3寄存器
  16          #define Digit3 0x04                     // 数码管4寄存器
  17          #define Digit4 0x05                     // 数码管5寄存器
  18          #define Digit5 0x06                     // 数码管6寄存器
  19          #define Digit6 0x07                     // 数码管7寄存器
  20          #define Digit7 0x08                     // 数码管8寄存器
  21          
  22          
  23          #define DecodeMode  0x09                // 译码模式寄存器
  24          #define Intensity   0x0a                // 亮度寄存器
  25          #define ScanLimit   0x0b                // 扫描位数寄存器
  26          #define ShutDown    0x0c                // 低功耗模式寄存器
  27          #define DisplayTest 0x0f                // 显示测试寄存器
  28          
  29          
  30          #define ShutdownMode    0x00            // 低功耗方式
  31          #define NormalOperation 0x01            // 正常操作方式
  32          
  33          #define ScanDigit       0x07        // 扫描位数设置,显示8位数码管
  34          #define DecodeDigit     0xff            // 译码设置,8位均为BCD码
  35          #define IntensityGrade  0x0a            // 亮度级别设置
  36          
  37          #define TestMode        0x01        // 显示测试模式
  38          #define TextEnd         0x00        // 显示测试结束,恢复正常工作模式
  39          
  40          
  41          
  42          uchar  keycode;
  43          uchar  numbit,digit[5];
  44          void KeyDisplay(void);
  45          void clear(void);
  46          
  47          /* 延时t毫秒 */
  48          void delay(uint t)
  49          {
  50   1              uint i;
  51   1              while(t--)
  52   1              {
  53   2                      /* 对于12M时钟,约延时1ms */
  54   2                      for (i=0;i<125;i++)
  55   2                      {}
C51 COMPILER V8.02   KEYSCAN                                                               06/04/2007 21:32:09 PAGE 2   

  56   2              }
  57   1      }
  58          
  59          
  60          
  61          /* 向MAX7219写入字节(8位)*/
  62          void SendChar (uchar ch)
  63          {
  64   1              uchar i,temp;
  65   1          _nop_();
  66   1          for (i=0;i<8;i++)
  67   1          {
  68   2                      temp=ch&0x80;
  69   2              ch=ch<<1;
  70   2              if(temp)
  71   2              {
  72   3                      DIN=1;
  73   3                      CLK=0;
  74   3                      CLK=1;
  75   3              }
  76   2              else
  77   2              {
  78   3                      DIN=0;
  79   3                      CLK=0;
  80   3                      CLK=1;
  81   3              }
  82   2          }
  83   1      }
  84          
  85          
  86          
  87          /* 向MAX7219写入字(16位)*/
  88          void WriteWord (uchar addr,uchar num)
  89          {
  90   1          LOAD=0;
  91   1          _nop_();
  92   1          SendChar(addr);
  93   1          _nop_();
  94   1          SendChar(num);
  95   1          _nop_();
  96   1          LOAD=1;                             // 锁存进相应寄存器
  97   1      }
  98          
  99          
 100          
 101          /* MAX7219初始化 */
 102          void InitDisplay (void)
 103          {
 104   1          WriteWord (ScanLimit,  ScanDigit);         // 设置扫描界限
 105   1          WriteWord (DecodeMode, DecodeDigit);      // 设置译码模式
 106   1          WriteWord (Intensity,  IntensityGrade);    // 设置亮度
 107   1          WriteWord (ShutDown,   NormalOperation);    // 设置为正常工作模式
 108   1      }
 109          
 110          
 111          
 112          void  keyscan(void) //键盘扫描子程序
 113          {
 114   1        uchar  scancode, rowcode;
 115   1        P3=0xf0; //向行扫描输出口发全0,查询列信号
 116   1        if((P3&0xf0)!=0xf0)//若有键按下
 117   1               {
C51 COMPILER V8.02   KEYSCAN                                                               06/04/2007 21:32:09 PAGE 3   

 118   2                delay(50);     //延时消抖
 119   2                  if((P3&0xf0)!=0xf0)
 120   2                         {
 121   3                            scancode=0xfe;
 122   3                                while((scancode&0x10)!=0)      //逐行扫描
 123   3                                     {
 124   4                                            P3=scancode;        //输出行扫描码
 125   4                                                if((P3&0xf0)!=0xf0) //若本行有键按下
 126   4                                                  {
 127   5                                                        rowcode=(P3&0xf0)|0x0f;
 128   5                                                        keycode=((~scancode)+(~rowcode));
 129   5                                KeyDisplay();
 130   5                               }
 131   4      
 132   4                                    else
 133   4                                      { scancode=(scancode<<1)|0x01;}
 134   4                                              }
 135   3                              }
 136   2                               
 137   2        }
 138   1                                                        
 139   1      }
 140          
 141          
 142          uchar  getkey(uchar keycode)     //获取键值子程序
 143          {  
 144   1         uchar  kb;
 145   1       switch(keycode)
 146   1         {
 147   2              case 0x11:kb=0x04;break;
 148   2          case 0x21:kb=0x03;break;
 149   2          case 0x41:kb=0x02;break;
 150   2          case 0x81:kb=0x01;break;
 151   2         
 152   2          case 0x12:kb=0x08;break;
 153   2          case 0x22:kb=0x07;break;
 154   2          case 0x42:kb=0x06;break;
 155   2          case 0x82:kb=0x05;break;
 156   2          
 157   2              case 0x14:kb=0x0b;break;
 158   2          case 0x24:kb=0x0a;break;
 159   2          case 0x44:kb=0x00;break;
 160   2          case 0x84:kb=0x09;break;
 161   2          
 162   2              case 0x18:kb=0x0f;break;
 163   2          case 0x28:kb=0x0e;break;
 164   2          case 0x48:kb=0x0d;break;
 165   2          case 0x88:kb=0x0c;break;
 166   2      
 167   2          default:  kb=0x00;break;
 168   2           }
 169   1               return(kb);
 170   1      }
 171          
 172          void KeyDisplay(void)
 173          {
 174   1       uchar  keydata;
 175   1       keydata=getkey(keycode);
 176   1       delay(250);
 177   1       switch(keydata)
 178   1           {
 179   2            case 1:
C51 COMPILER V8.02   KEYSCAN                                                               06/04/2007 21:32:09 PAGE 4   

 180   2            case 2:  
 181   2            case 3:
 182   2            case 4:
 183   2            case 5:
 184   2            case 6:
 185   2            case 7:
 186   2            case 8:
 187   2            case 9:if(numbit<5)
 188   2             {
 189   3                 digit[4]=digit[3];
 190   3             digit[3]=digit[2];
 191   3             digit[2]=digit[1];
 192   3             digit[1]=digit[0];
 193   3             digit[0]=keydata;
 194   3             numbit++;
 195   3              }break;
 196   2           
 197   2               case 10:clear(); break;
 198   2           default:break;
 199   2          }
 200   1        WriteWord (Digit7, digit[0]);
 201   1        WriteWord (Digit6, digit[1]);
 202   1        WriteWord (Digit5, digit[2]);
 203   1        WriteWord (Digit4, digit[3]);
 204   1        WriteWord (Digit3, digit[4]);
 205   1        }
 206          
 207          void clear(void)
 208          {
 209   1        uchar i;
 210   1        numbit=0;
 211   1        for(i=0;i<5;i++) digit[i]=0;
 212   1        for(i=0;i<8;i++) WriteWord (Digit0+i, 0);
 213   1      }
 214          
 215            
 216                  
 217          
 218          
 219          
 220          
 221          
 222          
 223          /* 主函数 */
 224          void main(void)
 225          {       
 226   1              InitDisplay ();                                                 // MAX7219初始化 
 227   1              WriteWord(DisplayTest,TestMode);                // 开始显示测试,点亮所有LED
 228   1              delay(1000);                                                    // 延时约3s
 229   1              WriteWord (DisplayTest,TextEnd);                // 退出显示测试模式
 230   1              clear();
 231   1      while(1)
 232   1       {
 233   2       keyscan( );
 234   2        }
 235   1              
 236   1      }
 237          
 238          
 239          
 240          
 241          
C51 COMPILER V8.02   KEYSCAN                                                               06/04/2007 21:32:09 PAGE 5   

 242          
 243          
 244          
 245          
 246          
 247          
 248          
 249          
 250          
 251          
 252          
 253          
 254          
 255          
 256          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    466    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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