微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 4*4矩阵键盘输入数字在1602上显示出来

4*4矩阵键盘输入数字在1602上显示出来

时间:10-02 整理:3721RD 点击:

  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #define XX P1

  4. typedef unsigned char BYTE;
  5. typedef unsigned int  WORD;
  6.                
  7. unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};


  8. /*  液晶1602口地址  */
  9. #define  wr_com  XBYTE[0xC000]     //写命令
  10. #define  wr_data  XBYTE[0xC100]    //写数据
  11. #define  rd_com  XBYTE[0xC200]     //读命令
  12. #define  rd_data  XBYTE[0xC300]    //读数据

  13. void Delay(WORD n)
  14. {
  15.     WORD x;
  16.         while(n--)
  17.         {
  18.             x=500;
  19.                 while(x--);
  20.         }
  21. }

  22. /************************************************************************
  23. Function name:       write_cmd
  24. Descriptions:        向lcd输入指令
  25. ************************************************************************/
  26. void write_cmd(BYTE cmd)
  27. {   
  28.         BYTE dl;
  29.         do {
  30.                 dl=rd_com;
  31.                 } while((dl&0x80)!=0);        //判忙
  32.     wr_com= cmd;
  33.     Delay(1);
  34. }

  35. /**********************************************************************
  36. Function name:       write_data
  37. Descriptions:        写入数据
  38. **********************************************************************/
  39. void write_data(BYTE dat)        
  40. {
  41.         BYTE dl;
  42.         do {
  43.                 dl=rd_com;
  44.                 } while((dl&0x80)!=0);        //判忙
  45.     wr_data= dat;  
  46.     Delay(1);
  47. }  

  48. /***************************************************
  49. ************液晶模块初始化******************************
  50. ****************************************************/
  51. void lcd_init(void)                                 
  52. {
  53.         write_cmd(0x38);
  54.         write_cmd(0x0e);
  55.         write_cmd(0x06);
  56.         write_cmd(0x01);
  57. }

  58. unsigned char KeyScan()
  59. {
  60.         unsigned char KeyData;
  61.         unsigned char KeyNum;
  62.         XX=0xfe;//检测第一行
  63.         KeyData=XX;
  64.         KeyData=KeyData&0xf0;
  65.         if(KeyData!=0xf0)
  66.         {
  67.                 Delay(2);
  68.                 if(KeyData!=0xf0)
  69.                 {
  70.                         KeyData=XX;
  71.                         switch(KeyData)
  72.                         {
  73.                                 case 0xee:KeyNum=1;break;
  74.                                 case 0xde:KeyNum=2;break;
  75.                                 case 0xbe:KeyNum=3;break;
  76.                                 case 0x7e:KeyNum=4;break;
  77.                         }
  78.                         while(KeyData!=0xf0)
  79.                         {
  80.                                 KeyData=XX;
  81.                                 KeyData=KeyData&0xf0;
  82.                         }
  83.                 }
  84.         }
  85.         XX=0xfd;//检测第二行
  86.         KeyData=XX;
  87.         KeyData=KeyData&0xf0;
  88.         if(KeyData!=0xf0)
  89.         {
  90.                 Delay(2);
  91.                 if(KeyData!=0xf0)
  92.                 {
  93.                         KeyData=XX;
  94.                         switch(KeyData)
  95.                         {
  96.                                 case 0xed:KeyNum=5;break;
  97.                                 case 0xdd:KeyNum=6;break;
  98.                                 case 0xbd:KeyNum=7;break;
  99.                                 case 0x7d:KeyNum=8;break;
  100.                         }
  101.                         while(KeyData!=0xf0)
  102.                         {
  103.                                 KeyData=XX;
  104.                                 KeyData=KeyData&0xf0;
  105.                         }
  106.                 }
  107.         }
  108.         XX=0xfb;//检测第三行
  109.         KeyData=XX;
  110.         KeyData=KeyData&0xf0;
  111.         if(KeyData!=0xf0)
  112.         {
  113.                 Delay(2);
  114.                 if(KeyData!=0xf0)
  115.                 {
  116.                         KeyData=XX;
  117.                         switch(KeyData)
  118.                         {
  119.                                 case 0xeb:KeyNum=9;break;
  120.                                 case 0xdb:KeyNum=10;break;
  121.                                 case 0xbb:KeyNum=11;break;
  122.                                 case 0x7b:KeyNum=12;break;
  123.                         }
  124.                         while(KeyData!=0xf0)
  125.                         {
  126.                                 KeyData=XX;
  127.                                 KeyData=KeyData&0xf0;
  128.                         }
  129.                 }
  130.         }
  131.         XX=0xf7;//检测第四行
  132.         KeyData=XX;
  133.         KeyData=KeyData&0xf0;
  134.         if(KeyData!=0xf0)
  135.         {
  136.                 Delay(2);
  137.                 if(KeyData!=0xf0)
  138.                 {
  139.                         KeyData=XX;
  140.                         switch(KeyData)
  141.                         {
  142.                                 case 0xe7:KeyNum=13;break;
  143.                                 case 0xd7:KeyNum=14;break;
  144.                                 case 0xb7:KeyNum=15;break;
  145.                                 case 0x77:KeyNum=16;break;
  146.                         }
  147.                         while(KeyData!=0xf0)
  148.                         {
  149.                                 KeyData=XX;
  150.                                 KeyData=KeyData&0xf0;
  151.                         }
  152.                 }
  153.         }
  154.         return KeyNum;
  155. }
  156. void main()
  157. {
  158.         unsigned char i;
  159.         lcd_init();

  160.         while(1)
  161.         {
  162.                 i=KeyScan();
  163.                 write_cmd(0x80+i-1);
  164.                 write_data(table[KeyScan()-1]);
  165. //                write_cmd(0x01);
  166.         }
  167. }

复制代码

请教各位大神,为什么后一次的输入总是会干扰到前一次的输入?比如:按下按键8时,前一个数字也会跳变成8(本来是7)?这个程序该怎么修改呢?

根本

你把这个absacc.h头文件也发出来看看

sorry,我还以为这个头文件是定义LCD1602端口的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top