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

📄 key2.lst

📁 单片机4×8矩阵键盘的源程序
💻 LST
字号:
C51 COMPILER V8.02   KEY2                                                                  08/21/2008 17:43:54 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE KEY2
OBJECT MODULE PLACED IN key2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key2.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*********************************************************************************************/
   2          /*公司名称:四川大学制造学院*/
   3          /*模 块 名:键盘调试程序*/
   4          /*创 建 人:陈朝泽 日期:2008年8月20日*/
   5          /*功能描述:*/
   6          /*其他说明:1、当操作P4-P7口时,请别忘了用SFRPAGE寄存器设置为F页。
   7                                  2、行线为输入,列线为输出。逐列输出低电平,检测输入口电平情况。
   8                                     只要P2口高4位不全为1,则该列有键按下。
   9                                  3、横线输入P2经过74LS14N反相后进入MCU,端口为高,则MCU处低;
  10                                     列线输出端P7从MCU出来后经过74LS14N和ULN2003两次反相,端口处电平状态与MCU处一致。*/
  11          /*********************************************************************************************/
  12           #include "C8051F120.h"
  13           #define uchar unsigned char
  14           //#include <intrins.h>         //added
  15          
  16           #define KEYP_H P2  //定义 P2口(高4位)为4×6矩阵键盘的行线输入(通过上拉电阻接+24V)
  17           #define KEYP_L P7  //定义 P7口(低6位)为4×6矩阵键盘的列线输出
  18          
  19           sbit led1=P5^0;        //测试用
  20           sbit led2=P5^1;
  21           sbit led3=P5^2;
  22           sbit led4=P5^3;
  23           sbit led5=P5^4;
  24           sbit led6=P5^5;
  25           sbit led7=P5^6;
  26           sbit led8=P5^7;
  27          
  28           uchar key;
  29          
  30           void Reset_Sources_Init()
  31          {
  32   1          WDTCN     = 0xDE;
  33   1          WDTCN     = 0xAD;
  34   1      }
  35          
  36          void Port_IO_Init()
  37          {
  38   1          SFRPAGE   = CONFIG_PAGE;
  39   1          P3MDOUT   = 0xFF;
  40   1          P4MDOUT   = 0xFF;
  41   1          P5MDOUT   = 0xFF;
  42   1          P6MDOUT   = 0xFF;
  43   1          P7MDOUT   = 0xFF;
  44   1          XBR0      = 0x04;
  45   1          XBR2      = 0x44;
  46   1      }
  47          
  48          void Oscillator_Init()
  49          {  
  50   1              int i = 0;
  51   1          SFRPAGE   = CONFIG_PAGE;
  52   1          OSCXCN    = 0x67;
  53   1          for (i = 0; i < 3000; i++);                 // Wait 5ms for initialization
  54   1          while ((OSCXCN & 0x80) == 0);
  55   1          CLKSEL    = 0x01;   
C51 COMPILER V8.02   KEY2                                                                  08/21/2008 17:43:54 PAGE 2   

  56   1      }
  57          void Init_Device(void)
  58          {
  59   1          Reset_Sources_Init();
  60   1          Port_IO_Init();
  61   1          Oscillator_Init();
  62   1      }
  63          
  64           void delay(long t)
  65          {   
  66   1              for(;t>=0;t--);
  67   1      }
  68          
  69          uchar keyscan(void)
  70          {
  71   1              uchar scancode,tmpcode,mcode;
  72   1              P7 = 0x00;                                                      //P7口发全0列扫描码
  73   1              delay(300);
  74   1              mcode = P2;
  75   1              if((mcode&0xF0) != 0x00)                                //若有键按下
  76   1              {
  77   2                      delay(3000);
  78   2                      mcode = P2;                                     //延时去抖动
  79   2                      if((mcode&0xF0) != 0x00)                        //延时后再判断一次
  80   2                      {
  81   3                              scancode = 0xFE;
  82   3                              while (scancode != 0xFF)        //逐列扫描
  83   3                              {
  84   4                                      P7 = scancode;                  //输出列扫描码11111110,将之取反,高位为按键所在列
  85   4                                      delay(300);
  86   4                                      mcode = P2;
  87   4                                      if(((mcode&0xF0) != 0x00))      //本列有键按下
  88   4                                      {
  89   5                                              //P5 = 0x00;            //测试用                
  90   5                                              tmpcode = mcode&0xF0;                   //检测哪行的电平被拉低,为1的那1行有键按下
  91   5                                              /*
  92   5                                              while (1)                       //松手检测
  93   5                                              {       
  94   5                                                      mcode = P2;
  95   5                                                      if((mcode&0xF0) == 0x00)
  96   5                                                      break;  
  97   5                                              }
  98   5                                              */
  99   5                                              if(scancode==0xDF&&tmpcode==0x10)
 100   5                                                      return 0x31;
 101   5                                              else 
 102   5                                                      return ((~scancode) + tmpcode);         //返回特征值
 103   5                                      
 104   5                                      }
 105   4                                      else 
 106   4                                      {
 107   5                                              scancode = (scancode<<1)|0x01;          //向高位移动
 108   5                                      //else scancode = _crol_(scancode,1);   
 109   5                                      }
 110   4                              }               
 111   3                      }
 112   2              }
 113   1              return 0;               
 114   1      }
 115          
 116          void main()
 117          {
C51 COMPILER V8.02   KEY2                                                                  08/21/2008 17:43:54 PAGE 3   

 118   1              Init_Device();
 119   1              //uchar key;
 120   1              while(1)
 121   1              {
 122   2                      key = keyscan();
 123   2                      switch(key)
 124   2                      {
 125   3                              case 0x11:
 126   3                                      led7 = 0;
 127   3                                      break;
 128   3                              case 0x21:
 129   3                                      led8 = 0;
 130   3                                      break;
 131   3                              case 0x41:
 132   3                                      led3 = 0;
 133   3                                      break;
 134   3                              case 0x81:
 135   3                                      led4 = 0;
 136   3                                      break;
 137   3                              default:
 138   3                                      led7 = 1;
 139   3                      }
 140   2              }
 141   1      }


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