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

📄 矩阵键盘lcd.lst

📁 单片机的实用程序代码
💻 LST
字号:
C51 COMPILER V7.50   __阵键盘LCD                                                           09/11/2011 16:39:17 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE __阵键盘LCD
OBJECT MODULE PLACED IN 矩阵键盘LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 矩阵键盘LCD.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /********************************************************************
   2          * 文件名  : 矩阵键盘LCD.c
   3          * 描述    :  该文件实现了 4 * 4 键盘的试验。通过1602液晶来显示当前的按键值。             
   4          * 创建人  : 东流,2009年4月10日
   5          * 版本号  : 2.0
   6          *********************************************************************/
   7          #include<reg51.h>
   8          #include<intrins.h>
   9          
  10          #define uint unsigned int
  11          #define uchar unsigned char
  12          
  13          uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
  14          
  15          //这三个引脚参考资料
  16          sbit E=P2^7;            //1602使能引脚
  17          sbit RW=P2^6;           //1602读写引脚  
  18          sbit RS=P2^5;           //1602数据/命令选择引脚
  19          
  20          
  21          /********************************************************************
  22          * 名称 : Delay_1ms()
  23          * 功能 : 延时子程序,延时时间为 1ms * x
  24          * 输入 : x (延时一毫秒的个数)
  25          * 输出 : 无
  26          ***********************************************************************/
  27          void Delay_1ms(uint i)//1ms延时
  28          {
  29   1              uchar x,j;
  30   1              for(j=0;j<i;j++)
  31   1              for(x=0;x<=148;x++);    
  32   1      }
  33          
  34          /********************************************************************
  35          * 名称 : delay()
  36          * 功能 : 延时,延时时间大概为5US。
  37          * 输入 : 无
  38          * 输出 : 无
  39          ***********************************************************************/
  40          
  41          void delay()
  42          {
  43   1              _nop_();
  44   1              _nop_();
  45   1              _nop_();
  46   1              _nop_();
  47   1              _nop_();
  48   1      }
  49          /********************************************************************
  50          * 名称 : bit Busy(void)
  51          * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
  52          * 输入 : 输入的命令值
  53          * 输出 : 无
  54          ***********************************************************************/
  55          bit Busy(void)
C51 COMPILER V7.50   __阵键盘LCD                                                           09/11/2011 16:39:17 PAGE 2   

  56          {
  57   1              bit busy_flag = 0;
  58   1              RS = 0;
  59   1              RW = 1;
  60   1              E = 1;
  61   1              delay();
  62   1              busy_flag = (bit)(P0 & 0x80);
  63   1              E = 0;
  64   1              return busy_flag;
  65   1      }
  66          /********************************************************************
  67          * 名称 : wcmd(uchar del)
  68          * 功能 : 1602命令函数
  69          * 输入 : 输入的命令值
  70          * 输出 : 无
  71          ***********************************************************************/
  72          void wcmd(uchar del)
  73          {
  74   1              while(Busy());
  75   1              RS = 0;
  76   1              RW = 0;
  77   1              E = 0;
  78   1              delay();
  79   1              P0 = del;
  80   1              delay();
  81   1              E = 1;
  82   1              delay();
  83   1              E = 0;
  84   1      }
  85          
  86          /********************************************************************
  87          * 名称 : wdata(uchar del)
  88          * 功能 : 1602写数据函数
  89          * 输入 : 需要写入1602的数据
  90          * 输出 : 无
  91          ***********************************************************************/
  92          
  93          void wdata(uchar del)
  94          {
  95   1              while(Busy());
  96   1              RS = 1;
  97   1              RW = 0;
  98   1              E = 0;
  99   1              delay();
 100   1              P0 = del;
 101   1          delay();
 102   1              E = 1;
 103   1              delay();
 104   1              E = 0;
 105   1      }
 106          
 107          /********************************************************************
 108          * 名称 : L1602_init()
 109          * 功能 : 1602初始化,请参考1602的资料
 110          * 输入 : 无
 111          * 输出 : 无
 112          ***********************************************************************/
 113          void L1602_init(void)
 114          {
 115   1              wcmd(0x38);
 116   1              wcmd(0x0c);
 117   1              wcmd(0x06);
C51 COMPILER V7.50   __阵键盘LCD                                                           09/11/2011 16:39:17 PAGE 3   

 118   1              wcmd(0x01);
 119   1      }
 120          
 121          /********************************************************************
 122          * 名称 : L1602_char(uchar hang,uchar lie,char sign)
 123          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
 124                           L1602_char(1,5,'b')
 125          * 输入 : 行,列,需要输入1602的数据
 126          * 输出 : 无
 127          ***********************************************************************/
 128          void L1602_char(uchar hang,uchar lie,char sign)
 129          {
 130   1              uchar a;
 131   1              if(hang == 1) a = 0x80;
 132   1              if(hang == 2) a = 0xc0;
 133   1              a = a + lie - 1;
 134   1              wcmd(a);
 135   1              wdata(sign);
 136   1      }
 137          
 138          /********************************************************************
 139          * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
 140          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
 141                           L1602_string(1,5,"ab cd ef;")
 142          * 输入 : 行,列,需要输入1602的数据
 143          * 输出 : 无
 144          ***********************************************************************/
 145          void L1602_string(uchar hang,uchar lie,uchar *p)
 146          {
 147   1              uchar a,b=0;
 148   1              if(hang == 1) a = 0x80;
 149   1              if(hang == 2) a = 0xc0;
 150   1              a = a + lie - 1;
 151   1              while(1)
 152   1              {
 153   2                      wcmd(a++);
 154   2                      b++;
 155   2                      if((*p == '\0')||(b==16)) break;
 156   2                      wdata(*p);
 157   2                      p++;
 158   2              }
 159   1      }
 160          
 161          /********************************************************************
 162          * 名称 : Keyscan()
 163          * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
 164          * 输入 : 无
 165          * 输出 : 按键值
 166          ***********************************************************************/
 167          uchar Keyscan(void)
 168          {
 169   1              uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
 170   1              for(j=0; j<4; j++)
 171   1              {
 172   2                      P1 = Buffer[j];
 173   2                      temp = 0x10;                                                                                            
             -                                                                        
 174   2                      for(i=0; i<4; i++)
 175   2                      {
 176   3                              if(!(P1 & temp)) 
 177   3                              {
 178   4                                      return (i+j*4);
C51 COMPILER V7.50   __阵键盘LCD                                                           09/11/2011 16:39:17 PAGE 4   

 179   4                              }
 180   3                              temp <<= 1;
 181   3                      }       
 182   2              }
 183   1      }
 184          
 185          /********************************************************************
 186          * 名称 : Main()
 187          * 功能 : 主函数
 188          * 输入 : 无
 189          * 输出 : 无
 190          ***********************************************************************/
 191          void Main(void)
 192          {
 193   1              uchar Key_Value;  //读出的键值
 194   1              L1602_init();
 195   1              L1602_string(1,1,"  4*4 KeyBoard  ");
 196   1              L1602_string(2,1,"You Press The    ");
 197   1              while(1)
 198   1              {
 199   2                      P1 = 0xf0;
 200   2                      if(P1 != 0xf0)
 201   2                      {
 202   3                              Delay_1ms(20);  //按键消抖
 203   3                              if(P1 != 0xf0)
 204   3                              {
 205   4                                      Delay_1ms(20);  //按键消抖
 206   4                                      if(P1 != 0xf0)
 207   4                                      {
 208   5                                              Key_Value = Keyscan();          
 209   5                                      }
 210   4                              }
 211   3                      }
 212   2                      L1602_char(2,15,Key_Value / 10 + 48);
 213   2                      L1602_char(2,16,Key_Value % 10 + 48);           
 214   2              }
 215   1      }


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