独立按键与矩阵键盘
- 格式:ppt
- 大小:313.00 KB
- 文档页数:29
一、实验目的1. 理解键盘扫描的基本原理。
2. 掌握使用C语言进行键盘扫描程序设计。
3. 学习键盘矩阵扫描的编程方法。
4. 提高单片机应用系统的编程能力。
二、实验原理键盘扫描是指通过检测键盘矩阵的行列状态,判断按键是否被按下,并获取按键的值。
常见的键盘扫描方法有独立键盘扫描和矩阵键盘扫描。
独立键盘扫描是将每个按键连接到单片机的独立引脚上,通过读取引脚状态来判断按键是否被按下。
矩阵键盘扫描是将多个按键排列成矩阵形式,通过扫描行列线来判断按键是否被按下。
这种方法可以大大减少引脚数量,降低成本。
本实验采用矩阵键盘扫描方法,使用单片机的并行口进行行列扫描。
三、实验设备1. 单片机开发板(如51单片机开发板)2. 键盘(4x4矩阵键盘)3. 连接线4. 调试软件(如Keil)四、实验步骤1. 连接键盘和单片机:将键盘的行列线分别连接到单片机的并行口引脚上。
2. 编写键盘扫描程序:(1)初始化并行口:将并行口设置为输入模式。
(2)编写行列扫描函数:逐行扫描行列线,判断按键是否被按下。
(3)获取按键值:根据行列状态,确定按键值。
(4)主函数:调用行列扫描函数,读取按键值,并根据按键值执行相应的操作。
3. 调试程序:将程序下载到单片机,观察键盘扫描效果。
五、实验程序```c#include <reg51.h>#define ROW P2#define COL P3void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);}void scan_key() {unsigned char key_val = 0xFF;ROW = 0xFF; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值}void main() {while (1) {scan_key();if (key_val != 0xFF) {// 执行按键对应的操作}}}```六、实验结果与分析1. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。
矩阵键盘的原理及应用1. 矩阵键盘的原理矩阵键盘是一种常见的输入设备,由多个按键组成,可以同时检测多个按键的状态。
它采用了行列交叉的按键排列方式,通过按键的组合来实现多个输入选项。
其原理主要包括以下几个方面:1.1. 电路结构矩阵键盘的电路结构也称为“行列式键盘”,主要由行线(Row)和列线(Column)组成。
行线和列线通过导线互相交叉连接形成一个矩阵,每个按键都对应矩阵中的一个交叉点。
按键按下时,会导通对应的行线和列线,从而实现按键的状态检测。
1.2. 矩阵扫描矩阵键盘的工作原理是通过矩阵扫描来检测按键状态。
扫描过程由控制器完成,控制器通过逐行扫描的方式检测按键状态。
具体流程如下:1.所有行线置为高电平,所有列线设置为输入模式。
2.逐行将某一行设置为低电平,同时读取列线上的状态。
3.根据读取到的列线状态,确定按下的按键。
4.更新按键的状态,并记录下来。
5.重复以上步骤,直到扫描结束。
1.3. 按键编码矩阵键盘检测到按键状态后,需要进行按键编码,将按键状态转化为数字或字符。
常见的按键编码方式有两种:•行列编码:将矩阵键盘的行和列对应关系转化为一个唯一的值,通常使用二进制编码来表示。
•状态编码:通过按键的状态(按下或释放)来表示,通常使用两个状态位来编码。
2. 矩阵键盘的应用矩阵键盘由于其结构简单、使用方便等特点,在多个领域都得到了广泛的应用。
以下是矩阵键盘的一些常见应用场景:2.1. 电子产品矩阵键盘在电子产品中被广泛应用,比如手机、电视遥控器、计算器等。
它可以提供多个输入选项,方便用户进行操作。
矩阵键盘的结构紧凑,可与其他电路板集成,节省空间,适用于小型电子产品。
2.2. 工业控制矩阵键盘在工业控制领域也有重要应用。
比如工控终端设备、仪表仪器等,可以利用矩阵键盘实现数据输入和操作控制。
由于矩阵键盘可以同时检测多个按键的状态,因此非常适合于工业环境中需要同时输入多个信号的场合。
2.3. 家用电器矩阵键盘在家用电器中也有广泛应用,如洗衣机、微波炉、冰箱等。
[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。
按其它键退出。
2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。
可定义“A”键为“+”键,“B”键为“=”键。
二、实验目的学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
三、实验说明1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0某F0;假如此时没有人按键,从P1口读出的值应仍为0某F0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0某B0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0某BF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0某BE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
独立式键盘的设计与应用实验报告实验报告:指导教师:xxx实验者:13410801 xx 13410802 xxx一、实验目的:1.了解直接输入键盘与矩阵键盘的原理。
2.了解键盘寄存器的功能。
3.掌握键盘输入的编程方法。
二、实验要求:1.对所有16个按键进行编码,当按键后,在七段数码管上显示对应的键盘编码(可以使用一个或两个七段数码管)。
2.对所有16个按键进行编码,当按键后,在八个LED上显示对应的键盘编码。
三、实验内容:1.在键盘寄存器KPC中,使能矩阵键盘。
2.必须在使用前添加下面语句:#define KAPS_VALUE (*((volatile unsigned char*)(0x41500020)))3.接下来在button_statusFetch函数中定义变量,其中j用来获取矩阵键盘的键值,具体如下:char j = 0;j = KAPS_VALUE ;4.最后,在直入键盘的分支语句后添加矩阵键盘的分支代码段,即switch(j){}代码段:switch (j){case 0x00: //key-press 5kbd_buff=0x8F12;LED_CS2 = kbd_buff;Delay(400);break;……四、程序编辑:;post_initGpio.sEXPORT post_initGpioAREA post_initGpio ,CODE ,READONLYldr r1,=0x40e00000;GPSR0MOV R0,#0x3000 ;GPIO<13:12>STR R0,[R1,#0x18];GPCR0MOV R0,#0x800 ;GPIO<11>STR R0,[R1,#0x24];GAFR0_L/////////////////////////////////////////////// /// MOV R0,#0x80000000 ;GPIO<15>:F2:nCS1 STR R0,[R1,#0x54];GAFR0_Uldr R0,=0x10 ;0xa5000010STR R0,[R1,#0x58];GPDR0///////////////////////////////////////////////// ldr R0,=0xc1a08000 ;GPIO<15>:nCS1 STR R0,[R1,#0xc];GPSR1MOV R0,#0STR R0,[R1,#0x1c];GPCR1MOV R0,#0STR R0,[R1,#0x28];GAFR1_LLDR R0,=0xc9c ;0xa9558STR R0,[R1,#0x5c];GAFR1_ULDR R0,=0xca0 ;0xaaa590aaSTR R0,[R1,#0x60]LDR R0,=0xca4 ;0xfccf0382STR R0,[R1,#0x10];GPSR2MOV R0,#0x10000STR R0,[R1,#0x20];GPCR2MOV R0,#0STR R0,[R1,#0x2c];GAFR2_L////////////////////////////////////ldrR0,=0xa0000000 ;0xaaaaaaaa ;GPIO<79:78>:nCS<3:2> STR R0,[R1,#0x64];GAFR2_U/////////////////////////////////////////ldr R0,=0x50000400;0x50090402 ;GPIO<95:94,80>:KP_DKIN<1>,KP_DKIN<2>,nCS4 STR R0,[R1,#0x68];GPDR2///////////////////////////////////////////ldr R0,=0x0221ffff ;GPIO<80:78>:nCS<4:2>STR R0,[R1,#0x14]; LDR R0,=0xca8; STR R0,[R1,#0x68]MOV R0,#0x20000STR R0,[R1,#0x118];GPCR3MOV R0,#0STR R0,[R1,#0x124];GAFR3_L////////////////////////////////////////////// ldr R0,=0x020a95c3 ;GPIO<108,105:98>STR R0,[R1,#0x6c];GAFR3_Uldr R0,=0x1408STR R0,[R1,#0x70];GPDR3///////////////////////////////////////////////// / ldr R0,=0x21381;GPIO<108,105:103>STR R0,[R1,#0x10c];config twice:;GAFR0_Uldr R0,=0xa5000010 ;0x0x10STR R0,[R1,#0x58];GAFR1_LLDR R0,=0xa9558 ;0xc9cSTR R0,[R1,#0x5c]LDR R0,=0xaaa590aa ;0xca0STR R0,[R1,#0x60];GPDR1LDR R0,=0xfccf0382 ;0xca4STR R0,[R1,#0x10];GAFR2_L/////////////////////////////////////////////// ////ldr R0,=0xa0000000 ;GPIO<79:78>:nCS<3:2>STR R0,[R1,#0x64];GAFR2_U/////////////////////////////////////////////// //////////////// ////////ldr R0,=0x50090402;GPIO<95:94,80>:KP_DKIN<1>,KP_DKIN<2>,nCS4STR R0,[R1,#0x68]mov pc,r14END;post_initKey.sEXPORT post_initKeyAREA post_initKey, CODE, READONLYnopnopldr r1,=0x41500000;KPCldr r0,=0x3FAFF1C2 ; (0x2FAFF9C3:interrupt) str r0,[r1,#0x0];KPDK; ldr r0,=0x1; str r0,[r1,#0x8]; ;KPREC; ldr r0,=0x1; str r0,[r1,#0x10];KPMK; ldr r0,=0x1; str r0,[r1,#0x18];KPAS; ldr r0,=0x1; str r0,[r1,#0x20]; ldr r0,=0x1; str r0,[r1,#0x0];KPKDIldr r0,=0x707str r0,[r1,#0x48]mov pc,r14END五、实验结果:当按下键盘上的按键时,七段数码管可以显示出对应的编码。
实验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数组保存流水灯同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。
矩阵键盘的检测和独立按键的区别
这次我接着上次的说,讲一下复合按键和矩阵键盘。
先说矩阵键盘,因为我写的组合键代码是在矩阵键盘的基础上写的,当然在独立按键上写组合键更简单一些。
所以当你矩阵键盘的组合键会写的时候,你在独立按键上的组合键也就会写了。
矩阵键盘的检测和独立按键有很大的区别,但是究其本质还是一样的。
先看一下矩阵键盘的原理图:
矩阵键盘原理图
由于矩阵键盘中每一个按键的两个接线口都是接在IO口上的,所以我们就必须在软件里面控制单片机在每个独立按键的两端加上不同的电平。
【注】:独立按键很简单,直接在一端接地就行了。
矩阵按键的原理及代码实现
独⽴按键和矩阵按键:
矩阵按键扫描原理:
⽅法⼀、逐⾏扫描,我们可以通过⾼四位轮流输出低电平来对矩阵键盘进⾏扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪⼀位为0来判断是哪⼀个按键被按下。
⽅法⼆、⾏列扫描,我们可以通过⾼四位全部输出低电平,低四位输出⾼电平,当接收到的数据,低四位不全为⾼电平时,说明有按键按下,然后通过接受的数据值,判断是哪⼀列有按键按下,然后再反过来,⾼四位输出⾼电平,低四位输出低电平,然后根据接收到的⾼四位的值判断是哪⼀⾏有按键按下,这样就能够确定是哪⼀个按键按下了。
通常我们⽤到的是⾏列扫描
代码实现:(待更新)。
基于单片机的键盘和LED数码管工作原理单片机是一种集成电路芯片,它包含了中央处理器、存储器和各种输入输出接口等核心功能。
而键盘和LED数码管则是单片机中常用的输入和输出设备之一键盘通常由多个按键组成,每个按键对应一个电路开关。
当按键按下时,电路闭合,形成通路,使电流流过。
按键抬起时,电路断开,通路被切断。
在单片机的键盘应用中,常用的键盘有矩阵键盘和独立按键两种。
矩阵键盘是将多个按键排列成矩阵的形式,通过行和列两个方向上的电极连接到单片机的输入输出引脚上。
当一些按键按下时,对应的行和列的电极会形成电路,单片机通过扫描行和列的方式,来检测按键的状态。
具体的工作原理如下:1.单片机通过输出行电平信号,将每行的引脚设置为输出模式,并将行的电平拉低;2.单片机通过输入列电平信号,将每列的引脚设置为输入模式,并开启输入状态;3.单片机依次扫描每行,检测是否有按键按下;4.如果有按键按下,则表示该行对应的列电平会被单片机检测到;5.单片机根据行和列的组合,确定按下的按键。
独立按键则是将每个按键对应的引脚直接连接到单片机的输入引脚上,按键按下时,直接检测到引脚的电平信号。
LED数码管是一种显示设备,它由多个LED组成,可以用于显示数字、字母和符号等信息。
在单片机的LED数码管应用中,常见的数码管有共阳和共阴两种类型,在工作时,需要通过单片机的输出引脚来控制数码管的亮灭。
共阳数码管的工作原理如下:1.单片机通过输出引脚产生一个高电平信号,与数码管的相应位相连接;2.当输出引脚电平为高时,该位的LED被通电,发出光亮;3.当输出引脚电平为低时,该位的LED断电,熄灭。
共阴数码管的工作原理与共阳相反:1.单片机通过输出引脚产生一个低电平信号,与数码管的相应位相连接;2.当输出引脚电平为低时,该位的LED被通电,发出光亮;3.当输出引脚电平为高时,该位的LED断电,熄灭。
通常,为了达到流水灯效果或同时显示多位数字,需要使用多个输出引脚来控制多个LED数码管。
独立式键盘和矩阵式键盘是两种常见的计算机输入设备,它们各自有着不同的特点和应用场合。
下面将分别对两种键盘的应用场合进行简述。
一、独立式键盘的应用场合1. 专业键盘输入独立式键盘通常采用机械键盘的结构,具有较长的按键行程和良好的手感,适合需要大量键盘输入的专业人士使用,如程序员、作家、编辑等。
2. 高端游戏玩家对于注重游戏体验的高端游戏玩家来说,独立式键盘同样是一种不错的选择。
它们通常具有反应迅速、按键触感舒适的特点,能够满足玩家对于游戏操作的要求。
3. 办公场合在办公场合,独立式键盘也有着很好的应用前景。
其结构稳固,按键手感舒适,可以提高办公人员的工作效率,并减少长时间使用键盘造成的手部疲劳。
二、矩阵式键盘的应用场合1. 多媒体控制矩阵式键盘通常体积较小,布局紧凑,适合用于多媒体设备的控制。
在数字音乐控制台上就常常使用矩阵式键盘来控制音乐的播放、切换等操作。
2. 工业自动化设备在工业自动化设备中,常常需要使用键盘来进行设备的参数设置和控制。
而矩阵式键盘适合布局灵活,结构紧凑,适用于工业环境的特点,因此在这些场合下有很好的应用表现。
3. 其他特殊场合除了上述提到的应用场合外,矩阵式键盘还可以用于一些特殊的场合,比如医疗设备、安防设备等领域。
独立式键盘和矩阵式键盘各自在不同的应用场合中发挥着重要的作用。
在选择键盘时,用户需要根据自己的实际需求和使用场景来选择适合的键盘类型,以便更好地提高工作和生活的效率。
在现代社会,随着科技的不断发展和应用范围的扩大,人们对输入设备的要求也越来越高。
键盘作为计算机最基本的输入设备,其种类和类型也越来越多样化。
除了独立式键盘和矩阵式键盘之外,还有触摸键盘、薄膜键盘、无线键盘等多种类型,每种键盘都有其特定的应用场合。
独立式键盘因其较长的按键行程和舒适的手感,被广泛应用于专业领域,如程序员、作家、编辑等需要长时间键盘输入的人裙。
而在专业音乐领域,独立式键盘同样得到了广泛的应用。
矩阵键盘工作原理1.按键扫描:矩阵键盘是由多个按键组成的,这些按键被排列成一个矩阵的形式。
在进行按键扫描时,会依次逐行或逐列地检测按键的状态,看是否有按键被按下。
通常,每行和每列都会有一个针脚来连接按键。
当按下一个按键时,该按键所在的行和列之间就会出现电性连通,形成一个按键矩阵电路。
2.按键编码:在按键扫描中,通过检测按键的行列连通状态可以确定哪个具体的按键被按下。
然而,矩阵键盘的针脚数量有限,无法通过直接连接给每一个按键独立编码的方式来实现,因此需要对按键信号进行编码。
一种常用的编码方式是使用行列编码器。
行列编码器通过感知具体的按键被按下的行和列连通状态来判断该按键的位置,并将该按键位置信息转化为一个对应的码值。
这个码值可以被传递给设备控制器或处理器,进而被进一步处理。
行列编码器通常通过矩阵按键的行列针脚输入来判断按键连通状态,然后将结果输出给设备控制器或处理器。
在实际应用中,矩阵键盘一般采用扫描式工作方式,即按键的行和列依次进行扫描。
具体工作步骤如下:1.首先,设备控制器或处理器会向矩阵键盘的行线输出一个低电平信号,同时将列线设置为输入状态。
2.然后,设备控制器或处理器会逐列检测按键的状态。
当有按键被按下时,该行和列之间会有电性连通,此时检测到的列的状态会改变。
设备控制器或处理器会将该连通的行列位置信息传递给行列编码器进行编码。
3.接下来,设备控制器或处理器会依次递增行的编号,重复上述步骤进行按键扫描,并实时更新按键状态信息,直到按键扫描完成。
总结起来,矩阵键盘的工作原理即通过扫描按键的行和列连通状态来检测按键是否被按下,然后通过行列编码器将按键位置信息编码为一个码值,最后将该码值传递给设备控制器或处理器进行处理。
通过这样的工作原理,矩阵键盘可以实现多个按键的同时检测和编码,为用户提供方便、高效的输入方式。
51单片机学习之5-独立按键和矩阵键盘
第14集
键盘的原理
键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。
非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)
独立键盘的电路图。
因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。
当检测到IO口为0时即可判断该按键已经按下。
按键按下时会有一个抖动的
过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。
因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。
例程:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitKey=P3;//按键
sbitLed=P1;//Led灯
voiddelay(uintz);
/********主函数********/
voidmain()。
矩阵按键控制一、矩阵按键电路结构1、独立按键2、矩阵按键(4×4键盘)3、按键防抖分析:二、按键处理流程三、工作方式:查询法、中断法四、按键程序设计按键输入程序的设计通常需要完成以下任务:1、判断有无按键按下由于直接进行按键扫描,需要的时间比较长。
如果对程序性能有较高要求,通常需要另外编写判断有无按键按下的函数。
仅判断有无按键按下,无需进行扫描,这样程序执行速度就快得多。
当有按键按下时,再调用按键扫描程序来取键值。
2、消除按键抖动干扰矩阵键盘消接抖与独立按键一样,检测到有按键按下后,延时10ms左右,再确认是否有键按下,如两次都检测到有键按下,才确认为有按键按下。
特别说明,并不是所有按键动作都必须消除按键抖动。
当按键要处理的事情与按键的次数有关时,必须消键抖动。
连续按一次或多次键,对要完成的事情没有影响时,可以不消键抖动。
3、识别被按下的键值。
确认有按键按下后,调用取键值函数获取键值。
4、等待按键释放。
只有键释放了,才完成了一次“按键”动作。
至于是先等待按键释放,再处理按键的工作;还是先处理按键的工作,再等待按键释放,要根据工作的要求来决定。
五、引脚控制:行线、列线根据实际采用跳线来连接。
六、控制程序举例/****** 4*4键扫描程序开始 ******/sbit keyC0=P0^0;sbit keyC1=P0^1;sbit keyC2=P0^2;sbit keyC3=P0^3;sbit keyR0=P2^4;sbit keyR1=P2^5;sbit keyR2=P2^6;sbit keyR3=P2^7; uchar key_get(){uchar k=255; //键值暂存,无键返回255keyC0=keyC1=keyC2=keyC3=keyR0=keyR1=keyR2=keyR3=1; //拉高位线电平keyR0=0; //第1行if(keyC3==0)k=0;else if(keyC2==0)k=1;else if(keyC1==0)k=2;else if(keyC0==0)k=3;keyR0=1;keyR1=0; //第2行if(keyC3==0)k=4;else if(keyC2==0)k=5;else if(keyC1==0)k=6;else if(keyC0==0)k=7;keyR1=1;keyR2=0; //第3行if(keyC3==0)k=8;else if(keyC2==0)k=9;else if(keyC1==0)k=10; //0xAelse if(keyC0==0)k=11; //0xBkeyR2=1;keyR3=0; //第4行if(keyC3==0)k=12; //0xCelse if(keyC2==0)k=13; //0xDelse if(keyC1==0)k=14; //0xEelse if(keyC0==0)k=15; //0xFkeyR3=1;return k; //返回键值}/****** 4*4键扫描程序结束 ******/void main(){bit keyDown=0;while(1){if(keyDown==0&&key_get()!=255) //防抖消除功能{delay(200);if(key_get()!=255){jianzhi=key_get();keyDown=1;switch(jianzhi) //判断键值{case 0:yuan1++;break; //对应键值的操作功能case 1:yuan5++;break; //对应键值的操作功能case 2:yuan10++;break; //对应键值的操作功能}}}}}。