谱中单片机的独立按键程序

2019-03-24 17:16发布

void KeyDown()
{
GPIO_KEY=0X0F;                                                              //  #define        GPIO_KEY P1
  if(GPIO_KEY!=0X0F)                                                         //  #define GPIO_DIG P0
  {
     delay(1000);                                                               //消抖
         if(GPIO_KEY!=0X0F)
         {               
                  GPIO_KEY=0X0F;                                           //  这里前面不就已经检测到按键已经按下了吗?为什么在附一次值,不会使GPIO_KEY的值定在0x0f   
                switch(GPIO_KEY)                                          //在传下去给switch吗?
                {
                   case(0X07): KeyValue=0;break;
                   case(0X0B): KeyValue=1;break;
                   case(0X0D): KeyValue=2;break;
                   case(0X0E): KeyValue=3;break;
                 }



  GPIO_KEY=0XF0;
                 switch(GPIO_KEY)
                 {
                   case(0X70): KeyValue=KeyValue;break;
                   case(0XB0): KeyValue=KeyValue+4;break;
                   case(0XD0): KeyValue=KeyValue+8;break;
                   case(0XE0): KeyValue=KeyValue+12;break;

             }

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
低调的路人
1楼-- · 2019-03-25 03:01
我不知道你的程序是怎么来的,我简单说一下我的理解吧。
首先要明白独立按键检测,意思就是每次只有一个按键变化。可以看做有8个按键。高4位和低4位。
其中  GPIO_KEY=0X0F; 这句话,个人觉得应该有问题。根据上下文理解,这里想表达的是,检测低4位的按键是否有变化。一开始第4位是1111,假如有变化,无非下面几种:0111(7),1011(C),1101(D),1110(E)这样对应下面的case语句,我想你应该可以明白了吧。
同理,低4位检测完后,检测高4位,还是 GPIO_KEY=0XF0;这句话有问题,意思是检测高4位,变化与低四位类似。
不知道我说的是否清楚?
sint27
2楼-- · 2019-03-24 19:40
这是按键的正常处理,IO口上拉输出高,但是按键按下时会短接到地,使IO口变成低电平,通过检测IO口电平来检测哪个按键按下的。注释的那部分属于按键消抖
lcofjp
3楼-- · 2019-03-24 23:30
一般是为了按键防抖,延时之后再检测一下,至于这段代码是不是防抖我就不清楚了。
stcanx
4楼-- · 2019-03-25 02:03
 精彩回答 2  元偷偷看……
ywlzh
5楼-- · 2019-03-25 06:01
在你程序的基础长 封装一下对GPIO_KEY的读写 应该就可以很直观的明白

#define Forward_Key   (P1 = 0X0F)
#define Reverse_Key   (P1 = 0xF0)
#define Read_key       (P1)
/*************************************************/
               Forward_Key;                                          
                switch(Read_key)                                          
                {
                   case(0X07): KeyValue=0;break;
                   case(0X0B): KeyValue=1;break;
                   case(0X0D): KeyValue=2;break;
                   case(0X0E): KeyValue=3;break;
                 }
                Reverse_Key;  
                 switch(Read_key)
                 {
                   case(0X70): KeyValue=KeyValue;break;
                   case(0XB0): KeyValue=KeyValue+4;break;
                   case(0XD0): KeyValue=KeyValue+8;break;
                   case(0XE0): KeyValue=KeyValue+12;break;
                 }
/*************************************************/


一周热门 更多>