IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 六、矩阵键盘的扫描原理与基本应用 -> 正文阅读

[嵌入式]六、矩阵键盘的扫描原理与基本应用

目录

1、矩阵键盘的基本操作

矩阵键盘扫描思想:

代码:


矩阵键盘:J5跳线帽接1、2引脚

1、矩阵键盘的基本操作

S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中,发现有按键触发信号后(不做去抖动),待按键松开后,在数码管的第一位显示相应数字:从左至右,从上到下,依次显示0~F

矩阵键盘扫描思想:

?

与独立按键不同的是,按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号

??在上面的矩阵键盘中,要识别出黄色按键的按下状态,应该怎么做呢?

?对与矩阵键盘,我们只能逐行扫描,然后读取列的状态信号。如果R3行输出低电平,那么黄色按键如果有按下动作的话,那读取C2列信号也应该为低电平,而该行上其他没有按下动作的按键的列信号则为高电平。因此,我们可以得到矩阵键盘的基本扫描步骤:
? ? <1> R1输出电平,R2、R3、R4输出电平,逐个读取C1、C2、C3、C4判断列信号,如果? ? ? ? ? ? ?都为高电平则R1行上没有按键按下。
? ? <2> R2输出电平,R1、R3、R4输出电平,逐个读取C1、C2、C3、C4判断列信号。
? ? <3> R3输出电平,R1、R2、R4输出电平,发现C2列信号为低电平,那么可以判断得R3行? ? ? ? ? ? ?的C2列的按键有按下动作。
? ? <4> R4输出电平,R1、R3、R4输出电平,逐个读取C1、C2、C3、C4判断列信号。


? ? 如此循环往复,扫描的按键的我们知道有按键按下动作,那么又怎么知道是哪一个按键按下呢?这时,我们最好定义一个键值全局变量,给矩阵行列上的每一个的按键编一个唯一的号码。当扫描的某一行某一列的按键动作后,把对应的编号复制给键值变量,这样我们判断这个键值,就知道是哪个按键有触发动作了

代码:

#include "reg52.h"

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;//行

sfr P4 = 0xc0;//头文件中无P4,定义内存地址

sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;//列

unsigned char key_num;
unsigned char code SMG_duanma[18] = {
	//  0   1    2    3    4    5    6    7
		0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
	//  8   9    A    B    C    D    E    F
		0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
	//  -   .
		0xbf,0x7f};  //共阳数码管

void InitHC138(unsigned char n)//选Y
{
	switch (n)
	{
		case 4://LED
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 0;
		break;
		case 5://蜂鸣器与继电器
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 1;
		break;
		case 6://数码管位置
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 0;
		break;
		case 7://数码管段码
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 1;
		break;
	}
}

void SMG_Bit(unsigned char dat)//数码管位置(只在第一位)、数据
{
	InitHC138(6);
	P0 = 0x01;
	InitHC138(7);
	P0 = dat;
}

void ScanKeys()
{
//扫描第一行	
	R1 = 0; R2 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if (C1 == 0)
	{
		while(!C1);//松开后
		key_num = 0;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C2 == 0)
	{
		while(!C2);
		key_num = 1;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C3 == 0)
	{
		while(!C3);
		key_num = 2;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C4 == 0)
	{
		while(!C4);
		key_num = 3;
		SMG_Bit(SMG_duanma[key_num]);
	}
	
//扫描第二行
	R2 = 0; R1 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if (C1 == 0)
	{
		while (!C1);
		key_num = 4;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C2 == 0)
	{
		while(!C2);
		key_num = 5;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C3 == 0)
	{
		while(!C3);
		key_num = 6;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C4 == 0)
	{
		while(!C4);
		key_num = 7;
		SMG_Bit(SMG_duanma[key_num]);
	}
	
//扫描第三行
	R3 = 0; R1 = R2 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if (C1 == 0)
	{
		while(!C1);
		key_num = 8;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C2 == 0)
	{
		while(!C2);
		key_num = 9;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C3 == 0)
	{
		while(!C3);
		key_num = 10;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C4 == 0)
	{
		while(!C4);
		key_num = 11;
		SMG_Bit(SMG_duanma[key_num]);
	}
	
//扫描第四行
	R4 = 0; R1 = R2 = R3 = 1;
	C1 = C2 = C3 = C4 = 1;
	if (C1 == 0)
	{
		while(!C1);
		key_num = 12;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C2 == 0)
	{
		while(!C2);
		key_num = 13;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C3 == 0)
	{
		while(!C3);
		key_num = 14;
		SMG_Bit(SMG_duanma[key_num]);
	}
	else if (C4 == 0)
	{
		while(!C4);
		key_num = 15;
		SMG_Bit(SMG_duanma[key_num]);
	}
}

void main()
{
	while(1)
	{
		ScanKeys();
	}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:14:49  更:2022-01-29 23:15:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:38:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码