找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

为什么这个单片机4*4按键总是无法识别?核心问题出在那,求帮助

查看数: 1373 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-5-28 17:56

正文摘要:

#include <reg52.h> #define uchar unsigned char #define uint  unsigned int uchar temp; uint i,key,yand; uchar dispay_[7]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; uchar yand_[3]={0xfe, ...

回复

ID:512883 发表于 2019-5-29 08:43
扫描的时候确实挺慢的,我再修改一下
ID:213173 发表于 2019-5-29 07:23
你把程序对比一下就知道问题在哪


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar temp;
  5. uchar i,key,yand;
  6. uchar dispay_[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
  7. uchar yand_[3]={0xfe,0xef,0xee};

  8. void delay(uint i)
  9. {
  10.         uint m,n;
  11.         for(m=i;m>0;m--)
  12.                 for(n=125;n>0;n--);
  13. }

  14. void keyscan()
  15. {
  16.         P1=0xf0;
  17.         if(P1!=0xf0)
  18.         {
  19.                 delay(10);
  20.                 if(P1!=0xf0)
  21.                 {
  22.                         temp=P1;
  23.                         temp|=0x0f;
  24.                         P1=temp;
  25.                         switch(P1)
  26.                         {
  27.                                 case 0xee:key=4;yand=0;break;
  28.                                 case 0xde:key=5;yand=0;break;
  29.                                 case 0xbe:key=6;yand=0;break;
  30.                                 case 0x7e:key=7;yand=0;break;
  31.                                 case 0xed:key=1;yand=1;break;
  32.                                 case 0xdd:key=2;yand=1;break;
  33.                                 case 0xbd:key=3;yand=1;break;
  34.                                 case 0x7d:key=4;yand=1;break;
  35.                                 case 0xeb:key=5;yand=1;break;
  36.                                 case 0xdb:key=6;yand=1;break;
  37.                                 case 0xbb:key=7;yand=1;break;
  38.                                 case 0x7b:key=1;yand=2;break;
  39.                                 case 0xe7:key=2;yand=2;break;
  40.                                 case 0xd7:key=3;yand=2;break;
  41.                                 case 0xb7:key=4;yand=2;break;
  42.                                 case 0x77:key=5;yand=2;break;
  43.                         }     
  44.                 }
  45.         }
  46. }


  47. void diapay()
  48. {
  49.         P2=yand_[yand];
  50.         P0=dispay_[key];
  51. }
  52. void main()
  53. {
  54.         while(1)
  55.         {
  56.                 keyscan();
  57.                 diapay();
  58.         }
  59. }
复制代码



ID:549631 发表于 2019-5-28 20:48
你这个函数又长又浪费机时 uchar keyscan() {   KEYBOARD=0xf0;//键盘列全置1   delay_10ms();   if(KEYBOARD!=0xf0)//有键按下   {     temp=KEYBOARD;//保存此时键值     delay_10ms();     if(KEYBOARD==temp)//再次确认键盘是否按下     {       uchar  i;       KEYBOARD=0x0f;//键盘行全置1;       delay_10ms();       keynum=temp|KEYBOARD//保存键盘的行值       for(i=0;i<16;i++)       {         if(keycode[i]==~keynum)         return (i);       }     }   return -1;   } }

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表