外部中断扫描矩阵键盘
矩阵键盘的工作原理和扫描确认方式

来源:《AVR 单片机嵌入式系统原理与应用实践》M16 华东师范大学电子系 马潮 当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成
矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交 点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行 或列线上的电平变化可以确定哪个按键被按下。
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩 阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式 按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和 线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态, 因此会大量占用 MCU 的时间,所以较好的方式也是采用状态机的方法来设计, 尽量减少键盘查询过程对 MCU 的占用时间。
key_return = K1_1; break; case 0b00001101: key_return = K1_2; break; case 0b00001011: key_return = K1_3; break; case 0b00010110: key_return = K2_1; break; case 0b00010101: key_return = K2_2; break; case 0b00010011: key_return = K2_3; break; case 0b00100110: key_return = K3_1; break; case 0b00100101: key_return = K3_2; break; case 0b00100011: key_return = K3_3; break;
单片机按键程序设计

单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。
当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。
除了查询法,还有中断法可以用于按键检测。
中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。
```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。
51单片机矩阵键盘扫描程序

{
TH0=(65536-2000)/256;//重新赋值2ms
TL0=(65536-2000)%256;
Display(0,8); //调用数码管扫描
}
/*------------------------------------------------
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}
/*------------------------------------------------
uS延时函数,含有输入参数unsigned char t,无返回值
unsigned char是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5 uS
单片机密码锁实验报告

二○一六~二○一七学年第一学期电子信息工程系电子综合设计II报告书班级:电信(产业)1401班设计时间:2016/12/29学生姓名:曹子龙学号:201404135024指导教师:赵敏二○一六年十二月一、设计要求.题目内容:设计一个基于51单片机的电子密码锁:1.可以使用4*4的矩阵键盘与红外遥控器输入密码。
2.可以通过按特殊组合键重设开锁密码。
3.显示通过1602液晶屏显示电子密码锁界面,输入密码时显示输入个数显示为‘*’,如果密码正确,进入欢迎界面。
4.密码连续输入3次错误报警,LCD显示报警,倒计时十秒后重新进入密码输入界面。
5.可以通过特殊的按键组合跳过输入界面直接进入欢迎界面。
实现方法:1.通过红外接收头,连接单片机的P3.2外部中断INT0口,可以实现单片机接收遥控器的信号输入。
2.通过矩阵键盘扫描函数,可以实现对键盘输入的响应。
3.通过引脚的高低电平变化频率,控制蜂鸣器的输入占空比和频率(低电平时间固定,通过输入给函数值的不同改变高电平时间,固定响300个周期),对不同按键实现不同声音响应。
4.1602显示屏有16*2个单元格,每个单元格由5*8个像素点组成,可以很好的显示数字,符号,英文字符。
功能需求分析:液晶屏显示:根据题意,需要设计并显示输入密码界面、修改密码界面、欢迎界面、错误警告界面密码输入:根据题意,每次输入一个数字,则显示一个‘*’符号代替,只能看出输入的位数,若输入密码位数达到六位,则与正确密码比较,若正确,进入系统。
根据日常的手机使用习惯,默认长度为6位,且第六位输入之后立即判断,正确则进入,错误则清空重输。
组合键实现密码修改:密码修改必须通过不易被他人发现的特殊方法改变,所以设计为,若同时按住矩阵键盘的5,10 或6,9两个键,则进入密码修改函数。
输入密码错误三次则报错:一般的密码系统对密码输入错误次数过多的情况进行了限制,所以在密码锁里设置,若密码输入错误三次,则进入警报界面,显示10s倒计时,必须在倒计时结束后才能再次输入密码。
stm32矩阵键盘原理

STM32矩阵键盘原理详解引言矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。
在STM32微控制器中,利用GPIO引脚实现矩阵键盘控制相对简单,本文将详细介绍STM32矩阵键盘的基本原理。
基本原理矩阵键盘由多个按键组成,通常采用行列式排列。
每个按键都由一个触点和一个按键外壳组成,触点一般为弹簧式结构,按下按键时触点接通,释放按键时触点断开。
矩阵键盘的连接方式矩阵键盘的每个按键都被分配一个行号和列号,通过行线和列线来连接按键和控制芯片。
STM32通过GPIO来控制行线和列线的电平,实现按键的扫描和检测。
在STM32中,行线和列线可以连接到不同的GPIO引脚上。
行线连接到输出引脚,列线连接到输入引脚。
这样,通过对行线的输出和对列线的输入,可以实现对矩阵键盘的扫描和检测。
矩阵键盘的扫描原理矩阵键盘的扫描原理可以简单描述为以下几个步骤:1.将所有行线设置为高电平,所有列线设置为输入模式。
2.逐个将行线设置为低电平,并同时检测列线引脚的电平状态。
3.如果某一列的输入引脚检测到低电平,表示该列对应的按键被按下。
4.通过行线和列线的对应关系,确定被按下的按键的行号和列号。
矩阵键盘的按键映射通过扫描后,可以得到被按下的按键的行号和列号,STM32可以根据行列号的映射关系将按键信息转化为相应的按键值。
通常,矩阵键盘的按键映射是通过二维数组来实现的。
数组的行号对应行线,列号对应列线。
数组中的元素对应按键的键值。
例如,要实现一个4x4的矩阵键盘,可以通过以下数组表示按键的映射关系:uint8_t keyMap[4][4] = {{ '1', '2', '3', 'A' },{ '4', '5', '6', 'B' },{ '7', '8', '9', 'C' },{ '*', '0', '#', 'D' }};通过行列号可以确定数组中的元素,从而得到按键的键值。
4.2 中断方式矩阵键盘

d
E
F
第3行
C1
30pF
R5
10k
C2
30pF
U1 X1 19 XTAL1
CRYSTAL 18 XTAL2
9 RST
C3
10uF
29 30 31
PSEN ALE EA
U2
P1.0 18 P1.1 17 P1.2 16 P1.3 15 P1.4 14 P1.5 13 P1.6 12
11
B0 B1 B2 B3 B4 B5 B6 B7
批
文
子上的电话铃响了。
件
➢她读或写完正在读或写的字或 电话铃响
接 电
话
句子后,去接电话。
➢听完电话以后,她又从打断的
批 文
件
地方继续读或写。
单片机 应用技术
项目四 键盘的设计与实现
认识中断
中断
1. 当CPU正在执行某个程序时,由单片机内部 主
或外部的原因引起的紧急事件,向CPU发出 请求处理的信号;
项目四 键盘的设计与实现
中断方式矩阵键盘电路
ROL0 ROL1 ROL2 ROL3 COL0 COL1 COL2 COL3
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6
第0列
R4
10k
第1列
R3
10k
第2列
第3列
R2
R1
10k
10k
0
1
2
3
第0行
4
5
6
7
第1行
8
9
A
b
第2行
C
设计一个4×4中断方式矩阵键盘
任务要求
1. 当键盘无键按下时,单片机正常工作,不执行键盘扫 描程序;
51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法在使用51单片机控制矩阵键盘同时驱动数码管显示的过程中,可能会遇到一些常见的问题。
以下是一些可能的问题及相应的解决方法:按键无法正常响应:* 问题可能原因:接线错误、按键损坏、软件扫描不到按键信号。
* 解决方法:检查按键连接是否正确,确保按键没有损坏。
在软件中进行适当的按键扫描,确保能够正确检测到按键的状态。
数码管显示异常或不亮:* 问题可能原因:数码管接线问题、数码管损坏、数码管驱动程序错误。
* 解决方法:仔细检查数码管的接线是否正确,确保数码管没有损坏。
检查数码管的驱动程序,确保它按照正确的顺序和时序进行驱动。
按键重复响应或漏按现象:* 问题可能原因:按键抖动、软件扫描速度过快。
* 解决方法:在软件中增加适当的按键抖动延时,确保在按键按下或抬起时只响应一次。
调整软件扫描速度,避免扫描间隔过短导致的重复响应。
矩阵键盘的多个按键同时按下导致混乱:* 问题可能原因:矩阵键盘硬件连接错误、软件扫描算法问题。
* 解决方法:检查矩阵键盘的硬件连接,确保矩阵行和列没有短路或断路。
调整软件扫描算法,确保同时按下多个按键时能够正确识别。
数码管显示不正常的数字或乱码:* 问题可能原因:程序错误、数码管接线错误。
* 解决方法:仔细检查程序,确保数码管段选和位选的控制逻辑正确。
检查数码管的接线,确保每个数码管的连接都正确。
在解决问题时,建议逐步排除可能的原因,通过调试工具、逻辑分析仪或输出调试信息的方式来定位问题。
另外,仔细查阅51单片机的数据手册和相关文档,以确保硬件连接和软件设计都符合标准。
单片机矩阵键盘

汇报人: 202X-01-04
contents
目录
• 单片机矩阵键盘概述 • 单片机矩阵键盘硬件设计 • 单片机矩阵键盘软件编程 • 单片机矩阵键盘调试与测试 • 单片机矩阵键盘优化与扩展
01 单片机矩阵键盘 概述
定义与特点
定义
单片机矩阵键盘是一种由行线和 列线组成的键盘,通过按键的行 和列交叉点来识别按键。
用于显示输入的信息或状态, 如数码管、液晶显示屏等。
电源模块
为整个系统提供稳定的电源, 保证系统的正常工作。
电路连接
01
矩阵键盘的行线和列线分别连接到单片机的输入/输出端口,通 过软件扫描方式检测按键状态。
02
单片机控制模块与显示模块连接,将需要显示的信息传输给显
示模块。
电源模块为整个系统提供稳定的电源,保证系统的正常工作。
在通讯设备领域,单片机矩阵键盘可以用 于手机、电话等设备的操作面板,实现拨 号、挂断等功能。
பைடு நூலகம்
02 单片机矩阵键盘 硬件设计
硬件组成
01
02
03
04
矩阵键盘模块
由行线和列线组成的键盘矩阵 ,按键被安排在行线和列线的
交叉点上。
单片机控制模块
用于接收和处理来自矩阵键盘 的信号,控制整个系统的运行
。
显示模块
软件编程
编写单片机程序,用于扫描矩阵键盘并识 别按键按下事件。
测试方法
按键响应时间测试
测试从按键按下到单片机响应 的时间,确保在合理范围内。
按键防抖测试
测试按键防抖功能是否正常, 即在按键按下和释放时是否能 够正确识别。
多键同时按下测试
测试在多个按键同时按下时, 单片机是否能够正确识别并处 理。
简谈单片机检测按键原理和中断按键检测的办法

简谈单片机检测按键原理和中断按键检测的办法单片机检测按键原理首先说一下独立键盘检测,在单片机外围电路中,通常用到的按键都是机械弹性开关,当开关闭合时,线路导通,开关断开时,线路断开。
单片机检测按键的原理:按键的一端接地,另一端与单片机的某个I/O口相连,开始先给I/O赋一高电平,然后让单片机不断检测该I/O口是否变为低电平,当按键闭合时,相当于I/O口与地相连,就会变为低电平。
在单片机检测按键是否被按下时,电压的实际波形与理想波形时有一点=定差别的,波形在按下和释放瞬间都有抖动现象,抖动时间的长短和按键的机械特性有关。
所以单片机在检测键盘是否被按下都要加上去抖操作,所以在编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时。
独立键盘与单片机连接时每一个按键都需要一个I/O口,会过多占用I/O口资源。
所以就引出了矩阵键盘。
矩阵键盘的连接方式,每一行将每个按键的一端连接在一起构成行线,每一列将按键的另一端连接在一起构成列线。
这样的话,16个按键排成4行4列就只要8根线。
它的按键检测,简单点说,就是先送一列低电平,其余均为高电平,然后轮流检测,确认行列。
这里就要提到另外一个东西,switch-case语句又称开关语句,它是一个专门用于处理多分支结构的条件选择语句。
使用switch语句可直接处理多个分支。
按键检测是初学单片机的同学玩的前几个例程,按键的种类有许多(普通按钮,矩阵键盘等等),按键检测的方法也有许多。
对于普通按钮当然你会说设计一个外围电路通过GPIO 口读一下还不简单,或许你说通过外部中断做边沿检测,对于矩阵键盘来说,往往你会通过行列分别扫描的方法做按键检测,通常我们会加一个按键防抖(经典的方法是通过延时二次确认的方法进行按键防抖,还有就是按键释放的时候你可能会通过while语句去防抖,也就是按键如果一直按下,让程序一直死在while里),这些都是初学者常用的方法,但是如果是一个大的程序,往往是不允许你有这么多延时和死循环的。
实验5-独立键盘和矩阵键盘

实验5 独立键盘和矩阵键盘一、实验目的1、学会用C语言进行独立按键应用程序的设计。
2、学会用C语言进行矩阵按键应用程序的设计。
二、实验内容1、独立按键:对四个独立按键编写程序:当按k1时,8个LED同时100ms闪烁;当按k2时,8个LED从左到右流水灯显示;当按k3时,8个LED从右到左流水灯显示;当按k4时,8各LED同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭;2、矩阵按键:采用键盘扫描方式,顺序按下矩阵键盘后,在一个数码管上顺序显示0~F,采用静态显示即可。
3、提高部分(独立按键、定时器、数码管动态扫描):编写程序,实现下面的功能。
用数码管的两位显示一个十进制数,变化范围为00~59,开始时显示00,每按一次k1,数值加1;每按一次k2,数值减1;每按一次k3,数值归零;按下k4,利用定时器功能使数值开始自动每秒加1;再按一次k4,数值停止自动加1,保持显示原数。
三、实验步骤1、硬件连接(1)使用MicroUSB数据线,将实验开发板与微型计算机连接起来;(2)在实验开发板上,用数据线将相应接口连接起来;2、程序烧入软件的使用使用普中ISP软件将HEX文件下载至单片机芯片内。
查看结果是否正确。
四、实验结果——源代码1. #include "reg52.h"typedef unsigned char u8;typedef unsigned int u16;#define LED P2sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;const char tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u8 code begMid[]={0x7e, 0xbd,0xdb,0xe7, 0xdb, 0xbd, 0x7e}; void Delay(u16 i){ while(i--);}void KeyDown(){u8 i;if(key2==0){Delay(1000);if(key2==0){for(i=0;i<8;i++){LED=tab[i];Delay(50000);}while(!key2);}LED=0xff;}else if(key1==0){Delay(1000);if(key1==0)for(i=0;i<3;i++){LED=0x00;Delay(10000);LED=0xff;Delay(10000);}}}}void Int0Init(){IT0=1;EX0=1;EA=1;}void Int1Init(){IT1=1;EX1=1;EA=1;} void main(){Int0Init();Int1Init();while(1){KeyDown();}}void Int0() interrupt 0{u8 i;if(key3==0){Delay(1000);if(key3==0)for(i=7;i>=0;i--){LED=tab[i];Delay(50000);}}}}void Int1() interrupt 2{u8 i;if(key4==0){Delay(1000);if(key4==0){for(i=0;i<=6;i++){LED=begMid[i];Delay(50000);}}}}2.#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 KeyValue;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//??0~F?? void delay(u16 i){while(i--);}void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);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;}while((a<50)&&(GPIO_KEY!=0xf0)){delay(1000);a++;}}}}void main(){LSA=0;LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=smgduan[KeyValue];}}3.#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;#define KEYPORT P3sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;u16 t;u8 sec;u8 DisplayData[2];u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Time1Init(){TMOD |= 0x10;TH1=0Xd8;TL1=0Xf0;EA=1;ET1=1;}void delay(u16 i){while(i--); }void DigDisplay(){u8 i;for(i=0;i<2;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;break;case 1:LSA=1;LSB=0;LSC=0;break;}P0=DisplayData[i];delay(100);P0=0x00;}}void datapros(){DisplayData[0]=smgduan[sec%10];DisplayData[1]=smgduan[sec/10];}void main(){Time1Init();while(1){if(key4==0){delay(1000);if(key4==0){TR1=!TR1;while(key4==0);}}if(key3==0){delay(1000);if(key3==0){sec=0;while(key3==0);}}if(key2==0){delay(1000);if(key2==0){sec--;while(key2==0);}}if(key1==0){delay(1000);if(key1==0){sec++;while(key1==0);}}}}void Time1() interrupt 2{TH1=0Xd8;TL1=0Xf0;t++;if(t==100){t=0;sec++;if(sec>=60){sec=0;}}datapros();DigDisplay();}五、实验体会——结果分析1、独立按键:位定义四个按键key1、key2、key3、key4,宏定义LED为P2口,tab数组保存流水灯D0-D7依次点亮的数值,begMid数组保存流水灯同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。
(整理)单片机控制的矩阵键盘

INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。
可见,键盘输出经双稳态电路之后,输出已变为规范的矩形方波。
软件上采取的措施是:在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。
ANL A,#0FH
CJNE A,#0FH,KCODE;
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
2.独立式按键的软件结构
独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。图7.4中的I/O口采用P1口,请读者自行编制相应的软件。
80c51四位矩阵键盘(汇编)

L3: JB P1^3,NEXT ; P1.3等于1跳转到NEXT处
MOV A,#0cH; 将第四行的行值送入ACC
LK: ADD A,R4; 行值与列值相加后的键值送入A
PUSH ACC; 将A中的值送入堆栈暂存
L1: JB P1.1,L2; P1.1等于1跳转到L2
MOV A,#04H; 将第二行的行值送入ACC
AJMP LK; 跳转到键值理程序进行键值处理
L2: JB P1^2,L3; P1.2等于1跳转到L3
MOV A,#08H; 将第三行的行值送入ACC
ORG 0000H
LJMP MAIN
ORG 0003H
AJMP INT
ORG 0030H
MAIN: MOV P0,#0FFH; 程序启动时灯灭
MOV P1,#0F0H
SETB TCON.0; 外部中断为下降沿触发
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 088H;A
K4: LCALL DELAY; 调用延时去抖动程序
LCALL KS; 调用按键检测程序
JNZ K4; 按键没有松开继续返回检测
POP ACC; 将堆栈的值送入ACC
RET
NEXT:
INC R4; 将列值加一
MOV IE,#81H; 外部中断开中断
SJMP $
INT: CLR EA ;进入中断服务程序
PUSH PSW
LCALL DELAY
LCALL KS
JNZ SAOMIAO
中断法识别矩阵键盘的原理

中断法识别矩阵键盘的原理
中断法识别矩阵键盘的原理如下:
在一个矩阵键盘中,每个按键都与一个行和一个列相交。
当按下某个按键时,该按键的行和列之间会形成一个电路。
这个电路会触发一个中断信号,通知处理器有一个按键按下了。
中断是一种硬件信号,它可以暂停处理器正在执行的程序,并跳转到一个特殊的中断处理程序。
在矩阵键盘中,当有按键按下时,会触发一个中断信号,处理器会立即跳转到中断处理程序。
中断处理程序会读取键盘的状态寄存器,确定哪个按键被按下了。
然后它会将按键的ASCII码或扫描码存储在一个缓冲区中,以便处理器的主程序可以读取它。
通过这种方式,处理器可以在不阻塞主程序的情况下,实时地响应用户的键盘输入。
4×5矩阵键盘驱动程序

4×5矩阵键盘驱动程序一、工作原理及接口电路4×5矩阵键盘有4条列线,5条行线共20个按键。
每个按键对应不同键值,键盘扫描采用外部中断扫描方式,本系统中键盘为无源结构,键盘工作时不依靠任何外部电源。
4×5矩阵键盘结构图如图2-10 所示。
图2-10 4×5矩阵键盘结构图1)4×5矩阵键盘结构及按键抖动消除当键盘中按键数量较多时为减少I/O口的占用,通常将按键排列成矩阵形式,如图2-12所示。
在矩阵式键盘中,每条行线和列线在交叉处不直接连通,而是通过一个机械弹性开关加以连接。
这样5条列线(R0~R4)和4条行线(L0~L3)就可以构成20个按键的矩阵键盘。
键盘采用了无源结构,工作是不依靠任何外部电源。
由于机械弹性开关的机械触点的弹性作用,一个按键开关在闭合时并不会马上稳定的闭合,在断开时也不会马上断开,因而机械开关在闭合及断开瞬间均伴有一连串的抖动,如图2-11所示。
图2-11 按键时的抖动抖动的时间长短由按键开关机械特性及按键的人为因素决定,一般为5ms~20ms。
按键抖动如果处理不当会引起一次按键被误处理多次,所以消除抖动是必要的。
消除抖动的有硬件处理和软件处理两种方法。
当按键较多一般采用软件消抖方式。
软件消抖原理为当检测出按键闭合后执行一个延时程序(产生5ms~20ms的延时),待前沿抖动消失后再次检测按键的状态,如果按键仍保持闭合状态则可确认为有键按下。
当检测到按键释放并执行延时程序,待后沿抖动消失后才转入按键的处理程序。
1)矩阵键盘的工作原理从4×5矩阵键盘的4条列线和5条行线分别引出9条端线接于单片机的9个I/O 口,由于键盘采用了无源结构所以行列线的电平由单片机I/O口的电平决定。
进入按键处理程序后先使4条列线全为低电平,5条行线全为高电平,为读行线状态做准备,没有按键时这种状态不会被改变。
当键盘上的某个按键闭合时,则该键所对应的行线和列线被短路。
矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式
来源:《AVR 单片机嵌入式系统原理与应用实践》M16 华东师范大学电子系 马潮 当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成
矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交 点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行 或列线上的电平变化可以确定哪个按键被按下。
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩 阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
File name
: demo_9_3.c
Chip type
: ATmega16
Program type
: Application
Clock frequency
: 4.000000 MHz
// 输出行线电平 // 必须送 2 次!!!(注 1 // 读列电平 // 没有按键,继续扫描
// 有按键,停止扫描 // 转消抖确认状态
// 再次读列电平, // 与状态 0 的相同,确认按键 // 键盘编码,返回编码值
case 0b01000110:
key_return = K4_1;
break;
它们不仅与键盘的硬件连接有关系,同时还要注意他们在程序中是如何使用的, 其值的保存等等。
第6讲 矩阵式键盘设计

矩阵式键盘设计
软件去抖
在检测到有按键按下时
执行一个10ms左右( 执行一个10ms左右(具体 10ms左右 时间应视所使用的按键进 行调整)的延时程序后; 行调整)的延时程序后; 再确认该键电平是否仍保 持闭合状态电平, 持闭合状态电平,若仍保 持闭合状态电平, 持闭合状态电平,则确认 该键是处于闭合状态。 该键是处于闭合状态。
矩阵式键盘设计
矩阵式键盘电路
R1
10k
R2
10k
R3
10k
R4
10k
VCC GND
C1
30pF
X1
C2
30pF 19
C3
10uF
U1
XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17
1. 2. 3. 4.
矩阵式键盘设计
求按键的键值
对键盘的列线进行扫描,P0.4~P0.7循环输出 对键盘的列线进行扫描,P0.4~P0.7循环输出 1110、1101、1011和0111, 次读P0 P0口 若低4 1110、1101、1011和0111,依次读P0口,若低4位 全为1 则断定该列上没有键按下; 全为1,则断定该列上没有键按下; 否则,该列上就有键按下,并且就是行线为0 否则,该列上就有键按下,并且就是行线为0,列 线为0的交叉点,行号和列号按公式: 线为0的交叉点,行号和列号按公式:rol*4+col 计算得到按下键的键值。 计算得到按下键的键值。 例如,P0.4~P0.7输出1101时 P0口的低四位读 输出1101 例如,P0.4~P0.7输出1101时,P0口的低四位读 入的值为1011,不全为1,就可以断定有键按下, 入的值为1011,不全为1 就可以断定有键按下, 1011 并且是第 交叉点的键。于是, 并且是第2行和第1列交叉点的键。于是,该键的 4+1=9。 键值= 键值=2×4+1=9。按照相同的方法可以得到所有键 的键值。 的键值。如:return(rol*4+col);
单片机按键的解决方法

单片机按键的解决解决方案1、单片机上的按键控制一般采用两种控制方法:中断和查询。
中断必须借助中断引脚,而查询按键可用任何IO端口。
按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。
2、中断形式STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器.4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
每一个中断源都必须定义2个优先级。
有几点需要注意的是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外部中断扫描矩阵键盘;将4个7段数码显示器显示的内容放在4个显存中,4个显存空间定义如下LED0 EQU30HLED1 EQU31HLED2 EQU32HLED3 EQU 33HORG 0000HLJMP MAINORG0003H;转入外部中断0服务程序入口LJMP INP0ORG0040HMAIN: MOV SP, #60HSETB EX0 ;开INT0中断SETB IT0 ;设置中断触发方式SETB EA ;开总中断MOV LED0, #0MOV LED1, #1MOV LED2, #2MOV LED3, #3START: MOV P0, #00H;使显示器不显示MOV P2, #0FFH;关闭显示器位选择码目的也是使显示器不显示MOV A, LED0LCALL DISP0 ;调用将数值转换为显示段码并在P0端口输出的子程序CLR P2.0;最后一位七段数码管显示LCALL DELAY ;少许延时目的是使得数码管更亮MOV P0, #00H;使显示器不显示MOV P2, #0FFH ;MOV A, LED1LCALL DISP0 ;调用将数值转换为显示段码并在P0端口输出的子程序CLR P2.1;倒数第二位七段数码管显示LCALL DELAYMOV P0, #00H;使显示器不显示MOV P2, #0FFH ;MOV A, LED2LCALL DISP0 ;调用将数值转换为显示段码并在P0端口输出的子程序CLR P2.2 ;倒数第三位七段数码管显示LCALL DELAYMOV P0, #00H;使显示器不显示MOV P2, #0FFH ;MOV A, LED3LCALL DISP0 ;调用将数值转换为显示段码并在P0端口输出的子程序CLR P2.3;倒数第四位七段数码管显示LCALL DELAYLJMP START ;跳回初始位置,使程序循环;;;;;;;;;;;;;;;;;;;;;;;;;;;中断程序INP0: CLR EAPUSH PSWPUSH ACCPUSH BJB P2.3, NP2 ;P2.3口输出低电平,扫描K0,K1,K2,K3SK0: JB P2.4, SK1 ;P2.4为高电平扫描K0LCALL OPRK0 ;P2.4为低电平执行K0对应子程序LCALL DELAY1 ;延时去除抖动LJMP SKLOOP ;重新循环扫描SK1: JB P2.5, SK2LCALL OPRK1LCALL DELAY1 ;延时去除抖动LJMP SKLOOPSK2: JB P2.6, SK3LCALL OPRK2LCALL DELAY1 ;延时去除抖动LJMP SKLOOPSK3: JB P2.7, NP2 ;换一次输出位LCALL OPRK3LCALL DELAY1 ;延时去除抖动LJMP SKLOOPNP2: JB P2.2, NP3 ;P2.2口输出低电平,扫描K4,K5,K6,K7 SK4: JB P2.4, SK5 ;P2.4为高电平扫描K5LCALL OPRK4 ;P2.4为低电平执行K5对应子程序LCALL DELAY1 ;延时去除抖动LJMP SKLOOP ;重新循环扫描SK5: JB P2.5, SK6LCALL OPRK5LCALL DELAY1 ;延时去除抖动LJMP SKLOOPSK6: JB P2.6, SK7LCALL OPRK6LCALL DELAY1 ;延时去除抖动LJMP SKLOOPSK7: JB P2.7, NP3 ;换一次输出位LCALL OPRK7LCALL DELAY1 ;延时去除抖动LJMP SKLOOPNP3: JB P2.1, NP4 ;P2.1口输出低电平,扫描K8,K9,KA,KB SK8: JB P2.4, SK9 ;P2.4为高电平扫描K8LCALL OPRK8 ;P2.4为低电平执行K8对应子程序LCALL DELAY1 ;延时去除抖动LJMP SKLOOP ;重新循环扫描SK9: JB P2.5, SKALCALL OPRK9LCALL DELAY1 ;延时去除抖动LJMP SKLOOPSKA: JB P2.6, SKBLCALL OPRKALCALL DELAY1 ;延时去除抖动LJMP SKLOOPSKB: JB P2.7, NP4 ;换一次输出位LCALL OPRKBLCALL DELAY1 ;延时去除抖动LJMP SKLOOPNP4: JB P2.0, SKLOOP;P2.0口输出低电平,扫描KC,KD,KE,KF SKC: JB P2.4, SKD ;P2.4为高电平扫描KCLCALL OPRKCLCALL DELAY1 ;延时去除抖动LJMP SKLOOP ;重新循环扫描SKD: JB P2.5, SKELCALL OPRKDLCALL DELAY1 ;延时去除抖动LJMP SKLOOPSKE: JB P2.6, SKFLCALL OPRKELCALL DELAY1 ;延时去除抖动LJMP SKLOOPSKF: JB P2.7, SKLOOP ;换一次输出位LCALL OPRKFLCALL DELAY1 ;延时去除抖动LJMP SKLOOPSKLOOP: POP BPOP ACCPOP PSWSETB EARETI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;子程序OPRK0: MOV P1, #00HSETB P1.0MOV LED3, #16MOV LED1, #1MOV LED0, #0RETOPRK1: MOV P1, #00HSETB P1.1MOV LED3, #16MOV LED2, #18MOV LED1, #1MOV LED0, #1RETOPRK2: MOV P1, #00HSETB P1.2MOV LED3, #16MOV LED2, #18MOV LED1, #1MOV LED0, #2RETOPRK3: MOV P1, #00HSETB P1.3MOV LED3, #16MOV LED2, #18MOV LED1, #1MOV LED0, #3RETOPRK4: MOV P1, #00HSETB P1.4MOV LED3, #16MOV LED2, #18MOV LED1, #1MOV LED0, #4RETOPRK5: MOV P1, #00HSETB P1.5MOV LED3, #16MOV LED2, #18MOV LED1, #1RETOPRK6: MOV P1, #00HSETB P1.6MOV LED3, #16MOV LED2, #18MOV LED1, #1MOV LED0, #6RETOPRK7: MOV P1, #00HSETB P1.7MOV LED3, #16MOV LED2, #18MOV LED1, #1MOV LED0, #7RETOPRK8: MOV P1, #00HSETB P1.0MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #0RETOPRK9: MOV P1, #00HSETB P1.1MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #1RETOPRKA: MOV P1, #00HSETB P1.2MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #2RETOPRKB: MOV P1, #00HSETB P1.3MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #3RETOPRKC: MOV P1, #00HSETB P1.4MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #4RETOPRKD: MOV P1, #00HSETB P1.5MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #5RETOPRKE: MOV P1, #00HSETB P1.6MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #6RETOPRKF: MOV P1, #00HSETB P1.7MOV LED3, #16MOV LED2, #18MOV LED1, #3MOV LED0, #7RETDELAY: MOV R6, #1;D2: MOV R7, #200;DJNZ R7, $ ;DJNZ R6, D2 ;RET ;DELAY1: MOV R2, #1D1: MOV R3, #200;D3: MOV R4, #200;DJNZ R4, $ ;DJNZ R3, D3 ;DJNZ R2, D1RETDISP0: MOV DPTR, #TABMOVC A, @A+DPTR ;将数值转换为显示段码MOV P0, A;将查得的段码显示RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;段码表TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,40H,80H,73H ; '0' '1' '2' '3' '4' '5' '6' '7' '8 ' '9' 'A' 'B' 'C' 'D' 'E' 'F' '-' '.' 'P'; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 END;结束程序。