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

📄 矩阵键盘lcd.lst

📁 一些51单片机基础模块的程序
💻 LST
字号:
C51 COMPILER V7.50   __阵键盘LCD                                                           04/10/2009 19:23:57 PAGE 1   


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

line level    source

   1          /********************************************************************
   2          * 文件名  : 矩阵键盘LCD.c
   3          * 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后两位来显示
   4                                   当前的按键值。          
   5          * 创建人  : 东流,2009年4月10日
   6          * 版本号  : 2.0
   7          * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
   8          * 感谢“中国自动化资讯网”对本工作室的大力支持。
   9          *********************************************************************/
  10          #include<reg51.h>
  11          #include<intrins.h>
  12          
  13          #define uint unsigned int
  14          #define uchar unsigned char
  15          
  16          uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
  17          
  18          //这三个引脚参考资料
  19          sbit E=P2^7;            //1602使能引脚
  20          sbit RW=P2^6;           //1602读写引脚  
  21          sbit RS=P2^5;           //1602数据/命令选择引脚
  22          
  23          
  24          /********************************************************************
  25          * 名称 : Delay_1ms()
  26          * 功能 : 延时子程序,延时时间为 1ms * x
  27          * 输入 : x (延时一毫秒的个数)
  28          * 输出 : 无
  29          ***********************************************************************/
  30          void Delay_1ms(uint i)//1ms延时
  31          {
  32   1              uchar x,j;
  33   1              for(j=0;j<i;j++)
  34   1              for(x=0;x<=148;x++);    
  35   1      }
  36          
  37          /********************************************************************
  38          * 名称 : delay()
  39          * 功能 : 延时,延时时间大概为140US。
  40          * 输入 : 无
  41          * 输出 : 无
  42          ***********************************************************************/
  43          
  44          void delay()
  45          {
  46   1              int i,j;
  47   1              for(i=0; i<=10; i++)
  48   1              for(j=0; j<=2; j++)
  49   1      ;
  50   1      }
  51          
  52          /********************************************************************
  53          * 名称 : Convert(uchar In_Date)
  54          * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
  55          * 输入 : 1602资料上的值
C51 COMPILER V7.50   __阵键盘LCD                                                           04/10/2009 19:23:57 PAGE 2   

  56          * 输出 : 送到1602的值
  57          ***********************************************************************/
  58          uchar Convert(uchar In_Date)
  59          {
  60   1          uchar i, Out_Date = 0, temp = 0;
  61   1          for(i=0; i<8; i++)
  62   1          {
  63   2              temp = (In_Date >> i) & 0x01;
  64   2              Out_Date |= (temp << (7 - i));
  65   2          }
  66   1          return Out_Date;
  67   1      }
  68          /********************************************************************
  69          * 名称 : enable(uchar del)
  70          * 功能 : 1602命令函数
  71          * 输入 : 输入的命令值
  72          * 输出 : 无
  73          ***********************************************************************/
  74          
  75          void enable(uchar del)
  76          {
  77   1              P0 = Convert(del);
  78   1              RS = 0;
  79   1              RW = 0;
  80   1              E = 0;
  81   1              delay();
  82   1              E = 1;
  83   1              delay();
  84   1      }
  85          
  86          /********************************************************************
  87          * 名称 : write(uchar del)
  88          * 功能 : 1602写数据函数
  89          * 输入 : 需要写入1602的数据
  90          * 输出 : 无
  91          ***********************************************************************/
  92          
  93          void write(uchar del)
  94          {
  95   1              P0 = Convert(del);
  96   1              RS = 1;
  97   1              RW = 0;
  98   1              E = 0;
  99   1              delay();
 100   1              E = 1;
 101   1              delay();
 102   1      }
 103          
 104          /********************************************************************
 105          * 名称 : L1602_init()
 106          * 功能 : 1602初始化,请参考1602的资料
 107          * 输入 : 无
 108          * 输出 : 无
 109          ***********************************************************************/
 110          void L1602_init(void)
 111          {
 112   1              enable(0x01);
 113   1              enable(0x38);
 114   1              enable(0x0c);
 115   1              enable(0x06);
 116   1              enable(0xd0);
 117   1      }
C51 COMPILER V7.50   __阵键盘LCD                                                           04/10/2009 19:23:57 PAGE 3   

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

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


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