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

📄 keyscan_led.lst

📁 基于51单片机的键盘扫描程序
💻 LST
字号:
C51 COMPILER V7.20   KEYSCAN_LED                                                           08/16/2007 19:40:59 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE KEYSCAN_LED
OBJECT MODULE PLACED IN keyscan_led.OBJ
COMPILER INVOKED BY: C:\Program File\Keil\C51\BIN\C51.EXE keyscan_led.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*4×4键盘扫描及6位LED显示程序*/
   2          /*LED显示时,P2为位选码,P3为段选码*/
   3          /*键盘扫描时,P0高四位(行线)为输出,低四位(列线)为输入*/
   4          #include "reg51.h"
   5          #define KEY     P0
   6          
   7          const unsigned char NUM_LED[17]=  //共阴七段码,a为低位,dp为高位
   8              {
   9              0x3f,0x06,0x5b,0x4f,0x66,//0~4
  10              0x6d,0x7d,0x07,0x7f,0x6f,//5~9
  11              0x77,0x7c,0x39,0x5e,0x79,//a~e
  12              0x71,0x00                //f,全不显示
  13              };
  14          unsigned char led_buf[4];
  15          unsigned char key_get;           //得到的键值
  16          unsigned char key_cnt;           //已得到的键数量
  17          unsigned char key_press;
  18          const unsigned char key_map[16]=        //设置键盘的逻辑值与程序计算键值的映射
  19                  {                                                           //按手机键盘设置
  20                  1,2,3,0x0a,
  21                  4,5,6,0x0b,
  22                  7,8,9,0x0c,
  23           0x0e,0,0x0f,0x0d
  24                  };
  25          
  26          void init_key(void)                              /*初始化*/
  27                  {
  28   1              unsigned char i;
  29   1      
  30   1              key_get=0;key_cnt=0xff;//-1     
  31   1              key_press=0;//flag=0;   
  32   1              for(i=0;i<4;i++)
  33   1                      led_buf[i]=0;//led_buf[i]=16;//不显示   
  34   1              }
  35          
  36          void display()                          /*LED显示*/
  37          {
  38   1       unsigned char ctr=0x04;  //从第三个数码管显示(前两个不能用)
  39   1       unsigned char i;       
  40   1       int j;
  41   1       
  42   1       for(i=0;i<4;i++)       //四位数码管只需移动3次
  43   1              {
  44   2               P2=ctr;        //送位选码
  45   2               P3=NUM_LED[led_buf[i]];//送段选码
  46   2               for(j=0;j<1000;j++);   //延时
  47   2               ctr=ctr<<1;
  48   2              }  
  49   1              
  50   1       P2=0;  //可避免显示完最后一位后,延时较长造成显示亮度不均匀
  51   1      }
  52          
  53          void key_scan(void)      /*键盘扫描*/
  54          {
  55   1               int i,j;
C51 COMPILER V7.20   KEYSCAN_LED                                                           08/16/2007 19:40:59 PAGE 2   

  56   1               unsigned char scancode=0xef;//高位扫描
  57   1      
  58   1                    //KEY=0x0f;//00001111B
  59   1                        //for(i=0;i<1000;i++);        //延时  
  60   1                      
  61   1                              if(KEY==0x0e)           //00001110
  62   1                                      j=0; //在第0列(列输入)
  63   1                              else if(KEY==0x0d)      //00001101
  64   1                                      j=1; //在第1列(列输入)
  65   1                              else if(KEY==0x0b)      //00001011
  66   1                                      j=2; //在第2列(列输入)
  67   1                              else if(KEY==0x07)      //00000111
  68   1                                      j=3; //在第3列(列输入)
  69   1                              KEY=scancode;//11101111B
  70   1                              for(i=0;i<4;i++) //在第i行
  71   1                                      {
  72   2                                      if(KEY!=scancode)
  73   2                                              break;
  74   2                                      else 
  75   2                                              {scancode=(scancode<<1)|0x0f;//扫描码左移一位,低四位为1
  76   3                                              KEY=scancode;
  77   3                                              }
  78   2                                      }
  79   1                              key_get=key_map[i*4+j]; 
  80   1      }
  81          
  82          unsigned char key_event() /*确定键盘事件,能判断键盘是否松开*/
  83          {
  84   1       unsigned char flag=0;
  85   1       int i;
  86   1      
  87   1       KEY=0x0f;
  88   1       for(i=0;i<50;i++);     //延时去抖动
  89   1       
  90   1       if((key_press==0)&&(KEY<0x0f))//有按键
  91   1              {
  92   2               key_press=1;
  93   2               key_scan();
  94   2              } 
  95   1       else if((key_press==1)&&(KEY==0x0f))//已松开按键
  96   1              {
  97   2               key_press=0;
  98   2               flag=1;
  99   2              }
 100   1      
 101   1       return flag;
 102   1      }
 103          
 104          void main(void)                          /*主程序*/
 105                  {
 106   1              int i;
 107   1              init_key();
 108   1      
 109   1              while(1)
 110   1                      {
 111   2                       if(key_event())//扫描到了按键
 112   2                         {
 113   3                              for(i=3;i>0;i--)        //移位,保存
 114   3                                      led_buf[i]=led_buf[i-1];
 115   3                              led_buf[0]=key_get;
 116   3                              //for(i=0;i<15000;i++);  //延时去抖动
 117   3                              
C51 COMPILER V7.20   KEYSCAN_LED                                                           08/16/2007 19:40:59 PAGE 3   

 118   3                              }
 119   2                       display();
 120   2                      }
 121   1              }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    243    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     40    ----
   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 + -