微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用矩阵按键怎么实现按键时亮灯,松开时灯灭

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

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

  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. }

复制代码

我这样写为什么不能实现功能,求各位大佬解答

void main()
{
        while(1)
        {
//                KeyScan();
                P1=KeyPro();//LED显示键值,把KeyPro()中第一行键值码改为正常值
//                delay(10);
//                if( (P3 & 0x0f) == 0x0f )
//                {
//                        P1=0xff;
//                }
       
        }
}

你先确定你要实现什么功能吧,程序里没有看到开关灯的操作,而在uchar KeyScan()里含有按键的松手检测,也就是不松手,不会推出uchar KeyScan()。
先理一理思路吧

我42到46行有写LED的程序,那我这个功能要怎么实现

最简单的问题就是按你的要求uchar KeyScan()里不能检测按键释放

我把检测的删了,又修改了一下,怎么不稳定,有的时候按下亮,松开灭。有的时候按下去亮,送开还是亮,

你可以试试不在计算键码时亮灯,照常计算键码,然后无按键按下时也设置一个键码,在计算完键码后,再根据键码判断是亮灯,还是灭灯。

按键防抖动程序加了没有

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

网站地图

Top