第3套题矩阵键盘扫描分析
简述扫描法识别矩阵式键盘上闭合键的方法
简述扫描法识别矩阵式键盘上闭合键的方法扫描法是一种常见的识别矩阵式键盘上闭合键的方法。
矩阵式键盘是指将键排列成矩阵形式的键盘,其中每个键都有一个唯一的行列坐标。
扫描法通过依次扫描矩阵中的每个键,并检测按下的键是否闭合来实现键盘输入的识别。
以下是利用扫描法识别矩阵式键盘上闭合键的一般步骤:1.确定矩阵的行数和列数:首先确定键盘的行数和列数,通常可以通过读取键盘的配置文件或者手动测量来获取。
2.设置输入输出引脚:将矩阵的行和列分别与输入输出引脚相连,通常使用数字输入输出引脚来实现。
根据具体的硬件平台和编程语言,设置引脚可以使用GPIO库或者其他相关库函数。
3. 循环扫描键盘:使用一个循环结构不断扫描键盘的状态。
一般的循环结构可以使用while或者for语句实现。
4.逐行扫描:在每次循环中,按照从上到下的顺序逐行扫描键盘。
可以使用一个循环结构来实现逐行扫描。
5.逐列检测:对于每行键盘键,按照从左到右的顺序逐列检测。
通过将当前的行输入高电平,然后逐一检测列的输入状态,以确定是否有键闭合。
如果检测到闭合键,可以记录下当前的行列坐标。
6.处理按键操作:在检测到闭合键后,根据该键的行列坐标来进行相应的键盘输入处理。
可以通过根据行列坐标查找键对应的ASCII码或者其他键值来实现。
7.更新循环:在完成当前一次循环后,更新循环计数器,继续循环扫描键盘。
需要注意的是,扫描法是一种实时性较强的识别方法,需要以较高的频率(例如每秒数十次)循环扫描键盘,以确保能够准确地检测到闭合键。
此外,具体的实现方法可能会因硬件平台和编程语言的不同而有所差异,需要根据具体的情况进行调整。
总结起来,扫描法通过按照一定的顺序逐行逐列扫描矩阵式键盘,并根据检测到的闭合键的行列坐标来进行识别,实现了键盘输入的功能。
这种方法简单、可靠,被广泛应用在许多电子设备和系统中。
矩阵键盘扫描
矩阵键盘扫描1.实验目的与效果:4¡4矩阵键盘在众多场合有举足轻重的地位,所以有必要学好矩阵键盘扫描的编程。
实验板上的矩阵键盘是接单片机P2口的,以P2.4-P2.7作输出线,P2.0-P2.3作输入线;每按一个键会在数码管上显示相关的信息。
键盘上可以这样来定义,这只是个例子,用户在运用矩阵键盘键值是可以重新定义之。
2.原理图:矩阵键盘连接图3.实验板上操作:1)矩阵键盘在实验板上已经固定连接P2口了。
2)将HEX文件烧到单片机上。
3)将数码管的位选拨码开关拨到ON上。
4.实物连接图:拨码开关全部拨到ON5. C语言程序://MCU:AT89S51//晶振:12M#include"AT89X51.H"unsigned char code numcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF};//数字0~9及ABCDEF共阳数码管代码unsigned char code charcode[]={0xc0,0xc7,0xc7,0x86,0x89};// HELLO 字样共阳数码管代码unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管位选代码unsigned char dispbuf[8]={16,16,16,0,1,2,3,4};unsigned char disp_bit_count;unsigned char disp_count;unsigned char temp;unsigned char key;unsigned char i,j;/********1ms延时子程序***********/delay_nms(unsigned int n){unsigned int i;unsigned char j;for(i=0;i<n;i++)for(j=0;j<120;j++); //空操作}unsigned char keyscan(void){P2=0xff;P2_4=0;temp=P2;temp=temp&0x0f;if (temp!=0x0f){delay_nms(10);temp=P2;temp=temp&0x0f;if (temp!=0x0f){temp=P2;temp=temp&0x0f;switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;}temp=P2;temp=temp & 0x0f;while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}P2=0xff;P2_5=0;temp=P2;temp=temp&0x0f;if (temp!=0x0f){delay_nms(10);temp=P2;temp=temp&0x0f;if (temp!=0x0f){temp=P2;temp=temp&0x0f;switch(temp){case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;}temp=P2;temp=temp & 0x0f;while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}P2=0xff;P2_6=0;temp=P2;temp=temp&0x0f;if (temp!=0x0f){delay_nms(10);temp=P2;temp=temp&0x0f;if(temp!=0x0f){temp=P2;temp=temp&0x0f;switch(temp){case 0x0e:key=1;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;}temp=P2;temp=temp&0x0f;while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}P2=0xff;P2_7=0;temp=P2;temp=temp & 0x0f;if (temp!=0x0f){delay_nms(10);temp=P2;temp=temp&0x0f;if (temp!=0x0f){temp=P2;temp=temp & 0x0f;switch(temp){case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;case 0x07:key=15;break;}temp=P2;temp=temp & 0x0f;while(temp!=0x0f){temp=P2;temp=temp & 0x0f;}}}return (key);}void main(void){TMOD=0x02; //使用定时器0,选择方式2(常数自动重装的8位定时器)TH0=0x06; //保存数值,用于自动重装TL0=0x06; //定时250uS初值TR0=1; //开定时器0ET0=1; //开定时器0溢出中断EA=1; //开总中断while(1){dispbuf[0]=keyscan();}}/**********T0250uS中断服务程序***************/void t0(void) interrupt 1 using 0{disp_count++;if(disp_count==8){disp_count=0;if(disp_bit_count>=3)P0=charcode[dispbuf[disp_bit_count]];elseP0=numcode[dispbuf[disp_bit_count]];P1=bitcode[disp_bit_count];disp_count=0;disp_bit_count++;if(disp_bit_count==8){disp_bit_count=0;}}}。
行列式键盘扫描
实验二 行列式键盘扫描一. 实验内容与目的1. 实验内容利用行列式键盘,当按下键盘中的一个键子时会在数码管上显示出相应的键值,要求键盘有去抖功能,数码管显示的键值能进行移位。
2,实验目的学会行列式键盘扫描的原理与方法,进一步强化对MSP430I/O 口使用方法的掌握,加强msp430C 语言编程的能力。
二. 方法与结果键盘扫描:利用P3口进行键盘扫描,如图,令P3.0~P3.3为输出端口,P3.4~P3.7为输入端口,由于P3.4~P3,7接了上拉电阻,所以当没有键子按下时P3.4~P3.7都为‘1’,当有键子按下时P3.4~P3.7就有可能发生变化。
所以键盘扫描式先让P3.0~P3.3都为‘0’,当有键子按下时P3.4~P3.7就会有一个由‘1’变为‘0’,根据哪一个变为‘0’就能判断出相应的列有键子按下,再让P3.0~p3.3逐个变为‘1’判断出哪一行有键子按下进而确定出哪一个键子按下。
11221112221122311224112251122611227112281122911221122#1122*1122A 1122B1122C1122DR2510k R2610kR2710kR2810kP_30P_31P_32P_33P_34P_35P_36P_37P3.0~p3.3为‘0’P3.4~p3.7都为‘1’P3.4~P3.7不都为‘1’ 令P3.0~p3.3逐个为‘1’ 确定列确定行当P3.4~p3.7都为‘1’确定键值数码管显示:数码管位选与段选共用P1.0~P1.3,利用锁存器74HC373分时进行段选和位选,P6.1和P6.2控制74HC373,从而使相应数码管显示相应数。
电路图如下:e 1d 2d p3c 4g 546b 73829f 10a 11112seg4O E 1Q 02D 03D 14Q 15Q 26D 27D 38Q 39G N D 10L E11Q 412D 413D 514Q 515Q 616D 617D 718Q 719V C C 2074HC373_174HC373O E 1Q 02D 03D 14Q 15Q 26D 27D 38Q 39G N D 10L E11Q 412D 413D 514Q 515Q 616D 617D 718Q 719V C C 2074HC373_274HC373R19100R20100R21100R22100R2310k R2410k P_61P_62VCCVCCGND GNDGND GND GNDGNDP_10P_11P_12P_13P_14P_15P_16P_17三. 实验程序#include<msp430.h> void KEYSCAN(); void TUBESCAN();void KEYSLOVE( unsigned int key); unsigned char const table[]={0xff,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0~F 码值 unsigned int s1=0,s2=0,s3=0,s4=0; //s1~s4保存相应键值,进行显示 unsigned int key;void delay1(unsigned int i) {while(i--); }void main() {WDTCTL=WDTPW+WDTHOLD; P1DIR=0xff; P1SEL=0x00; P3SEL=0x00; P3DIR=0x0f;P6DIR=BIT1+BIT2; TUBESCAN(); P3OUT=0xf0; while(1)KEYSCAN();TUBESCAN();}}void KEYSCAN(){P3OUT=0xf0;if(P3IN!=0xf0){switch(P3IN){case (0xe0):P3OUT=0x01;if(P3IN==0xf1) {key=16;break;}P3OUT=0x02;if(P3IN==0xf2) {key=12;break;}P3OUT=0x04;if(P3IN==0xf4) {key=8;break;}P3OUT=0x08;if(P3IN==0xf8) {key=4;break;}case (0xd0):P3OUT=0x01;if(P3IN==0xf1) {key=15;break;}P3OUT=0x02;if(P3IN==0xf2) {key=11;break;}P3OUT=0x04;if(P3IN==0xf4) {key=7;break;}P3OUT=0x08;if(P3IN==0xf8) {key=3;break;}case (0xb0):P3OUT=0x01;if(P3IN==0xf1) {key=14;break;}P3OUT=0x02;if(P3IN==0xf2) {key=10;break;}P3OUT=0x04;if(P3IN==0xf4) {key=6;break;}P3OUT=0x08;if(P3IN==0xf8) {key=2;break;}case (0x70):P3OUT=0x01;if(P3IN==0xf1) {key=13;break;}P3OUT=0x02;if(P3IN==0xf2) {key=9;break;}P3OUT=0x04;if(P3IN==0xf4) {key=5;break;}P3OUT=0x08;if(P3IN==0xf8) {key=1;break;}}P3OUT=0xf0;KEYSLOVE(key);} //键盘扫描函数,得到相应的键值key }void KEYSLOVE( unsigned int key){delay1(200);if(P3IN!=0xf0){while(P3IN!=0xf0) TUBESCAN(); //键盘去抖,保证当手松开时读取键值if(s4==0)s4=s3;s3=s2;s2=s1;s1=key;}else{if(key==16){s1=0;s2=0;s3=0;s4=0;key=0;}}}} //将得到的键值进行处理:移位/重置void TUBESCAN(){P6OUT=0x02;P1OUT=table[s4];P6OUT=0x04;P1OUT=0x01;delay1(400);P6OUT=0x02;P1OUT=table[s3];P6OUT=0x04;P1OUT=0x02;delay1(400);P6OUT=0x02;P1OUT=table[s2];P6OUT=0x04;P1OUT=0x04;delay1(400);P6OUT=0x02;P1OUT=table[s1];P6OUT=0x04;P1OUT=0x08;delay1(400);} //数码管扫描,使数码管保持四.行列式键盘实验总结①做行列是键盘重点是键盘扫描确定键值,键盘扫描也有多种方式,要多思考确定最优方式,采用本实验中的键盘扫描方式当没有键子按下时不必执行键盘扫描的其他程序,将更多的时间给了数码管扫描,挺优的,在着手写程序之前一定要筹划如何去写,要寻求简单易行的方法,写程序规划挺重要的。
单片机矩阵键盘扫描的两种方式
单片机矩阵键盘扫描的两种方式单片机矩阵键盘扫描的两种方式矩阵键盘扫描方式:第一种:逐行扫描法,就是一行一行的扫描。
实现代码如下(键盘连接P2口):#define NO_KEY 0XFF#define KEY_LO() P2 &= 0XF0#define KEY_HI() P2 |= 0X0F#define KEY_L(i) P2 &= ~(1<<i)#define KEY_RD() ((P2>>4) & 0x0f)UINT8 OnceKey(void){UINT8 line = 0;UINT8 key = NO_KEY;//key valueKEY_LO();if (KEY_RD() == 0X0F){KEY_HI();return NO_KEY;}for (line=0; line<4; line ++){KEY_HI();KEY_L(line);key = KEY_RD();switch (key){case ROW_FIRST:key = 4*line + 0;break;case ROW_SECOND:key = 4*line + 1;break;case ROW_THIRD:key = 4*line + 2;break;case ROW_FOURTH:key = 4*line +3;break;default :key = 0x0f;break;}if (key < 0x10){return key;}}return NO_KEY;}第二种,线性反转法。
就是行和列分别读出。
实现代码如下:#define CVT(i) ((i)==(~1)&0x0f)? 0: ((i)==(~2)&0x0f)? 1: ((i)==(~4)&0x0f)? 2: ((i)==(~8)&0x0f)? 3: 4;#define KEY0_3HI() P2 |= 0X0F#define KEY0_3LO() P2 &= 0XF0#define KEY4_7HI() P2 |= 0XF0#define KEY4_7LO() P2 &= 0X0F#define KEY0_3RD() (P2 & 0X0F)#define KEY4_7RF() ((P2>>4) & 0X0F)UINT8 OnceKey(void){UINT8 line = NO_KEY;UINT8 row = NO_KEY;UINT8 key;KEY0_3HI();KEY4_7LO();line = KEY0_3RD();//读入行的值if (0x0f == line){key = NO_KEY;}else{KEY0_3LO();KEY4_7HI();row = KEY4_7RD();//读入列的值if (0x0f == row){key = NO_KEY;}else{key = CVT(line)*4 + CVT(row);}}KEY0_3HI();KEY4_7HI();return key; }。
矩阵键盘扫描及LED数码显示综合实验
实验三:矩阵键盘扫描及LED数码显示综合实验
一、实验要求
利用4×4键盘和一个LED数码管构成简单的输入显示系统,实现键盘输入和LED数码显示相应键值的功能。
二、实验目的
1.掌握数码管显示原理,及无译码显示电路的显示程序的编写;
1.理解矩阵键盘扫描的原理;
2.掌握矩阵键盘与51单片机接口的编程方法。
三、实验电路图
四、主要知识点
键盘扫描原理、无译码电路的显示原理。
五、实验流程图
六、实验效果:点击相应按键显示相应的键值
七、实验步骤
1.在keil环境下编写程序,汇编后生成*.Hex文件。
2.硬件验证
1)用ISP下载*.HEX程序到CPU
2)按连接表连接电路
3)检查验证结果。
八、连线表
十、源程序:自己编写源程序。
键盘扫描
case 0xef: managekey4();break;
case 0xdf: managekey5();break;
case 0xbf: managekey6();break;
* P1.0-P1.3为列线,P1.4-P1.7为行线 *
* 喇叭接P3.7口 矩阵键盘P1口, 数码管数据P0口,数码管控制P2口 *
* *
}
//--------------------------------------------------
main()
{
P0=0xFF; //置P0口
P2=0xFF; //置P2口
dis_buf=0xBF;
while(1)
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
else
{ for(a=0;a<4;a++)
P1=0xF0;
if(P1!=0xF0)
{
keyscan();
beep();
// while(P1!=0xF0); //等待键释放
}
}
//--------------------------------------------------
void beep()
}
//--------------------------------------------------
矩阵键盘原理
db 08eh ;F
end
D3:
MOV A,P1 ; 读入 P1
XRL A,R4
JZ D3
MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
Table:
db0c0h,0f9h,0a4h,0b0h,099h ;0-4
db 092h,082h,0f8h,080h,090h ;5-9
RLC A ; 将按键值左移一位元
JNC KEYIN ; 若 C=0, 有按, 执行 KEYIN
INC R1 ; 将指标值加 1, 继续扫描下一行
DJNZ R5,L1 ; 扫描四行
MOV A,R3 ; 载入扫描值
SETB C ; C=1
RRC A ; 扫描下一列(P13~P10)
SCAN1:
MOV A,R3 ; 开始扫描
MOV P1,A ; 将扫描值输出到 P1
MOV A,P1 ; 读入 P1 判断是否有按下
MOV R4,A ; 存到 R4, 判断是否放开
SETB C ; C=1
MOV R5,#04H ; 扫描 P14~P17
L1:
MOV R3,A ; 存回扫描值
JC SCAN1 ; C=1, 尚未完成扫描
RET ; 结束键盘扫描, 回到 Main Program
YIN:
MOV R7,#10 ; 消除弹跳
D2:
MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
由於这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,為了避免让8051误判為多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。
矩阵键盘过程及扫描程序
键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。
即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。
矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。
查找哪个按键被按下的方法为:一个一个地查找。
先第一行输出0,检查列线是否非全高;否则第二行输出0,检查列线是否非全高;否则第三行输出0,检查列线是否非全高;如果某行输出0时,查到列线非全高,则该行有按键按下;根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。
下面是具体程序:void Check_Key(void){unsigned char row,col,tmp1,tmp2;tmp1 = 0x10;//tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0for(row=0;row<4;row++) // 行检测{P1 = 0x0f; // 先将p1.4~P1.7置高P1 =~tmp1; // 使P1.4~p1.7中有一个为0tmp1*=2; // tmp1左移一位if ((P1 & 0x0f) < 0x0f)// 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测{tmp2 = 0x01; // tmp2用于检测出哪一列为0for(col =0;col<4;col++) // 列检测{if((P1 & tmp2)==0x00)// 该列如果为低电平则可以判定为该列{key_val =key_Map[ row*4 +col ];// 获取键值,识别按键;key_Map为按键的定义表return; // 退出循环}tmp2*=2; // tmp2左移一位}}}} //结束。
矩阵键盘的工作原理及应用
矩阵键盘的工作原理及应用1. 简介矩阵键盘是一种常见的输入设备,广泛应用于电子产品、计算机等领域。
它的工作原理是利用矩阵排列的按键,通过行列的交叉点来进行按键扫描和识别。
本文将介绍矩阵键盘的工作原理,并探讨其在不同领域的应用。
2. 工作原理矩阵键盘由多行多列的按键组成,每个按键都与一个行线和一个列线相连。
当按下某个按键时,行线和列线之间会形成一个闭合的电路。
通过扫描行线和列线的电平状态,就可以确定用户按下的具体按键。
3. 矩阵键盘的扫描方法矩阵键盘的扫描过程分为两个步骤:行扫描和列扫描。
3.1 行扫描行扫描是通过将每一行的行线设置为低电平,其他行线设置为高电平,然后检测列线的状态来判断是否有按键按下。
如果某一行的行线低电平与某一列的列线低电平相交,就说明该按键按下。
3.2 列扫描列扫描是通过将每一列的列线设置为低电平,其他列线设置为高电平,然后检测行线的状态来判断是否有按键按下。
如果某一列的列线低电平与某一行的行线低电平相交,就说明该按键按下。
4. 应用场景4.1 电子产品矩阵键盘广泛应用于各种电子产品,如手机、平板电脑、数码相机等。
它们通常用作输入设备,方便用户进行文字输入、功能选择等操作。
矩阵键盘的紧凑设计和按键间距的合理安排使得用户可以快速而准确地完成操作。
4.2 计算机在计算机上,矩阵键盘也被广泛应用于输入设备,比如台式机的键盘和笔记本电脑的内置键盘。
通过连接到计算机主机或者通过无线传输,矩阵键盘可以实现与计算机的交互,使用户可以方便地输入文字、操作软件等。
4.3 安防系统矩阵键盘在安防系统中也有重要的应用。
比如,一些门禁系统和报警系统需要用户输入密码或者进行特定操作来进行识别和控制。
矩阵键盘可以提供安全、方便的用户输入接口,确保系统的可信度和可靠性。
4.4 工业控制在工业控制领域,矩阵键盘通常被用作控制面板的一部分。
例如,机械设备控制面板上的按键,用来进行参数设置、启动停止等操作。
矩阵键盘的稳定性和可靠性非常重要,可以确保设备的正常运行和操作的准确性。
矩阵键盘动态扫描
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
{
dula=1;
P0=table[aa-1]; //显示扫描到的数,想清楚为什么减一
dula=0;
}
uchar keyscan() //扫描子函数
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //当temp==0xf0,则按键没有被按下
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0}; //定义码表
uchar num,temp,num1; //定义8位的字符变量,num用来存放检测到的值,temp用来存放P3的值,num1多余!!
void delay(uint z) //延迟函数
}
while(temp!=0xf0)
矩阵键盘——精选推荐
矩阵键盘1.⾏扫描法⼯作原理(查询法)判别键盘中有⽆键按下。
向⾏线输出全0,读⼊列线状态。
如果有键按下,总有⼀列线被拉⾄低电平,从⽽使列输⼊不全为1。
查找按下键所在位置。
依次给⾏线送低电平,查列线状态。
全为1,则所按下的键不在此⾏;否则所按下的键必在此⾏且是在与零电平列线相交的交点上的那个键。
对按键位置进⾏编码。
找到所按下按键的⾏列位置后,对按键进⾏编码,即求得按键键值。
#includechar key(){char row,col, k =-1; //定义⾏、列、返回值P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回for(row=0;row<4;row++) //⾏扫描{ P1=~(1<k=P1&0xf0;if(k!=0xf0) //列线不全为1,{ while(k&(1<<(col+4))) //所按键在该列col++; //查找为0列号k=row*4+col; //计算键值P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放break;} }return k; //返回键值}3.⾏列反转法⼯作原理判别键盘中有⽆键按下。
(⽅法同⾏扫描法)输⼊变输出,再读。
将上⼀步读取到的列线输⼊值从列线输出,读取⾏线值。
定位求键值。
根据上⼀步输出的列线值和读取到的⾏线值就可以确定所按下键所在的位置,从⽽查表确定键值。
#includechar key(){char code keycode[]= {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}char row,col,k=-1,i;P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回-1 delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回-1 P1=0xf0;col=P1&0xf0; //⾏输出全0,读取列值P1=col|0x0f;row=P1&0x0f; //列值输出,读取⾏值//查找⾏列组合值在键盘表中位置for(i=0;i<16;i++)if((row|col)==keycode[i]) //找到,i即为键值,{ //否则,返回-1key=i; //对重复键,该⽅法break; //处理为⽆键按下}P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放return k; //返回键值}。
史上最详细矩阵键盘原理
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay(1000);
a++;
//a 的作用是用于去抖动,重复检测 50 次//
}
}
}
}
void main()
{
LSA=0; //给一个数码管提供位选//
LSB=0; //给一个数码管提供位选//
LSC=0; //给一个数码管提供位选//
while(1)
//无限循环//
{
KeyDown();
//调用按键判断函数//
GPIO_DIG=smgduan[KeyValue]; //将按键数值赋给 P0 口,控制锁存器//
当接收到的数据低四位不全为高电平时说明有按键按下然后通过接收的数据值判断是哪一列有按键按下然后再反过来高四位输出高电平低四位输出低电平然后根据接收到的高四位的值判断是那一行有按键按下这样就能够确定是哪一个按键按下了
史上最详细单片机矩阵键盘原理 广东阳西福达名苑梁智钧 20180131 一、矩阵按键扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为 1 的 时候,说明有按键按下,然后通过接收到的数据是哪一位为 0 来判断是哪一个按键被按下。 方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时, 说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输 出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。 二、原理图:
实验8-矩阵键盘扫描实验
//查询按键键值
key = Key_Scan() ;
if( key != 0xff )
printf( "Interrupt occur... K%d is pressed!\n", key ) ;
//重新初始化IO口
rGPGCON = rGPGCON & (~((3<<12)|(3<<4))) | ((1<<12)|(1<<4)) ;//GPG6,2 set output
6.EINT19、EINT11、EINT2、EINT0中断开启
}
6.2键盘中断响应
void __irq KeyISR(void)
{
1.GPG13、GPG11、GPF2、GPF0设为input端口
2.清楚中断EINT19、EINT11、EINT2、EINT0
3.键盘扫描Key_Scan(),并在串口输出
else if( (rGPGDAT&(1<< 3)) == 0 )return 14 ;
else if( (rGPGDAT&(1<<11)) == 0 )return 13 ;
//扫描键盘第2列K11、K8、K5、K2
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (0<<6) | (1<<2) ;//GPG6 output 0;GPG2 output 1
rEXTINT0 &= ~(7|(7<<8));
rEXTINT0 |= (2|(2<<8));//set eint0,2 falling edge int
DSP-矩阵键盘扫描实验
班级学号姓名同组人实验日期室温大气压成绩实验五矩阵键盘扫描实验一、实验目的1、掌握键盘信号的输入,DSP I/O的使用;2、掌握键盘信号之间的时序的正确识别和引入。
二、实验设备1、一台装有CCS2000软件的计算机;2、插上2812主控板的DSP实验箱;3、DSP硬件仿真器。
三、实验原理实验箱上提供一个 4 * 4的行列式键盘。
TMS320F2812的8个I / O口与之相连,这里按键的识别方法是扫描法。
当有键被按下时,与此键相连的行线电平将由此键相连的列线电平决定,而行线的电平在无法按键按下时处于高电平状态。
如果让所有的列线也处于高电平,那么键按下与否不会引起行线电平的状态变化,始终为高电平。
所以,在让所有的列线处于高电平是无法识别出按键的。
现在反过来,让所有的列线处于低电平,很明显,按键所在的行电平将被拉成低电平。
根据此行电平的变化,便能判断此行一定有按键被按下,但还不能确定是哪个键被按下。
假如是5键按下,为了进一步判定是哪一列的按键被按下,可在某一时刻只让一条列线处于低电平,而其余列线处于高电平。
那么按下键的那列电平就会拉成低电平,判断出哪列为低电平就可以判断出按键号码。
模块说明:此模块共有两种按键,KEY1—KEY4是轻触按键,在按键未按下时为高电平输入FPGA,当按键按下后对FPGA输入低电平,松开按键后恢复高电平输入,KEY5—KEY8是带自锁的双刀双掷开关,在按键未按下时是低电平,按键按下时为高电平并且保持高电平不变,只有再次按下此按键时才恢复低电平输入。
每当按下一个按键时就对FPGA就会对此按键进行编码,KEY1—KEY8分别对应的是01H、02H、03H、04H、05H、06H、07H、08H。
在编码的同时对DSP产生中断INT1,这个时候DSP就会读取按键的值,具体使用方法可以参考光盘例程key,prj。
实验流程图:1、把2812 模块小板插到大板上;打开液晶模块的电源开关;2、按下键盘按键,液晶会显示所按键的号码。
矩阵键盘扫描原理
矩阵键盘扫描原理矩阵键盘是由多个按键组成的矩阵状排列的结构。
一般来说,矩阵键盘包含若干行和若干列的按键。
每个按键都有一个唯一的行列位置,行和列之间的交叉点称为键盘矩阵。
键盘矩阵中的每个按键都有一个数字或字符与之对应,这个对应关系通常是由键盘的硬件设计确定的。
在矩阵键盘中,按下按键会导致连接到该按键所在行和列的电信号发生变化。
这些变化可以通过电流或电压的改变来表示。
矩阵键盘扫描的原理就是通过检测这些电信号的变化来确定用户按下了哪个按键。
在按键检测阶段,通过扫描矩阵键盘的每一行和每一列,将每个按键的行和列连接到输入/输出端口(通常是微控制器或计算机)。
通过对每一行依次设置为高电平,然后读取每一列的电平状态,可以检测到按下的按键。
例如,假设我们要检测第一行的按键状态,我们将第一行设置为高电平,然后读取每一列的电平状态。
如果一些按键按下了,那么在对应列的输入/输出端口上会读取到低电平信号。
通过依次扫描每一行和每一列,可以确定用户按下了哪个按键。
在按键解码阶段,我们将检测到的按键行列位置与事先设定的按键值进行对比,以确定用户按下的是哪个键。
例如,如果我们检测到第一行第二列的按键被按下了,与之对应的按键值是数字“2”。
在解码阶段,我们将按键行列位置与按键值进行对比,从而确定用户按下了数字“2”。
需要注意的是,由于矩阵键盘的按键数量有限,不同的按键可能会共用同一行或同一列。
这就需要在解码阶段进行额外处理,以区分这些共用行或列上的按键。
总结起来,矩阵键盘扫描的原理是通过扫描每一行和每一列的电信号变化来检测用户按键,并通过解码将按键的行列位置与按键值进行对比,从而确定用户按下的是哪个键。
这种原理简单而高效,被广泛应用于各种输入设备中。
矩阵键盘的工作原理和扫描确认方式
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;
它们不仅与键盘的硬件连接有关系,同时还要注意他们在程序中是如何使用的, 其值的保存等等。
实验一 矩阵键盘检测
实验一矩阵键盘检测一、实验目的:1、学习非编码键盘的工作原理和键盘的扫描方式。
2、学习键盘的去抖方法和键盘应用程序的设计.二、实验设备:51/AVR实验板、USB连接线、电脑三、实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人机通信。
1、按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键).按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。
全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。
非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。
由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。
2、按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容.此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。
当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。
因此,键信息输入是与软件结构密切相关的过程。
对于一组键或一个键盘,通过接口电路与单片机相连. 单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析一下题第三套综合题的键盘扫描问题,图如下(借用群里别人传的图)
//*KEYOUTPUT是键盘扫描时的输出地址,KEYINPUT是键盘读入时的地址
#define KEYOUTPUT (*(volatile INT8U *)0x56000044)
#define KEYINPUT (*(volatile INT8U *)0x56000044)
INT16U ScanKey()
{
INT16U key=0xFFFF; //注意key与i定义都是16位的数值
INT16U i;
INT8U temp=0xFF,output; //这里temp与output定义为8位的数值rGPECON= ((rGPECON &0xFFFFFF00) | 0x00000055); //初始化GPE0~GPE3为输出
rGPECON= rGPECON & 0xFFFF00FF;//初始化GPE4~GPE7为输入这里寄存器的初始化我就不多啰嗦了
for (i=1;(( i<= 8)&&(i>0));i<<=1 ) 下面是按行扫描,共四行,所以扫描4次(i从等于1开始,左移4次结果为8)。
注意第1次i的值为0x0001,化为二进制数是0000000000000001。
第2次,i左移1位(在二进制里左移),故值为0000000000000010,化为16进制数0x0002,第3次再左移1位,0x0004,第4次值为0x0008
{
output |= 0xFF; 这句是对output初始化
output &= (~i); 按行给低电平。
比如现在扫描到第二行,即 i为0x0002,取反后为0xFFFD,接下来output(0xFF)与~i相与,0xFF&0xFFFD值为0xFFFD(注意前面说到output定义为8位数值,它与16位数值相与后,只能保存8位数值),故最后output值为0xFD。
(将output的值由16进制化为2进制11111101。
根据上图如果对应到IO口就是GPE7-GPE0。
可以看到是给GPE1给了个低电平。
GPE1对应第2行)
KEYOUTPUT=output; 将output的值传给KEYOUTPUT
temp = KEYINPUT; 这句是读入输入的值
if ((temp&0xF0)!= 0xF0) temp读入的是GPE7-GPE0的值,可以看到如果有输入,那么GPE4-GPE7必然不会全为1。
做temp&0xF0是为了取出GPE7-GPE4的数据,后一个0xF0是用来判断列信号是否有0。
如果有则进入if语句。
{
key = (~i); 假设按下的键是6,它在第2行,则~i=0xFFFD,赋值后
key=0x0xFFFD。
key <<= 8; 将key值左移8位,即在16进制下是在末尾加2个零,为0x0xFFFD00,但key是16位数,故需要舍弃前两个FF,最终结果是key=0xFD00 key |= ((temp&0xF0)|0x0F); 刚说了按键6在第二行第3列,第3列对应GPE6为0,所以temp的值为1011****,(前面说了temp读入的是GPE7-GPE0的值,但此时GPE3-GPE0不需要过多考虑)即为0xB*。
与0xF0相与,再与0x0F 相或,结果为0xBF。
最后是key值与0xBF相或,的到最终结果0xFDBF
return (key); //函数返回按键对应的值
}
}
前面说了一大堆,可能有点啰嗦,这是为了给打算研究矩阵键盘的人看的,如果只是为了考试,可以看看下面简单的算法。
(仅限于此图,其他连接方法需要稍作修改)
比如按下的是‘确认’键,看一下行和列。
1行4列。
直接从if语句看
key = (~i); 第1行,给1取反是0xFFFE(怎么来的这在前面有,这个是基础)key <<= 8; 左移八位结果是0xFE00
key |= ((temp&0xF0)|0x0F) 将对应的列进行运算。
第4列对应GPE7=0,temp 值为0x7*,与0xF0相与,再和0x0F相或,值为0x7F。
0x7F再和key(0xFE00)相或,结果是0xFE7F。
晚上编辑的,部分解释语句难免有错误,如果大家有什么简洁易懂的解释方法可以在此基础上编辑,然后传到群里大家共享。
谢谢合作。