按键扫描(一)

发布者:心愿达成最新更新时间:2022-04-19 来源: eefocus关键字:按键扫描  矩阵式键盘  行扫描法 手机看文章 扫描二维码
随时随地手机看文章

————————————————————————————————————————————

矩阵式键盘识别方法(行扫描法)

  • 检测列线的状态:

    列线Y4~Y7置高电平,行线Y0~Y3置低电平。只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下。若所有列线全为高电平,则键盘中无按键按下。

  • 判断闭合按键所在的位置:

    行线置高电平,列线置低电平。检测行线的状态。

  • 举例:当按下第一行第一列的按键时

    • 行扫描,行线为低电平,列线为高电平,得到 1110 0000

    • 列扫描,行线为高电平,列线为低电平,得到 0000 1110

    • 将得到的结果进行或运算,得到 1110 1110,对应第一行第一列,十六进制为0xEE

  • 按键表

bin

hex

1

1

1110 1110

0xEE

1

2

1101 1110

0xDE

1

3

1011 1110

0xBE

1

4

0111 1110

0x7E

2

1

1110 1101

0xED

2

2

1101 1101

0xDD

2

3

1011 1101

0xBD

2

4

0111 1101

0x7D

3

1

1110 1011

0xEB

3

2

1101 1011

0xDB

3

3

1011 1011

0xBB

3

4

0111 1011

0x7B

4

1

1110 0111

0xE7

4

2

1101 0111

0xD7

4

3

1011 0111

0xB7

4

4

0111 0111

0x77

————————————————————————————————————————————

矩阵式键盘应用实例

实现结果:

通过4*4矩阵键盘对应数码管显示0~F

 

设计思路:

  • 当检测到按键被按下时,将此时行扫描的结果存入临时变量,再进行列扫描,得到的结果和临时变量进行或运算。

  • 通过数组存放按键和数码管编码,行列扫描得到结果后遍历数组,找到对应的编码位置并显示数码管编码


实现代码:

#include

typedef unsigned char uchar;

typedef unsigned int uint;

uchar code KEY_TABLE[] =

{

    0xEE, 0xDE, 0xBE, 0x7E,

    0xED, 0xDD, 0xBD, 0x7D,

    0xEB, 0xDB, 0xBB, 0x7B,

    0xE7, 0xD7, 0xB7, 0x77

};

uchar code TABLE[] =

{

    0x3F, 0x06, 0x5B, 0x4F,

    0x66, 0x6D, 0x7D, 0x07,

    0x7F, 0x6F, 0x77, 0x7C,

    0x39, 0x5E, 0x79, 0x71,

};

void Delay(uchar m)

{

    --m;

}

void main()

{

    uchar temp, key, i;

    while(1)

    {

        P3 = 0xF0;

        if (P3 != 0xF0)

        {

            Delay(2000);

            if (P3 != 0xF0)

            {

                temp = P3;

                P3 = 0x0F;

                key = temp | P3;

                for (i = 0; i < 16; ++i)

                    if (key == KEY_TABLE[i])

                        break;

                P2 = TABLE[i];

            }

        }

    }

}


关键字:按键扫描  矩阵式键盘  行扫描法 引用地址:按键扫描(一)

上一篇:D/A转换器(DAC)
下一篇:中断&定时器(三)

推荐阅读最新更新时间:2024-11-13 12:57

适用于多平台的新型的按键扫描程序
unsigned char Trg; unsigned char Cont; void KeyRead( void ) { unsigned char ReadData = PIN B^0xff; // 1 Trg = ReadData & (ReadData ^ Cont); // 2 Cont = ReadData; // 3 } 下面是程序解释: Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。 1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。 2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该
[单片机]
单片机独立按键扫描程序
原理搞清楚了,那么下面我们就先编写一个独立按键的程序,把最基本的功能验证一下。 #include reg52.h sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit LED9 = P0^7; sbit LED8 = P0^6; sbit LED7 = P0^5; sbit LED6 = P0^4; sbit KEY1 = P2^4; sbit KEY2 = P2^5; sbit KEY3 = P2^6; sbit KEY4 = P2^7; void main(){ ENLED =
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved