如何在51单片机上实现矩阵键盘功能

这篇具有很好参考价值的文章主要介绍了如何在51单片机上实现矩阵键盘功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

typedef unsigned int u16; //对数据类型进行声明定义

typedef unsigned char u8;

sbit k1=P1^0; //定义P10口是k1

sbit led=P0^0; //定义P00口是led

/*******************************************************************************

  • 函 数 名 : delay

  • 函数功能 : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i–);

}

/*******************************************************************************

  • 函 数 名 : keypros

  • 函数功能 : 按键处理函数,判断按键K1是否按下

*******************************************************************************/

void keypros()

{

if(k1==0) //检测按键K1是否按下

{

delay(1000); //消除抖动 一般大约10ms

if(k1==0) //再次判断按键是否按下

{

led=~led; //led状态取反

}

while(!k1); //检测按键是否松开

}

}

/*******************************************************************************

  • 函 数 名 : main

  • 函数功能 : 主函数

  • 输 入 : 无

  • 输 出 : 无

*******************************************************************************/

void main()

{

led=0;

while(1)

{

keypros(); //按键处理函数

}

}

矩阵键盘代码


/**************************************************************************************

  •                  矩阵按键实验                                                  *

实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字

S1-S4:0-3

S5-S8:4-7

S9-S12:8-B

S13-S16:C-F。

注意事项:

***************************************************************************************/

#include “reg52.h” //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16; //对数据类型进行声明定义

typedef unsigned char u8;

#define GPIO_DIG P0

#define GPIO_KEY P1

u8 KeyValue; //用来存放读取到的键值

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

/*******************************************************************************

  • 函 数 名 : delay

  • 函数功能 : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i–);

}

/*******************************************************************************

  • 函 数 名 : KeyDown

  • 函数功能 : 检测有按键按下并读取键值

  • 输 入 : 无

  • 输 出 : 无

*******************************************************************************/

void KeyDown(void)

{

char a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)//读取按键是否按下

{

delay(1000);//延时10ms进行消抖

if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

{

//测试列

GPIO_KEY=0X0F;

switch(GPIO_KEY)

{

case(0X07): KeyValue=0;break; // 第一列 有按键按下

case(0X0b): KeyValue=1;break; // 第二列 有按键按下

case(0X0d): KeyValue=2;break; // 第三列 有按键按下

case(0X0e): KeyValue=3;break; // 第四列 有按键按下

}

//测试行

GPIO_KEY=0XF0;

switch(GPIO_KEY)

{

case(0X70): KeyValue=KeyValue;break; // 第一行 有按键按下

case(0Xb0): KeyValue=KeyValue+4;break; // 第二行 有按键按下

case(0Xd0): KeyValue=KeyValue+8;break; // 第三行 有按键按下

case(0Xe0): KeyValue=KeyValue+12;break; // 第四行 有按键按下

}

修正delay函数

void delay(u16 i)  
{  
    while(i--);  
}

矩阵键盘扫描

对于矩阵键盘,你需要扫描行和列来确定哪个键被按下。下面是一个简单的矩阵键盘扫描示例,它假设你有一个4x4的矩阵键盘连接到P1和P2端口(P1作为行,P2作为列)。

首先,定义一些宏和变量:

#define ROW_NUM 4    // 行数  
#define COL_NUM 4    // 列数  
  
sbit ROW[ROW_NUM] = {P1^0, P1^1, P1^2, P1^3}; // 假设P1.0到P1.3是行线  
sbit COL[COL_NUM] = {P2^0, P2^1, P2^2, P2^3}; // 假设P2.0到P2.3是列线  
  
unsigned char key_code_map[ROW_NUM][COL_NUM] = {  
    {'0', '1', '2', '3'},  
    {'4', '5', '6', '7'},  
    {'8', '9', 'A', 'B'},  
    {'C', 'D', 'E', 'F'}  
};

然后,实现一个键盘扫描函数:

char scan_keypad() {  
    char key = 0xFF; // 如果没有键被按下,返回0xFF  
    static char last_row = 0xFF, last_col = 0xFF;  
  
    // 逐行扫描键盘  
    for (char r = 0; r < ROW_NUM; r++) {  
        ROW[r] = 0; // 使当前行低电平,其他行高电平  
  
        // 检查哪一列是低电平,表示有键按下  
        for (char c = 0; c < COL_NUM; c++) {  
            if (!COL[c]) { // 如果检测到列是低电平  
                key = key_code_map[r][c]; // 获取键值  
                // 消抖逻辑(简单版,可能需要更复杂的消抖)  
                if (r != last_row || c != last_col) {  
                    last_row = r;  
                    last_col = c;  
                    delay(1000); // 延时消抖  
                    if (!COL[c]) { // 再次确认按键被按下  
                        return key; // 返回键值  
                    }  
                }  
            }  
        }  
        ROW[r] = 1; // 恢复当前行为高电平以扫描下一行  
    }  
  
    return key; // 如果没有键被按下,返回0xFF  
}

在主函数中,你可以调用scan_keypad函数并处理返回的键值:

void main() {  
    // 初始化代码...  
  
    while (1) {  
        char key = scan_keypad();  
        if (key != 0xFF) {  
            // 处理键值,例如显示在数码管上  
            // 假设你有一个显示函数display_digit(char digit)  
            display_digit(key);  
              
            // 可能需要等待按键释放或添加其他逻辑  
        }  
    }  
}


文章来源地址https://www.toymoban.com/news/detail-847008.html

到了这里,关于如何在51单片机上实现矩阵键盘功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 6.51单片机之矩阵键盘

    👻 1.矩阵键盘的介绍 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。 结构:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条

    2024年02月07日
    浏览(44)
  • 51单片机学习笔记-4矩阵键盘

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。采用逐行或逐列的“扫描”,就可以读

    2024年02月06日
    浏览(55)
  • 51单片机矩阵键盘——数码管显示

    当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了。 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0;按下矩阵键盘S2并松开,数码管第一位显示1;...按下矩阵键盘S16并松开,数码管第一位显示F; 矩阵键盘扫描(输入扫描)     原理:

    2024年02月11日
    浏览(55)
  • 51单片机实现矩阵键盘密码锁

    使用51单片机的矩阵键盘模块以及led1602显示屏,实现模拟密码锁。 当程序烧录到单片机中后,led1602屏幕会显示文字。 第一行会显示单词“PASSWORD”,第二行显示4个0,表示我们要写入的四位密码,每位默认为0。 矩阵键盘前两行与第三行的前两个分别代表输入1-9与0,第三行第

    2024年02月03日
    浏览(57)
  • 51单片机矩阵键盘——LCD1602显示

    本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86404949 使用矩阵键盘随意按下按键,LCD1602第二行前两位就会显示对应按键按下的数字。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用

    2023年04月09日
    浏览(44)
  • 51单片机矩阵键盘扫描及使用方法

             矩阵键盘 ,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设。 (图片截取至普中A2开发板原理图) (图片截取至普中A2开发板实物图)         我们知道,一个独立按键需要1个IO口。但是如果我们需要大量的按键,则需要大量的IO口,但是单片机

    2024年02月02日
    浏览(37)
  • 51单片机学习--矩阵键盘、电子密码锁

    矩阵键盘的模块原理图: 功能:按下矩阵按键,在LCD上显示对应的数值。 采用模块化编程,在此只给出MatrixKey.c 和 main.c 两部分代码 这里要注意必须先判断KeyNum是否为0,否则while不断循环会不断显示0,导致看不到按下按钮显示的数字 要利用写好的矩阵键盘来制作一个密码锁

    2024年02月16日
    浏览(55)
  • 51单片机设计16个按键的矩阵键盘

    首先如图所示导入各个元器件,并连线。 因为P3口连接着矩阵键盘,所以上来要先付个初值,从高位到低位H0,H1,H2,H3,L0,L1,L2,L3的值是11110000,高位全是1,低位全是0,十六进制就是0xF0,也就是P3=0xF0。如果有按键按下了,肯定就不是这个值了。 比如说: 第一行789+中的任何一个按

    2024年02月05日
    浏览(45)
  • 基于51单片机的矩阵键盘(线反转法)

    矩阵键盘使用的方法与独立按键类似,但是比独立按键节省I/O,同时使用方法变得相对复杂了,首先展示硬件连接。 上图所示就是4X4矩阵键盘的常见接法,按行来看,每个按键的左端接在一起,按列来看,每个按键的右端接在一起,共占用8个I/O,接到51单片机的P1端口。 对于

    2024年02月11日
    浏览(35)
  • 51单片机用矩阵键盘控制数码管,求助大佬

    从黑体的地方开始,我想通过矩阵键盘控制数码管显示0-15,但是不知道怎么搞两位数的显示,是不是延时什么的有问题 #include REGX52.H sfr P4 = 0xC0; unsigned char code duanma[18]={         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc0,0x86,0x8e,0xbf,0x7f}; sbit R1 = P3^0; sbit R2 = P3^1; sbit R3 = P

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包