[51单片机]

非并口式矩阵按键的驱动方法

[复制链接]
1554|10
手机看帖
扫描二维码
随时随地手机跟帖
电子云图|  楼主 | 2013-9-14 22:57 | 显示全部楼层 |阅读模式
    我们在学习单片机的时候会学到矩阵按键,一般的学习板的矩阵按键都是4*4的这样就是一个并口,驱动起来容易但是在实际应用中我们经常用到3*3,3*4,5*4等矩阵按键。   
    下面我介绍一种非并口矩阵按键的驱动方法;看下面函数
//名称;矩阵按键扫描程序(4*3矩阵)
//返回值;按键值(即矩阵中的第几个数)
unsigned char KEY_MatrixScan()                                                                       
{
        unsigned char key_num;
        COLUMN1=0;        //第一列置低                                                                                       
        COLUMN2=1;        //第二列置高       
        COLUMN3=1;        //第三列置高
        if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))                //若第一列有按键按下
        {
                Delay10ms();                                                                        //消抖
                if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))        //第一列真的有按键按下
                {
                        if(ROW1==0)                //若是第一列第一行的按键按下                                                       
                        {
                                key_num=1;        //给按键值赋1
                        }
                        if(ROW2==0)                //若是第一列第二行的按键按下
                        {
                                key_num=4;        //给按键值赋4
                        }       
                        if(ROW3==0)                //若是第一列第三行的按键按下
                        {
                                key_num=7;        //给按键值赋7
                        }
                        if(ROW4==0)                //若是第一列第四行的按键按下
                        {
                                key_num=10;        //给按键值赋10
                        }
                        while(!((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)));
                }
        }
        COLUMN1=1;        //第一列置高
        COLUMN2=0;        //第二列置低
        COLUMN3=1;        //第三列置高
        if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
        {
                Delay10ms();
                if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
                {
                        if(ROW1==0)
                        {
                                key_num=2;
                        }
                        if(ROW2==0)
                        {
                                key_num=5;
                        }       
                        if(ROW3==0)
                        {
                                key_num=8;
                        }
                        if(ROW4==0)
                        {
                                key_num=11;
                        }
                        while(!((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)));       
                }
        }       
        COLUMN1=1;
        COLUMN2=1;
        COLUMN3=0;       
        if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
        {
                Delay10ms();
                if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
                {
                        if(ROW1==0)
                        {
                                key_num=3;
                        }
                        if(ROW2==0)
                        {
                                key_num=6;
                        }       
                        if(ROW3==0)
                        {
                                key_num=9;
                        }
                        if(ROW4==0)
                        {
                                key_num=12;
                        }
                        while(!((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)));       
                }
        }
        return(key_num);                //反回按键值
}

设计要点:使能一个行或列时(即拉低行或列,供列或行检测),要把其余的行或列除能;

感兴趣的朋友可以去试一下,有什么问题也欢迎讨论.


相关帖子

cjseng| | 2013-9-15 10:06 | 显示全部楼层
我看到那个Delay10ms就觉得不妥。

使用特权

评论回复
电子云图|  楼主 | 2013-9-15 10:22 | 显示全部楼层
对于不同类型的按键,不同的应用场合,消抖时间时要根据实际来调整的,这里只是讲这个程序设计方法

使用特权

评论回复
lzyyoumuren| | 2014-12-6 15:11 | 显示全部楼层
基本上10ms就可以了

使用特权

评论回复
ayb_ice| | 2014-12-6 15:45 | 显示全部楼层
DEMO可以

使用特权

评论回复
ayb_ice| | 2014-12-6 15:46 | 显示全部楼层
如果多按下时程序就不对了,后面的把前面的覆盖了

使用特权

评论回复
coody| | 2014-12-6 20:36 | 显示全部楼层
51的话,位操作不就可以了么?随意定义IO。
AVR、PIC、STM32等等,一样可以如此。

使用特权

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

本版积分规则

11

主题

162

帖子

7

粉丝