用矩阵按键怎么实现按键时亮灯,松开时灯灭

2019-07-15 09:36发布

  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. uchar code led[]={0xfe,0xfb,0xfd,0xf7,0xef,0xbf,0xef,0x7f} ;

  6. /*1毫秒延时函数*/
  7. void delay(uint z)       
  8. {
  9.         uint x,y;
  10.         for(x = z; x > 0; x--)
  11.                 for(y = 114; y > 0 ; y--);
  12. }
  13. uchar KeyScan()
  14. {
  15.         uchar cord_l,cord_h;//声明列线和行线的值的储存变量
  16.         P3 = 0xf0;//1111 0000
  17.         if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
  18.         {
  19.                 delay(5);//软件消抖
  20.                 if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
  21.                 {
  22.                           cord_l = P3 & 0xf0;// 储存列线值
  23.                           P3 = cord_l | 0x0f;
  24.                           cord_h = P3 & 0x0f;// 储存行线值
  25.                           while( (P3 & 0x0f) != 0x0f );//松手检测                       
  26.                           return (cord_l + cord_h);//返回键值码                          
  27.                 }       
  28.         }
  29.                
  30. }

  31. /*
  32.         4*4矩阵键盘键值码处理函数
  33.         返回转换后的键值码
  34. */
  35. uchar KeyPro()
  36. {
  37.         uchar key_value; //存放转换后的按键值
  38.         switch( KeyScan() )
  39.         {
  40.                  //第一行键值码
  41.                 case 0xee: P1=0xfe;                break;
  42.                 case 0xde: P1=0xfd;                break;
  43.                 case 0xbe: P1=0xfb;                break;
  44.                 case 0x7e: P1=0xf7;                break;
  45.                
  46.                 //第二行键值码
  47.                 case 0xed: key_value = 0x05;                break;
  48.                 case 0xdd: key_value = 0x06;                break;
  49.                 case 0xbd: key_value = 0x07;                break;
  50.                 case 0x7d: key_value = 0x08;                break;

  51.                 //第三行键值码
  52.                 case 0xeb: key_value = 0x09;                break;
  53.                 case 0xdb: key_value = 0x0a;                break;
  54.                 case 0xbb: key_value = 0x0b;                break;
  55.                 case 0x7b: key_value = 0x0c;                break;

  56.                 //第四行键值码
  57.                 case 0xe7: key_value = 0x0d;                break;
  58.                 case 0xd7: key_value = 0x0e;                break;
  59.                 case 0xb7: key_value = 0x0f;                break;
  60.                 case 0x77: key_value = 0x10;                break;
  61.         }
  62.         return (key_value);//返回转换后的键值码       
  63. }
  64. void main()
  65. {
  66.         while(1)
  67.         {
  68.                 KeyScan();
  69.                  KeyPro();//提取键值码并且送不同数值给数码管显示
  70.                 delay(10);
  71.            if( (P3 & 0x0f) == 0x0f )
  72.                 {
  73.                         P1=0xff;
  74.                 }
  75.        
  76.         }
  77. }
复制代码我这样写为什么不能实现功能,求各位大佬解答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
花猫胖爷
1楼-- · 2019-07-15 19:31
人中狼 发表于 2017-9-25 12:36
你先确定你要实现什么功能吧,程序里没有看到开关灯的操作,而在uchar KeyScan()里含有按键的松手检测,也就是不松手,不会推出uchar KeyScan()。
先理一理思路吧

我42到46行有写LED的程序,那我这个功能要怎么实现
人中狼
2楼-- · 2019-07-16 00:45
最简单的问题就是按你的要求uchar KeyScan()里不能检测按键释放
花猫胖爷
3楼-- · 2019-07-16 03:20
人中狼 发表于 2017-9-25 14:54
最简单的问题就是按你的要求uchar KeyScan()里不能检测按键释放

我把检测的删了,又修改了一下,怎么不稳定,有的时候按下亮,松开灭。有的时候按下去亮,送开还是亮,
人中狼
4楼-- · 2019-07-16 05:11
 精彩回答 2  元偷偷看……
城北徐公子
5楼-- · 2019-07-16 05:13
花猫胖爷 发表于 2017-9-25 17:44
我把检测的删了,又修改了一下,怎么不稳定,有的时候按下亮,松开灭。有的时候按下去亮,送开还是亮,

按键防抖动程序加了没有

一周热门 更多>