打印
[STC单片机]

按键扫描函数,自写,

[复制链接]
3336|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lgq_123|  楼主 | 2015-4-10 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        /*按键扫描函数*/
        #define key_port P1
        unsigned char Keyscan(void){
                unsigned char temp;
                temp = key_port;
                temp &=0xf0;
                if(temp != 0xf0){ //检测按键是否被按下
                        delay_ms(5);   
                        temp = key_port;
                        temp &= 0xf0;
                        if(temp != 0xf0){  //再次确认按键是否被按下
                          switch(temp){
                                case 0xe0:
                                        return '1';
                                        break;
                                case 0xd0:
                                        return '2';
                                        break;
                                case 0xb0:
                                        return '3';
                                        break;
                                case 0x70:
                                        return '4';
                                        break;
                                default:
                                        break;
                                }
                        }
                }

        }
有四个按键,使用的是P1口高四位,

相关帖子

沙发
lgq_123|  楼主 | 2015-4-10 15:34 | 只看该作者
用的这一个按键扫描函数,但是按键按下后不起作用,感觉扫面函数应该没错吧,求大神们指点,,,,

使用特权

评论回复
板凳
ayb_ice| | 2015-4-10 15:44 | 只看该作者
明显的BUG,

不是每个回路都有返回值

编译应该都有警告的

使用特权

评论回复
地板
lgq_123|  楼主 | 2015-4-10 16:31 | 只看该作者
ayb_ice 发表于 2015-4-10 15:44
明显的BUG,

不是每个回路都有返回值

这个返回值只是用来区分按键用的吧,比如,当返回'1'时,认为是power键按下,然后执行启动电源。编译的时候没报错哦,

使用特权

评论回复
5
lgq_123|  楼主 | 2015-4-10 16:50 | 只看该作者
        稍微修改了一下,各位再帮忙看看呵,       
/*按键扫描函数*/
        unsigned char Keyscan(void){
                unsigned char temp;
                unsigned char number;
                temp = key_port;
                temp &=0xf0;
                if(temp != 0xf0){ //检测按键是否被按下
                        delay_ms(5);   
                        temp = key_port;
                        temp &= 0xf0;
                        if(temp != 0xf0){  //再次确认按键是否被按下
                          switch(temp){
                                case 0xe0:
                                        number = '1';
                                        break;
                                case 0xd0:
                                        number = '2';
                                        break;
                                case 0xb0:
                                        number = '3';
                                        break;
                                case 0x70:
                                        number = '4';
                                        break;
                                while (temp != 0xf0)                                         
                                {
                                        temp = key_port;
                                        temp &= 0xf0;       
                                }       
                                }
                        }
                }
                return number;
        }

使用特权

评论回复
6
zdl522| | 2015-4-10 17:02 | 只看该作者
把return改为给一个变量赋值,在最后返回变量的值比如
switch(temp){
                        case 0xe0:
                                     num=1;
                                      break;
                    }
return num;
这种形式会比较好

使用特权

评论回复
7
zdl522| | 2015-4-10 17:10 | 只看该作者
好吧,我更新的有点慢,不妨贴出你的判断的函数来分析下

使用特权

评论回复
8
ayb_ice| | 2015-4-10 17:13 | 只看该作者
lgq_123 发表于 2015-4-10 16:50
稍微修改了一下,各位再帮忙看看呵,        
/*按键扫描函数*/
        unsigned char Keyscan(void){

基础问题没有搞清楚

每个回路(条件分支)都必须返回一个明确的值,

你这明显只考虑了有按键正确按下的情况返回值是正确的,没有按键按下呢,返回的其实是未知值,是绝对不行的,
这其实是编程的基本问题,与按键什么的没有关系

使用特权

评论回复
9
lgq_123|  楼主 | 2015-4-10 17:45 | 只看该作者
ayb_ice 发表于 2015-4-10 17:13
基础问题没有搞清楚

每个回路(条件分支)都必须返回一个明确的值,

修改:     u8 number = 0;//赋初始值

使用特权

评论回复
10
lgq_123|  楼主 | 2015-4-10 17:45 | 只看该作者
ayb_ice 发表于 2015-4-10 17:13
基础问题没有搞清楚

每个回路(条件分支)都必须返回一个明确的值,

修改:     u8 number = 0;//赋初始值

使用特权

评论回复
11
lgq_123|  楼主 | 2015-4-10 17:51 | 只看该作者
zdl522 发表于 2015-4-10 17:10
好吧,我更新的有点慢,不妨贴出你的判断的函数来分析下

        power = Keyscan();
        if(power == '1')
             P26 = 1;//IO口P2的第六位置1
       }

使用特权

评论回复
12
lgq_123|  楼主 | 2015-4-10 17:52 | 只看该作者
zdl522 发表于 2015-4-10 17:10
好吧,我更新的有点慢,不妨贴出你的判断的函数来分析下

power = Keyscan();
        if(power == '1')
             P26 = 1;//IO口P2的第六位置1
       }

使用特权

评论回复
13
cainiao_123| | 2015-4-10 18:15 | 只看该作者
lgq_123 发表于 2015-4-10 17:52
power = Keyscan();
        if(power == '1')
             P26 = 1;//IO口P2的第六位置1

如果没有按键按下,返回值是

使用特权

评论回复
14
xyz549040622| | 2015-4-11 09:06 | 只看该作者
没有按键,返回扫描到的初始键值,另外,建议放到定时器中,使用状态机。

使用特权

评论回复
15
W_fantasy| | 2015-4-11 12:07 | 只看该作者
每个端口都有接按键的高低电平检测的话,只要检测该端口不就好了吗??
还需要用switch case吗

使用特权

评论回复
16
谭小健| | 2015-4-11 12:20 | 只看该作者
建议用状态机写按键扫描函数

使用特权

评论回复
17
geqingsong2013| | 2015-4-11 14:29 | 只看该作者
首先要确保硬件是否正常。当单下按键之后对应管脚是否由高变低。
其次,你的delay_ms();函数是否大致准确呢?

使用特权

评论回复
18
AV693| | 2015-4-12 09:00 | 只看该作者
KEIL的switch编译有时候出现莫名奇妙的问题,试用
if()
{}
else if ()
{}
else if()
{}
else
{}
代替看看?

使用特权

评论回复
19
ayb_ice| | 2015-4-12 10:56 | 只看该作者
AV693 发表于 2015-4-12 09:00
KEIL的switch编译有时候出现莫名奇妙的问题,试用
if()
{}

又有人怀疑KEIL了

使用特权

评论回复
20
lgq_123|  楼主 | 2015-4-12 11:17 | 只看该作者
W_fantasy 发表于 2015-4-11 12:07
每个端口都有接按键的高低电平检测的话,只要检测该端口不就好了吗??
还需要用switch case吗
...

个人认为,这样更加高大上一些,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

103

帖子

3

粉丝