微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 矩阵键盘的扫描

矩阵键盘的扫描

时间:10-02 整理:3721RD 点击:
求教,P20-P24五个IO口控制2*3矩阵键盘,二行三列。
P25 P26 P27有其他作用,
扫描程序应如何写。

给你写了一个2*3矩阵键盘演示程序,已经实物验证无误。有详细注释,不要说看不懂。是从异组端口4*4矩阵键盘演化而来。
#include <AT89X51.H>
#define uint unsigned int                         //宏定义数据类型uint
#define uchar unsigned char                 //宏定义数据类型uchar
sbit code0=P2^0;                                                //定义2*3键盘端口
sbit code1=P2^1;
sbit code2=P2^2;
sbit code3=P2^3;
sbit code4=P2^4;
uchar key=0;                                                //键值变量初始值
void PX(uchar i)                                        //写入P2低5位数据
{   
    code0=i&0x01;i>>=1;       
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;
}
uchar PD()                                                        //读取P2低5位数据
{
        uchar i=0;
        i=code4;
        i=(i<<1)|code3;
        i=(i<<1)|code2;
        i=(i<<1)|code1;
        i=(i<<1)|code0;
        return i;
}
void key_scan()                                                //矩阵键盘扫描函数
{
        uchar temp1,temp2,temp3;                //临时变量
        static bit sign=0;                                //按键自锁标志
        static uint count=0;                        //消抖计数变量
        PX(0x1C);                                                //先给矩阵端口赋一个初值0x1C,高3位置0,中3位置1,低2位置0,0001 1100
        if(PD()!=0x1C)                                        //判断矩阵端口不等于所赋初值,说明有健按下
        {
                if(sign==0)                                        //如果按键自锁标志为0
                {
                        count++;                                        //消抖计数
                        if(count>=200)                        //消抖计数自>=200,估算主循环周期调整
                        {                                                        //摒弃Delay延时方式,
                                count=200;                        //防止溢出
                                sign=1;                                //按键自锁标志置1,键不抬起,按其他键无效
                                temp1=PD();                        //temp1保存矩阵端口中3位变化,000x xx00
                                PX(0x03);                        //再给矩阵端口赋值0x03,0000 0011
                                temp2=PD();                        //temp2保存矩阵端口低2位变化,0000 00xx
                                temp3=temp2|temp1;        //temp3=低2位+中3位          000x xxxx
                                switch(temp3)
                                {
                                        case 0x1a: key=1; break;
                                        case 0x16: key=2; break;
                                        case 0x0e: key=3; break;
                                        case 0x19: key=4; break;
                                        case 0x15: key=5; break;
                                        case 0x0d: key=6; break;
                                        default: break;
                                }
                        }
                }
        }
        else                                                         //按键抬起
        {
                sign=0;                                                //按键自锁标志清0
                count=0;                                        //消抖计数清0
        }
}
void key_service()                         //按键服务程序
{
        switch(key)
        {
                case 1: P1=0xfe; break;//LED显示键值
                case 2: P1=0xfd; break;
                case 3: P1=0xfb; break;
                case 4: P1=0xf7; break;
                case 5: P1=0xef; break;
                case 6: P1=0xdf; break;
                default: break;
        }
}
void main()
{        
        while(1)               
        {
                key_scan();                                        //键盘扫描
                key_service();                                //LED低电平亮显示键值
        }                                                                               
}

用5个I/O口做6个键的矩阵键盘有多大意义?

现在是发现了这个事情,但是板子已经做出来了 所以很难受

把矩阵键盘的接线图发上来,帮你看看。

和矩阵键盘扫描一样啊,扫描行列

和普通矩阵键盘一样的做法,只是要注意保护P2.5-P2.7的状态

这个接线图


就是想知道怎么保护 P2.5-P2.7

程序已写好,在审核中。仿真和实物测试都正常,不影响P2.5~2.7的状态,也与P2.5~2.7的状态无关,并可以移植到任意I/O口矩阵键盘。

非常感谢!

对P2.5-P2.7就是在对键盘引脚置1或清零的时候要保持P2.5-P2.7不变,一般就是在对键盘引脚设置时,通常对整个P2口进行操作,这时就是操作前先读P2数据,然后用与或者或的方式对键盘引脚设置,来保持P2.5-P2.7不变。
另外P2口可以位操作,那就可以用位操作的方式扫描键盘,也可以保持P2.5-P2.7不变

程序在7楼---字数补丁。

非常感谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top