发新帖我要提问
12
返回列表
打印

基于状态机的矩阵键盘驱动,24楼新增“线性反转法”实现

[复制链接]
楼主: XIANSir
手机看帖
扫描二维码
随时随地手机跟帖
21
9# 程序匠人
:'(感动啊!!!这是俺在二姨家第一个酷贴啊!!!
感谢匠人前辈、匠人大侠的鼓励!
XIANSir 发表于 2011-4-1 08:53



小盆友好好学好好干,一定大有钱途~~~

使用特权

评论回复
22
XIANSir|  楼主 | 2011-4-1 15:29 | 只看该作者
本帖最后由 XIANSir 于 2011-4-1 15:34 编辑





使用特权

评论回复
23
XIANSir|  楼主 | 2011-4-1 16:59 | 只看该作者
不能对不起匠人加的精华,所以,现在把矩阵键盘的“线性反转法”驱动也贴上来——以验证可用:lol
只贴有改动的地方,其他地方和原来的程序一模一样,就不贴了:
第一个改动的地方:引脚读写宏定义
/*不同于逐行扫描法,线性反转法中连接键盘的引脚没有固定的输入
与输出,只有行线和列线之别,二者都时而作为输入时而作为输出。
本键盘中:        KEY0_3         为P20-P23,接键盘行线
                        KEY4_7        为P24-P27,接键盘列线
* 注意:矩阵键盘的输入是MCU的输出,矩阵键盘的输出是MCU的输入*/
#define KEY0_3HI()        P2 |= 0x0F                  //矩阵键盘所有输入脚都置高
#define KEY0_3LO()        P2 &= 0xF0                //矩阵键盘所有输入脚都置低
#define KEY0_3RD()        ((P2 >> 0)&0x0F)//读取矩阵键盘输出脚的状态
#define KEY4_7HI()        P2 |= 0xF0                  //矩阵键盘所有输入脚都置高
#define KEY4_7LO()        P2 &= 0x0F                //矩阵键盘所有输入脚都置低
#define KEY4_7RD()        ((P2 >> 4)&0x0F)//读取矩阵键盘输出脚的状态                

第二个改动的地方:键盘状态值读取函数
byte OnceKey(void)
{
    ui08 i = 0;
        ui08 j = 0;
        byte key = NO_KEY;
       
        KEY4_7LO();
        KEY0_3HI();                                                //作为输入之前必须先置高
        i=KEY0_3RD();
        if(i == 0x0F)
        {
                key = NO_KEY;
        }
        else
        {
                KEY0_3LO();
                KEY4_7HI();                                        //作为输入之前必须先置高
                j=KEY4_7RD();
                if(j == 0x0F)
                {
                        key = NO_KEY;
                }
                else
                {
//本宏实现的作用:由于低电平的引脚表示有按键,高电平的引脚表示无按键,于是有合法按键时读到的数据会是:~1、~2、~4、~8,本宏将读到
//的引脚值转换为按下按键对应的引脚编号0、1、2、3
#define CVT(i)        ((i == ((~1) & 0x0F)) ? 0 : ((i == ((~2) & 0x0F)) ? 1 : ((i == ((~4) & 0x0F)) ? 2 : ((i == ((~8) & 0x0F)) ? 3 : 4))))
                        
                        key = CVT(i)*4+CVT(j);
                        if(key > 0x0F)                        //多个键被同时按下,认为是误操作,忽略按键动作
                        {
                                 key = NO_KEY;
                        }
                }
        }

        KEY0_3HI();
        KEY4_7HI();
        return key;                                                                   
}

使用特权

评论回复
24
123jj| | 2011-4-2 09:03 | 只看该作者
改的不错,友情帮顶,呵呵~~~

使用特权

评论回复
25
夏亚雷鸣| | 2011-4-5 10:16 | 只看该作者
正在学这个,看看。。
看马潮老师的,是用AVR写的。。还没看太懂。。先看看你这个吧。

使用特权

评论回复
26
夏亚雷鸣| | 2011-4-5 10:18 | 只看该作者
为什么行线要接地呢?

使用特权

评论回复
27
conw2043| | 2011-5-2 21:48 | 只看该作者
个人还是喜欢状态机

使用特权

评论回复
28
hoko964247736| | 2011-9-6 23:34 | 只看该作者
mark

使用特权

评论回复
29
maxking| | 2011-9-7 10:04 | 只看该作者
这个帖子不顶对不起自己。

使用特权

评论回复
30
dandan5241| | 2011-10-29 18:38 | 只看该作者
不错,状态机实现按键扫描

使用特权

评论回复
31
today_lucky| | 2011-10-29 19:24 | 只看该作者
mark!

使用特权

评论回复
32
huangwen821| | 2011-10-31 08:48 | 只看该作者
呵呵,还不错

使用特权

评论回复
33
爱吃水煮鱼| | 2012-3-4 12:49 | 只看该作者
学习

使用特权

评论回复
34
LC1234| | 2014-8-26 07:10 | 只看该作者
Mark,学习了

使用特权

评论回复
35
涛声依旧520| | 2014-11-3 23:32 | 只看该作者
恩恩,顶楼主!

使用特权

评论回复
36
wsnsyy| | 2016-2-7 18:11 | 只看该作者
mark

使用特权

评论回复
37
doob| | 2016-7-7 11:16 | 只看该作者
挺好,第一个程序行列描述颠倒了。。。

使用特权

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

本版积分规则