标题: 为什么按键还原值是20? [打印本页]

作者: zlc哈哈哈    时间: 2018-5-16 20:43
标题: 为什么按键还原值是20?
/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new;
        key_can = 20;                                //按键值还原
        P3 |= 0xf0;
        if((P3 & 0xf0) != 0xf0)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        switch(P3 & 0xf0)
                        {
                                case 0xd0:  key_can = 3;  break;         //得到按键值
                                case 0xb0:  key_can = 2;  break;         //得到按键值
                                case 0x70:  key_can = 1;  break;         //得到按键值
                        }
                }                        
        }
        else
        {
                key_new = 1;
        }        
}


作者: HC6800-ES-V2.0    时间: 2018-5-17 07:28
你这个问题,要看你的电路原理图啊,只有程序是看不懂的。
因为你的这个程序,明显是根据电路来写的,还是个比较独特的电路,不是一般常见的电路,所以,看不到电路,就无法回答你的问题。
同时,你也可以看你的电路啊,在没有按键时,P3口是个什么状态,就可以知道还原值了。
作者: zhanghyg    时间: 2018-5-17 08:26
key_new默认是0,所以if(((P3 & 0xf0) != 0xf0) && (key_new == 1))这步判断永远都是不成立的,也就不会走到switch那里
作者: wulin    时间: 2018-5-17 10:36
在按键函数外定义键值变量,
uchar key_can=20;         //按键值
void key()         //独立按键程序
{
        static uchar key_new;
        uchar num;
//        key_can = 20;                                //按键值还原
//        P3 |= 0xf0;
        if((P3 & 0x70) != 0x70)                //按键按下   P3次高3位 x111 xxxx位3个按键端口
        {
                delay_1ms(10);                     //按键消抖动  10ms
                if(((P3 & 0x70) != 0x70) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        num = P3 & 0x70;
                        switch(num)
                        {
                                case 0x30:  key_can = 3;  break;         //得到按键值
                                case 0x50:  key_can = 2;  break;         //得到按键值
                                case 0x60:  key_can = 1;  break;         //得到按键值
                        }
                }                        
        }
        else
        {
                key_new = 1;
        }        
}
作者: zzx51    时间: 2018-5-17 12:38
这个数值只要避开功能键值就行
作者: fzhlpp    时间: 2018-5-17 13:04
zhanghyg 发表于 2018-5-17 08:26
key_new默认是0,所以if(((P3 & 0xf0) != 0xf0) && (key_new == 1))这步判断永远都是不成立的,也就不会走 ...

你没看仔细,按键没按下时key_new的值一直为1
else
{
key_new=1;
}

作者: fzhlpp    时间: 2018-5-17 13:08
key_can=20;放的位置不对,其实这个值改变过,时间很短,马上又被你赋值为20了。你自己看看是不是,把他移到全局定义那里就可以了。
作者: 杨先颖    时间: 2018-5-17 15:30
key_new默认是0,所以if(((P3 & 0xf0) != 0xf0) && (key_new == 1))这步判断永远都是不成立的,也就不会走到switch那里

作者: zhanghyg    时间: 2018-5-17 16:00
fzhlpp 发表于 2018-5-17 13:04
你没看仔细,按键没按下时key_new的值一直为1
else
{

你这个子程序是一直循环还是只执行一次?只一次就是我说的,要是一直循环就是赋值问题。
作者: 56416    时间: 2018-5-17 18:23
if(((P3 & 0xf0) != 0xf0) && (key_new == 1))这步判断永远都是不成立的,也就不会走到switch那里




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1