STC8增强型单片机进阶开发--矩阵键盘

知不足而奋进 望远山而前行


目录

系列文章目录

文章目录

前言

学习目标

学习内容

矩阵按键

原理图

按键状态检测

单个按键状态检测

单行按键状态检测

多行按键状态检测

状态记录

状态优化

循环优化

总结



前言

矩阵键盘作为一种常见的数字输入设备,在各类电子产品和嵌入式系统中广泛应用。通过多行多列的按键组成矩阵结构,实现了在有限的引脚数量下输入大量信息的功能。本文将深入探讨矩阵键盘的原理、基本结构和按键扫描方法,并介绍如何通过编程实现矩阵键盘的功能。读者将从中了解矩阵键盘的工作原理,掌握按键状态检测的方法,同时学会如何通过编程实现矩阵键盘的应用,为相关电子项目的设计与开发提供帮助。


学习目标

  1. 了解矩阵键盘的原理和基本结构
  2. 学会矩阵键盘的按键扫描方法
  3. 学会矩阵键盘的编程实现

学习内容

矩阵按键

矩阵键盘是一种常见的数字输入设备,由多行多列的按键组成。每个按键都有一个唯一的行列坐标,通过行列坐标可以确定按键的编号,从而实现对数字或字母的输入。

原理图

矩阵键盘的基本结构包括按键、行引脚和列引脚。按键一般是机械按键或触摸按键,行引脚和列引脚分别与矩阵键盘的行和列相连,用于检测按键的输入状态。

按键状态检测

单个按键状态检测
  • 输出端的电平
  • 输入端的状态
  • 按键抬起

通过按键抬起时的状态,我们分析输入端的电平信号,来确定抬起时输入端的默认电平状态。

通过按键按下时的状态,我们分析输入端的电平信号,来确定按下时输入端的默认电平状态。

通过分析确认,默认输出端和输入端都是高电平;

  • 当输出端输出低电平时,输入端为高电平 ,则开关为抬起状态;
  • 当输出端输出低电平时,输入端为低电平 ,则开关为按下状态;
单行按键状态检测

通过逐一检测输入端的状态,来判断按键是否按下。

多行按键状态检测

首先,将第一行输出低电平 ,其余行设置为高电平。目的是为了只测试第一行的按键状态。

然后,将第二行输出低电平 ,其余行设置为高电平。目的是为了只测试第二行的按键状态。

接着,将第三行输出低电平 ,其余行设置为高电平。目的是为了只测试第三行的按键状态。

最后,将第四行输出低电平 ,其余行设置为高电平。目的是为了只测试第四行的按键状态。

状态记录

通过自定义状态来记录按键状态

// 记录16个按键状态,0为按下,1为抬起
u16 key_state = 0xFFFF;

......

void scan() {
// 初始都是 高电平
	ROW_COL_RESET();
    NOP1();

		// ROW1
    // 给 row1 低电平,读取COL1的值
    ROW1 = 0;
    NOP1();
	// 当前是UP,当之前是DOWN,则为UP
	// 当前是DOWN,当之前是UP,则为DOWN	
    if(COL1 != (key_state & 0x01) >> 0) {
        if(COL1) {
			// 修改当前状态为UP
			key_state |= 0x01;
			printf("K1 Up\r\n");
		} else {
			// 修改当前状态为DOWN
			key_state &= ~0x01;
			printf("K1 Down\r\n");
        }
	}
    ......
}

状态优化

通过define优化一些数值的操作,方便在后续看代码时方便理解,提高代码的阅读性。

// 记录16个按键状态,0为按下,1为抬起
u16 key_state = 0xFFFF;

#define KEY_UP		1
#define KEY_DOWN	0
// 第n个按键的状态
#define KEY_STATE(n)		((key_state & (1 << n)) >> n)
#define SET_KEY_UP(n)		(key_state |= (1 << n))
#define SET_KEY_DOWN(n)	(key_state &= ~(1 << n))

#define ROW_COL_RESET() {ROW1=1,ROW2=1,ROW3=1,ROW4=1;COL1=1,COL2=1,COL3=1,COL4=1;}

......

void scan() {
    // 初始都是 高电平
    ROW_COL_RESET();
    NOP1();

		// ROW1
    // 给 row1 低电平,读取COL1的值
    ROW1 = 0;
    NOP1();
	// 当前是UP,当之前是DOWN,则为UP
	// 当前是DOWN,当之前是UP,则为DOWN
    if(COL1 != KEY_STATE(0)) {
		if(COL1) {
            // 修改当前状态为UP
			SET_KEY_UP(0);
			printf("K1 Up\r\n");
		} else {
            // 修改当前状态为DOWN
			SET_KEY_DOWN(0);
			printf("K1 Down\r\n");
        }
	}
    ......
}

循环优化

操作的按键众多,通过循环的方式来操控每一个按键,减少代码量,方便维护。

#define ROW 4
#define COL 4

// 记录16个按键状态,0为按下,1为抬起
u16 key_state = 0xFFFF;

#define KEY_UP		1
#define KEY_DOWN	0
// 第n个按键的状态
#define KEY_STATE(r, c)			((key_state & (1 << (r * ROW + c))) >> (r * ROW + c))
#define SET_KEY_UP(r, c)		(key_state |= (1 << (r * ROW + c)))
#define SET_KEY_DOWN(r, c)	(key_state &= ~(1 << (r * ROW + c)))

#define ROW_COL_RESET() {ROW1=1,ROW2=1,ROW3=1,ROW4=1;COL1=1,COL2=1,COL3=1,COL4=1;}

void scan() {
	u8 i, j;
    for(i = 0; i < ROW; i++) {
        // 初始都是 高电平
        ROW_COL_RESET();
        NOP1();

				ROW_ON(i);
        for(j = 0; j < COL; j++) {
            // 当前是UP,当之前是DOWN,则为UP
            // 当前是DOWN,当之前是UP,则为DOWN
            if(COL_STATE(j) != KEY_STATE(i, j)) {
                if(COL_STATE(j)) {
                    // 修改当前状态为UP
                    SET_KEY_UP(i, j);
                    printf("(%d, %d) Up\r\n", (int)i, (int)j);
                } else {
                    // 修改当前状态为DOWN
                    SET_KEY_DOWN(i, j);
                    printf("(%d, %d) Down\r\n", (int)i, (int)j);
                }
            }
        }
    }
}

总结

通过本文的学习,我们深入了解了矩阵键盘的原理和基本结构,掌握了矩阵键盘的按键扫描方法和编程实现技巧。矩阵键盘通过行列的组合排列,实现了多个按键共用少量引脚的设计,同时提供了灵活输入和高效交互的功能。通过逐一检测按键的状态,我们可以准确判断按键的按下和抬起状态,从而实现对按键输入的有效监控和响应。

通过优化状态记录和循环操作,我们能够简化代码结构,提高代码的可读性和维护性。通过合理的编程实现,可以更高效地处理矩阵键盘的输入信号,实现各种个性化的功能和交互效果。掌握矩阵键盘的原理和编程方法,将有助于读者在实际项目中应用和拓展矩阵键盘的功能,为电子产品的设计与开发提供技术支持。

相关推荐
scan15 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu016 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
深圳市青牛科技实业有限公司7 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比8 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie8 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
西瓜籽@9 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^1382879887211 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张12 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_7393128715 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章15 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频