矩阵键盘扫描算法

  函数的主体

unsigned char GetKey()
{
    unsigned char i,j,k;
    static unsigned char backup[4][4]={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
    };

    EA=1;
    TMOD=0x01;//设置T0为模式1
    TH0=0xF8;
    TL0=0xCD;
    ET0=1;//使能T0中断
    TR0=1;//启动T0

    while(1)
    {
        for(i=0;i<4;i++)//循环检测4×4的矩阵按键
        {
            for(j=0;j<4;j++)
            {
                if(backup[i][j]!=KeySta[i][j])//检测按键动作
                {
                    if(backup[i][j]!=0)//检测按键按下时执行动作
                    {
                        k=i*4+j;
                        return k;//返回矩阵按键的编号
                    }
                    backup[i][j]=KeySta[i][j];//更新前一次的备份值
                }
            }
        }
    }
}

下面是中断函数

/*T0中断服务函数,扫描矩阵按键状态并消抖*/
void InterruptTimer0() interrupt 1
{
    unsigned char m;
    static unsigned char keyout=0;//矩阵按键扫描输出索引
    static unsigned char keybuf[4][4]={
        {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
        {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
    };

    TH0=0xFC;
    TL0=0x67;
    /*将一行的4个按键值移入缓冲区*/
    keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;
    keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;
    keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEY_IN_3;
    keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;

    /*消抖后更新按键状态*/
    for(m=0;m<4;m++)
    {
        if((keybuf[keyout][m]&0x0F)==0x00)
        {
            KeySta[keyout][m]=0;//连续4次扫描值为0,即4×4ms内都是按下状态时,可认为按键已稳定地按下
        }
        else if((keybuf[keyout][m]&0x0F)==0x0F)
        {
            KeySta[keyout][m]=1;//弹起
        }
        /*执行下一次的扫描输出*/
        keyout++;//输出索引递增
        keyout=keyout&0x03;//索引值增加到4即归零
        /*根据索引,释放当前输出引脚,拉低下次的输入引脚*/
        switch(keyout)
        {
            case 0:KEY_OUT_4=1;KEY_OUT_1=0;break;
            case 1:KEY_OUT_1=1;KEY_OUT_2=0;break;
            case 2:KEY_OUT_2=1;KEY_OUT_3=0;break;
            case 3:KEY_OUT_3=1;KEY_OUT_4=0;break;
            default:break;
        }
    }
}

  这些代码完成了矩阵键盘的扫描、消抖、动作分离的全部内容,通过调用GetKey()可以返回按下的按钮的编号,很方便。

时间: 2024-11-13 02:08:02

矩阵键盘扫描算法的相关文章

4x4矩阵键盘扫描

4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了 Win10 IoT 如何对本地 IoT 设备内嵌 SQLite 数据库进行 CURD 操作 ,这章我们来学习如何使用 GPIO Pin 扫描4x4矩阵键盘按键状态.如果对安装部署过程还不熟悉可以参考前几篇文章,Raspberry安装 IoT系统及搭建开发环境(http:/

4X4矩阵键盘扫描程序

4X4矩阵键盘扫描: 1. 4根行线的GIO均设为Output,根列线的GIO均设为Input: 2. 4根行线的GIO分别置为0111.1011.1101.1110,读逐一读取列线GIO的值,可确定是哪一个按键: 电路图如下: 注意: 1. 图中用作输入的GIO,一定要有一个上拉电阻. 2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效. 测试代码如下: #define KEY_GIO_ROW_1 37 #define KEY_GIO_R

Win10 IoT C#开发 6 - 4x4矩阵键盘扫描

Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了 Win10 IoT 如何对本地 IoT 设备内嵌 SQLite 数据库进行 CURD 操作 ,这章我们来学习如何使用 GPIO Pin 扫描4x4矩阵键盘按键状态.如果对安装部署过程还不熟悉可以参考前几篇文章,Raspberry安装 IoT系统及搭建开发环境(http://www.cnblo

STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 2.STM32 cubemx 引脚配置图: 这里用外部晶振内部晶振都可以,时钟对这个没什么影响,不用开中断,所以其他的配置就不细说了,下面再说一下这8个GPIO的配置. 4个引脚配推挽输出,这4个配输出的引脚内部上下拉不用配置:另外4个配成输入,内部上拉. 3.生成代码后,开始编写逻辑: 编写之前我们先做一下头文件的定义,把一些要用到的宏定

单片机第8课:矩阵键盘扫描

JP3接P0,VCC接+5V,矩阵键盘的左边八个引脚接在P1上面.想要的结果是按第0个按键,数码管显示0,以此类推.注意,这里的数码管是共阳极的. #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa

利用中断实现的4*4矩阵键盘扫描

#include <reg51.h> #include <intrins.h> typedef unsigned char UINT8; typedef unsigned int UINT16; UINT8 num = 0, temp = 0, key = 16, t0 = 0, t1 = 0, shu = 0; /* 数码管编码 */ UINT8 code table[]= { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f

4x4矩阵键盘 扫描程序

一:不排除第四位异常处理 uchar JuzhenkeyScan() { // P3=0xfe; // temp=P3; // while(temp!=0xfe) // { // temp=P3; // switch(temp) // { // case 0xee:num=10; // break; // case 0xde:num=3; // break; // case 0xbe:num=2; // break; // case 0x7e:num=1; // break; // } // d

AVR单片机教程——矩阵键盘

本文隶属于AVR单片机教程系列. ? 开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测.但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法. 矩阵键盘 这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动.我们先来看看它的原理. 每个按键有两个引脚,当按键按下时接通.每一行的一个引脚接在一起,分别连接到左边4个端口,称为"行引脚":每一列的另一个引脚接在一起,分别连接到右边的4个端口,称

疑问----单片机矩阵键盘行列反转扫描法

学到矩阵键盘这一块对网上别人写的C代码有些疑问,希望有能看到的大牛帮助解答. 矩阵键盘和独立键盘原理图: 原理:对于图右侧的矩阵键盘,把P3口的低四位(P3.0 ~ P3.3)和高四位(P3.4 ~ P3.7)分别置1,只要有按键被按下,那么与之对应的P3口某一位将由高电平被拉低,两次分别测得了行值和列值即确定了哪一个按键被按下了. 比如:先把低四位赋高电平即 P3 = 0000_1111 假如 S15 被按下了,那么 P3.2 就被拉成低电平即 P3 = 0000_1011 ,此时再把高四位赋