按键扫描方法
按键扫描
1.1.1 按键扫描运用定时中断实现按键扫描,就是将一个按键过程抽象为4个状态: S0状态:按键保持为高,即按键没有被按下。
S1状态:按键确实被按下,与S0状态结合,完成按键按下的去抖。
S2状态:按键保持低电平,即按键被按下状态的累积,在此可以对某一变量计数。
S3状态:按键被释放,与S2结合,完成释放去抖,另外判别是不是长按。
对于按键的一般的单击应用,我们通过定时扫描按键针对不同的响应要求可以将一次按键理解为S0→S1→S2(按下响应)或者S1→S2→S3(弹起响应)即可。
根据这个思想,每个按键的判断至少需要3个状态,而且其中两个状态为按下状态。
以下是两个按键单击判断的键扫描的流程和具体程序,采用按下响应,该程序每10ms 运行1次。
键扫描保存之前和再前键值读取当前键值有键按下?当前键值=之前键值?再前键值=0?YY键处理返回YN N NKEY_VALEQU R2 ;当前键值,用于存放S2状态 KEY_BACKEQU 60H ;之前键值,用于存放S1状态 KEY_PREEQU R7 ;在前键值,用于存放S0状态 ;KEY_CNT EQU R6 ;按下时间计数器,用于连击判断KEY_PORT EQU P2 ;定义P2键盘接口;*******************键扫描程序*******************KEY_SCAN: MOV KEY_PRE,KEY_BACKMOV KEY_BACK,KEY_VALLCALL READ_KEYMOV A,KEY_VALJZ KSRCJNE A,KEY_BACK,KS2CJNE KEY_PRE,#0,KS;SJMP KS1KS: ;INC KEY_CNT;CJNE KEY_CNT,#5,KSRKS1: LCALL KEY_HANDLEKS2: ;MOV KEY_CNT,#0KSR: RET;************读键码程序*********************READ_KEY: MOV A,KEY_PORTORL A,#0FCHCPL AJZ RK1 ;判断是否有按键JB K0,RK2 ;判断是否K0键按下MOV KEY_VAL,#1SJMP RKRRK1: MOV KEY_VAL,#0SJMP RKRRK2: JB K1,RKR ;判断是否K1键按MOV KEY_VAL,#2RKR: RET小提示:上述程序如果将注释掉的程序用上,就实现了连击键功能,其中KEY_CNT 用来存放按键定时计数,本例人为计数5次即按下50ms就触发一次键处理。
按键扫描程序(4)
else if(key == D_key)
........//点亮B_LED,关闭A_LED和C_LED
else if(key == S_key)
key_time_1 = 0; // 第1次单击,不返回,到下个状态判断后面是否出现双击
key_m = key_state_1;
}
else
特别操作情况定义:
1。短按操作和长按操作间隔<0.5s,以及,长按操作和短按操作间隔<0.5s,均不产生双击事件
2。连续n次(n为奇数)短按操作,且间隔均<0.5s,产生(n-1)/2次双击事件+1次单击事件
3。连续n次(n为偶数)短按操作,且间隔均<0.5s,产生n/2次双击事件
题目:多功能按键设计。利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按。
============================================================================
用户基本操作定义:
1。短按操作:按键按下,按下时间<1s,属于一次短按操作
if (!key_press)
{
key_time = 0; //
key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。
按键扫描处理个人总结
按键扫描处理总结一、矩阵按键扫描方法1、现在的矩阵扫描主要有两种方法:(1)行列扫描法(2)反转法。
2、行列扫描法(1)行列扫描法的基本思想:行列扫描法是将其中的一行输出为低电平,其他行输出为高电平,列设为输入,然后判断哪一列为低电平,从而确认出是哪一行哪一列有键按下。
(2)行列扫描法举例如图1所示的2*2矩阵键盘,首先:将PB1,PB2作为行,并设置为输出;PA1,PA2作为列,并设置为输入。
其次:PB1设置为低电平输出,PB2设置为高电平输出,查看此时PA1和PA2的输入状态,假设此时S1按下,则此时PB1输出低电平通过S1传到了PA1上,使得PA1输入为低电平,而PA2仍然为高电平。
说明第一行有键按下,并且是第一列有键按下然后:再将PB1设置为高电平输出,PB2设置为低电平输出,此时PA1,PA2输入都为高电平。
说明第二行上没有按键按下。
最后:至此可以判断此时的PA1与PB1上的按键被按下,即第一行第一列的S1被按下。
整个按键扫描过程结束。
3、反转法(1)反转法的基本思想:将行设为输出为低电平,列设为输入,判断此时列的输入状态;然后在将列设为输出位低电平,行设为输入,判断此时行的输入状态。
如果有键按下,则其中的列输入状态必然有其中一列为低,行的输入状态也必然有其中一行为低,记录此时的行列号即可判断出是哪一行哪一列有键按下。
(2)反转法举例:如图1所示的2*2矩阵键盘,首先:将PB1,PB2作为行,并设置为输出;PA1,PA2作为列,并设置为输入。
其次:将PB1,PB2输出为低,查看PA1,PA2输入状态,假设还是S1被按下,则此时PA1输入为低电平,PA2输入为高电平。
说明第一列有键按下。
然后:将PB1,PB2作为行,并设置为输入;PA1,PA2作为列,并设置为输出。
最后:将PA1,PA2输出为低,查看PB1,PB2输入状态,则此时PB1输入为低电平,PB2输入为高电平。
说明第一行有键按下。
键盘扫描三种方法
第一种------传统法uchar scanf(){P3=0xfe;temp=P3&0xf0;if(temp!=0xf0) //判断是否有键按下{delay(5);//给一个延时temp=P3&0xf0;if(temp!=0xf0) //再次判断是否有键按下{temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}}while(temp!=0xf0)//键起,推出程序{temp=P3&0xf0;}}P3=0xfd;temp=P3&0xf0;if(temp!=0xf0){delay(5);temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}}while(temp!=0xf0){temp=P3&0xf0;}}P3=0xfb;temp=P3&0xf0;if(temp!=0xf0){delay(5);temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}}while(temp!=0xf0){temp=P3&0xf0;}}P3=0xf7;temp=P3&0xf0;if(temp!=0xf0){delay(5);temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}}while(temp!=0xf0){temp=P3&0xf0;}}Return(num);}第二种——简单法uchar keyscan(void){uchar scancode,tmpcode;P3 = 0xf0; // 发全0行扫描码if ((P3&0xf0)!=0xf0) // 若有键按下{delay(5); // 延时去抖动if ((P3&0xf0)!=0xf0)// 延时后再判断一次,去除抖动影响{scancode = 0xfe;//相当于从第一行开始扫描1111 1110while((scancode&0x10)!=0) // 控制行我的理解while((P3&0xf0)!=0xf0)(原来的程序转了一个大弯)(原程序,首先进入,使其扫描全行,扫描一次退出;我的:按键复原后,才退出程序;我的程序要扫描多次,但前提是一定扫描得到{P3 = scancode; // 输出行扫描码其实P3变为了1101 1110(假设有键按下)其中因为有键按下,写入的1马上又变为0(只有当行和列都对应时,才会继续下面的运算)即:如果开始按的是1101 1011,那么P3显示的就是1111 1110列中就不会出现0if ((P3&0xf0)!=0xf0) // 本行有键按下(确定行){tmpcode = (P3&0xf0)|0x0f; //确定列return((~scancode)+(~tmpcode)); /* 返回特征字节码,为1的位即对应于行和列*/}elsescancode = (scancode<<1)|0x01; // 行扫描码左移一位,换另一行扫面}}}return(0); // 无键按下,返回值为0}第三种———先行扫描,再列扫描uchar keyscan(void){uchar tag1,tag2;tag1=0xff;tag2=0xff;P3 = 0xf0; // 发全0行扫描码if ((P3&0xf0)!=0xf0) // 若有键按下{delay(5); // 延时去抖动if ((P3&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响{tag1=P3;P3=0x0f;tag2=P3&0x0f;}}return(~(tag1|tag2)); }。
按键扫描原理
按键扫描原理
按键扫描原理是指通过扫描矩阵来检测键盘上的按键状态。
在常见的键盘中,按键都被布置成一个矩阵的形式,每个按键都被安排在多行多列的位置上。
按键扫描原理的实现主要依靠两个主要组成部分,即行扫描和列扫描。
行扫描是指逐行地扫描键盘的每一行,通过向每一行施加电压或地电压来判断该行上是否有按键按下。
当扫描到某一行时,如果有按键按下,那么该行和对应按键所在的列之间就会有导通的电路。
这样,扫描程序就能够检测到按键的状态。
列扫描是指在行扫描的基础上,进一步扫描每一列,以确定具体按下了哪一个按键。
通过给某一列施加电压,并扫描每一行的电平状态,就可以判断被按下的按键所在的具体位置。
基于行列扫描的原理,键盘控制芯片会不断地轮询键盘的每一行和每一列,以实时地检测键盘的按键状态。
一旦检测到按键的状态发生变化,键盘控制芯片就会将相应的按键码发送给计算机,以实现对按键的输入响应。
总结起来,按键扫描原理通过对按键布置成的矩阵进行行列扫描,以检测键盘上的按键状态。
行扫描用于判断哪一行上有按键按下,列扫描用于确定具体按下了哪一个按键。
这种扫描方式能够高效地检测键盘的按键状态,并实现按键输入的响应。
51单片机4×4矩阵按键扫描方法
key=0xf0;//低四位为0
if(key==0xf0)//若无变化,证明按键松开
return 0;//返回0
else//否则,按键未松开
return 1;//返回1
}
//*********主函数*********//
int main()
{
key=0xff;//按键初始化
led=0xff;//关闭LED灯
//送至led显示
/*
eg:如果是第三行第二列按键按下
则第3个、第6(2列+4)个LED灯亮
如下图所示(Proteus仿真电路图)
*/
}
}
led_arry[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数组定义,便于显示
//******检测是否有按键按下*****//
uchar Check_Button()
{
key=0x0f;//高四位为0
if(key==0x0f)//若无变化,证明无按键按下
return 0;//返回0
else//否则
return 1;//返回1
}
//********行检测********//
uchar Line[]={0x0e,0x0d,0x0b,0x07}; //那个按键按下,检测出的状态则对应数组中的第几个数
void Check_Line()
{
uchar i;
key=0x0f;//高四位为0
/*****4×4按键扫描******/
/***编程要点
1.首先检测是否有按键按下
2.若有按键按下,即进行行检测,列检测
3.行检测:高4位设为0,低4位为1,进行检测0x0f
简单的按键扫描&读取程序
/*GPIOA的置位复位定义*/
#define PA0_BSRR (*(uint32_t *)0x42010a00)
#define PA1_BSRR (*(uint32_t *)0x42010a04)
//
char get_key_riseedge(char keynum)
{
char val;
u32 mid = 0;
val = (key_riseedge >> keynum) & 0x01;//将该位上升沿取出送到val
mid = ~( 1 << keynum );
key_riseedge &= mid;//该上升沿清零
key_falledge &= ~(redge);//同上
key_riseedge |= redge;//将上升沿取到寄存器中待读
key_falledge |= fedge;//同上
}
//别的函数查询某个键的键值=========================================
#define PA3_OUT (*(uint32_t *)0x4221018c)
#define PA4_OUT (*(uint32_t *)0x42210190)
#define PA5_OUT (*(uint32_t *)0x42210194)
#define PA6_OUT (*(uint32_t *)0x42210198)
//
char get_key_val(char keynum)
极其简单好用的按键扫描程序C语言
极其简单好用的按键扫描程序(C语言)不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
识别按键的两种常用方法
识别按键的两种常用方法
在计算机编程中,识别按键有两种常用的方法:
1. 硬件扫描法:
- 工作原理:通过直接读取键盘的硬件信号来检测按键的按下和释放。
- 优点:响应速度快,适用于对实时性要求较高的应用。
- 缺点:需要了解底层硬件,编程较为复杂,且不同键盘可能需要不同的驱动程序。
2. 软件扫描法:
- 工作原理:通过不断查询键盘状态来检测按键的按下和释放。
- 优点:编程相对简单,不需要了解具体的硬件细节,适用于大多数常见的应用。
- 缺点:可能会消耗一定的CPU 资源,因为需要不断地查询键盘状态。
这两种方法各有优缺点,需要根据具体的应用场景和需求来选择。
在现代编程中,通常使用操作系统提供的键盘事件处理机制,它会自动将按键事件通知给应用程序,从而简化了按键识别的过程。
键盘扫描原理
键盘扫描原理
键盘扫描原理是指通过控制信号将按键状态传输到计算机的一种技术。
它主要分为两个步骤:键盘扫描和数据传输。
在键盘扫描过程中,计算机会发送扫描码(scan code)到键盘。
扫描码是一个8位的二进制数,用于唯一标识每个按键。
键盘内部有一个按键矩阵,当按键按下时,会触发相应的行和列连线,形成一个电路通路。
键盘通过轮询的方式扫描每个按键的状态,并生成扫描码。
一旦键盘生成了扫描码,它就会通过电缆传输给计算机。
数据传输的方式可以是串行还是并行,取决于键盘和计算机之间的连接方式。
对于串行传输,扫描码会被逐位地发送到计算机。
对于并行传输,扫描码会同时发送到计算机的多个引脚上。
计算机接收到扫描码后,会根据预先定义的映射表将其转换为相应的字符或功能。
映射表可以根据键盘类型和语言环境的不同而有所不同。
计算机将转换后的按键信息存储在一个缓冲区中,供操作系统或应用程序读取和处理。
总结来说,键盘扫描原理通过扫描码和数据传输将按键状态传输给计算机。
这种技术广泛应用于各种键盘设备,包括传统的有线键盘和现代的无线键盘。
矩阵式键盘的按键识别方法
矩阵式键盘的按键识别方法矩阵式键盘是一种常见的电子输入设备,它由多个按键组成,这些按键以矩阵的形式排列在键盘上。
在使用矩阵式键盘时,我们需要将按下的按键与相应的键值进行关联,以实现按键的识别。
下面将介绍几种常见的矩阵式键盘按键识别方法。
1.矩阵扫描法矩阵扫描法是最常见的一种按键识别方法。
在矩阵式键盘上,按键被组织成不同的行和列。
通过扫描每一行和每一列,我们可以确定按下的按键。
具体操作步骤如下:-所有行设置为输出,所有列设置为输入。
-循环扫描每一行,将当前行设置为高电平,然后读取所有列的状态。
-如果其中一列的状态为低电平,说明当前位置的按键被按下。
-记录下按下按键的位置(行和列),以及对应的键值。
2.矩阵编码法矩阵编码法是一种较为高级的按键识别方法,它通过给每个按键分配一个唯一的编码,以实现按键的识别。
具体操作步骤如下:-所有行和列都需要连接到对应的编码器上。
-当按键被按下时,编码器会生成一个唯一的编码,表示按下的按键。
-通过读取编码器的输出,我们可以确定按下的按键以及对应的键值。
3.容量触摸法除了物理按键,一些矩阵式键盘还具有触摸功能。
这种键盘使用触摸传感器来检测手指触摸的位置,以实现按键的识别。
具体操作步骤如下:-键盘上的每个按键都带有一个触摸传感器。
-当手指触摸一些按键时,触摸传感器会检测到电容的变化。
-根据电容的变化,我们可以确定手指触摸的位置,从而确定按下的按键以及对应的键值。
总结起来,矩阵式键盘的按键识别方法可以通过矩阵扫描法、矩阵编码法和容量触摸法来实现。
无论采用哪种方法,都需要通过适当的硬件和软件设计来实现按键的检测和识别。
这些方法的选择通常取决于键盘的设计要求和成本限制。
矩阵键盘的三种扫描方法
矩阵键盘的三种扫描方法矩阵键盘是一种常见的输入设备,它由多个按键组成,并通过矩阵扫描的方式来检测用户的按键输入。
矩阵键盘的扫描方法可以分为三种:行扫描、列扫描和交错扫描。
下面将详细介绍这三种扫描方法。
1.行扫描行扫描是最简单的一种扫描方法。
它的原理是将矩阵键盘的每一行连接到一个IO口,通过轮询检测每一行的电平变化来获取用户的按键输入。
行扫描的工作流程如下:1)将矩阵键盘的每一行连接到一个IO口,并设置为输入模式。
2)逐个地将每一行的IO口设置为高电平,并检测列的电平状态。
3)如果其中一列的电平为低电平,说明该列有按键按下。
此时,记录下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将这个按键的位置和值传递给上层应用或处理器。
4)将当前行的IO口设置为低电平,然后继续下一行的检测,重复2)~3)步骤,直到所有行都被检测完毕。
行扫描的优点是实现简单,只需要一个IO口来检测按键的状态。
但是它的缺点是扫描速度较慢,因为需要逐个地检测每一行。
2.列扫描列扫描是一种比较常用的扫描方法。
它的原理是将矩阵键盘的每一列连接到一个IO口,通过轮询检测每一列的电平变化来获取用户的按键输入。
列扫描的工作流程如下:1)将矩阵键盘的每一列连接到一个IO口,并设置为输入模式。
2)逐个地将每一列的IO口设置为高电平,并检测行的电平状态。
3)如果其中一行的电平为低电平,说明该行有按键按下。
此时,记录下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将这个按键的位置和值传递给上层应用或处理器。
4)将当前列的IO口设置为低电平,然后继续下一列的检测,重复2)~3)步骤,直到所有列都被检测完毕。
列扫描的优点是速度较快,因为只需要逐个地检测每一列。
但是它的缺点是需要多个IO口来检测按键的状态。
3.交错扫描交错扫描是一种综合了行扫描和列扫描的扫描方法,它可以有效地减少扫描的时间。
交错扫描的原理是将矩阵键盘的行和列交错地连接到多个IO口,通过并行检测行和列的电平变化来获取用户的按键输入。
概述矩阵式按键行列扫描过程
1111
矩阵式按键行列扫描的过程是这样的:
1. 把属于列的IO口设置为输入状态,由于上拉电阻的作用,当按键没有动作时,程序就会读到高电平。
2. 开始按行进行扫描,先把行1的IO设置为输出状态,然后设置输出为低电平,接着依次读取列IO口的状态。
3. 如果有按键被按下,那么列IO口的读入电平就变成低电平,这时就可以根据行和列判断出动作按键的位置。
4. 行1的扫描完成后,把行1的IO置高,然后按照上面步骤依次进行行2和行3的扫描,确认有动作按键的位置即可。
在实际应用中,为避免按键抖动影响,需要在程序中加入去抖动处理。
矩阵按键扫描广泛应用于各种设备的按键输入控制中,如电子琴、钢琴、智能家居等。
键盘扫描原理
笔记本键盘的总类:美式、英式、日本各个键盘的区别:键盘的扫描方式:逐行扫描法与线反转法现在的笔记本键盘一般都是16+8的方式,即16个pin输出,对应列;8个输入pin脚,对应行。
键盘输入与输出的结构如下:在Idel状态下,EC把16条输出线全部拉低,使能键盘扫描中断,这样当任意一个按键按下时,就会触发中断(ICU的INT11h),然后EC就开始逐列扫面,比如OUT(0,1,……,15)输出(1,1,……,1,0),(1,1,……,0,1)……(0,1,……,1,1),当数一个列扫描码,得到的行如输入信号为有一个为0的时候,这是得到的列扫描码与行扫描码就是这个键的扫面码。
比如上图按下S6的时候,列与行扫描码就分别为1101,1011。
然后通过扫描码在Scan table里面找对应的键码,传给OS,确定是哪个键。
在上面的图中,我们看到,在输入信号每个上面都有上拉电阻,这个电阻必须有除非EC的输入pin脚上面的有足够的上拉能力,否则扫描就会出现错误。
下图中,是一个正常的键盘矩阵图。
键盘上面的数字就与下面矩阵里面相同的数字对应。
普通键盘结构及工作原理键盘一般有独立式和行列式(矩阵式)两种。
当然还有其它的结构,比如交互式结构等等,不过其它的结构比较少用,在这里就不介绍了。
在中颖的单片机中,有些单片机的LCD 驱动引脚的SEGMENT 口可以共享按键扫描口,当选择为按键扫描口时,可以使用这些口来扫描按键,所以在外部电路可以连接LCD 和按键矩阵,采用分时扫描进行处理,下面也将介绍这个特殊应用的方法和注意的地方。
1、独立式键盘结构独立式键盘是指各个按键相互独立地连接到各自的单片机的I/O 口,I/O口只需要做输入口就能读到所有的按键。
独立式键盘可以使用上拉电阻也可以使用下拉电阻,基本原理是一样的。
使用上拉电阻的独立式键盘结构如图1-3 所示。
(上面这个图是有问题的,应该是行列式的键盘)图1-3 所示的是利用PB 口和PC 口共8 个I/O 口独自连接8 个按键,使用外部上拉电阻构成的独立式键盘。
矩阵按键扫描处理方法
说明:1,扫描方式PWM 中断延时函数是:def_key_delay31us macroAR= RM[R_KEY_discharge_time]jeq def_key_delay31us_1ar--RM[R_KEY_discharge_time]= ardef_key_delay31us_1:endm检测到R_KEY_discharge_time = 0 ,表示时间到!开始计时是给R_KEY_discharge_time 寄存器赋值,延时时间= R_KEY_discharge_time * 1/8K 秒扫描方式是从PB5 , PB6 , PB7 , PC0 , PC1 , PC2 , PC3 , PC4 , PC5 , PC6 , PC7 依次扫描每跟线分3 个状态比如:扫描PB5 列线1 ,PB5 = 1 , 其他扫描线= 0 ;输入口输出高电平,给输入口充电,2 ,延时1 – 2 个PWM 中断,及R_KEY_discharge_time = 2 ;3 ,把输入口设置成输入状态4 ,延时4 –5 个PWM 中断,及R_KEY_discharge_time = 5 ;5 ,读取输入口状态扫描PB6 列线同PB5 一样FCC 分析:_____| |___________________________________________ PB5电平扫描线___________| |_____________________________________ PB6 电平扫描线_________________| |_______________________________ PB7 电平扫描线_______________________| |_________________________ PB8 电平扫描线. .. .最后返回到PB5 ,扫描线重新扫描从扫描PB5 列分析:PB5 的高电平持续时间,= 6 – 8 个中断时间= 0.75ms – 1ms电磁辐射产生的原理是:高低电平变化的太快,及频率很高!辐射越大!所以当,PB5 的高电平时间越短,高低电平变化时间越快,辐射就越大,为了降低,辐射合理增加 2 行,4行的延时时间,就可以了!为什么要有第 2 行的延时:做这个延时的原因,是让IO 口有足够的充电时间,如果直接写 2 条语句Ar= 0x0000Io[ioc_pa]= arAr= 0xffffIo[porta]= ar ; 把输入口设置高充电Io[ioc_pa]= ar ; 把输入口设置输入状态如果直接这样写,在一条指令的时间内,怕充电没冲满的原因!为什么要有第 4 行的延时:做这么长的时间的原因是: 输入口外部下拉,100K 电阻,把输入口设置成输入状态后IO 口经过100K 电阻放电!时间有点慢的原因!确保放电能放完= 0 ;为什么读取输入口数据要有充电放电的动作:从电路分析,当多个按键按下,下拉100K 的电阻会减小,按下的越多,减的越小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说到键盘扫描,相信大多数人第一反应就是行列矩阵扫描,这样我们可以用相对有限的IO口得到尽可能多的按键。
键盘扫描是单片机技术的一种基本处理方法,学校的单片机课程都会有相应章节进行阐述,只要按照课本上讲述的方法,一般都能设计出比较可靠的键盘扫描电路与程序。
课本上的键盘扫描方法(见下图接法二)不能说是尽善尽美,从易懂性、成本、程序难易程度等方面综合看应该是不错的方法,给人感觉是已经没有太多的改善空间,至少我是这么认为的。
然而前段时间一位台湾朋友画给我的键盘扫描矩阵电路(见下图接法二),让我又一次看到到自己的思维还有许多地方被自己的所谓“经验”束缚着。
单纯的从硬件接法看,两种接法并没有明显区别,接法一甚至要复杂一些,但如果结合到键盘扫描的程序来看,就会发现接法一确实更好。
两种接法我都没有把上拉电阻包含进来,来让我们看一下两种接法到底有什么不同:
接法二:
我们熟悉的传统扫键处理电路,假定键盘行列IO口标号分别为H1/H2/H3和V1/V2/V3,扫键流程通常如下。
2.1. H1设置为输出,H2/H3和V1/V2/V3设置为输入
2.2. H1分别输出1和0,读V1/V2/V3状态,如果Vy状态与H1一致,则认为H1与Vy交叉位置的键按下
2.3. H2设置为输出,H1/H3和V1/V2/V3设置为输入
2.4. H2分别输出1和0,读V1/V2/V3状态,如果Vy状态与H2一致,则认为H2与Vy交叉位置的键按下
2.5. H3设置为输出,H1/H2和V1/V2/V3设置为输入
2.6. H3分别输出1和0,读V1/V2/V3状态,如果Vy状态与H3一致,则认为H3与Vy交叉位置的键按下
接法一:
新扫键处理电路,假定键盘行列IO口标号分别为H1/H2/H3和V1/V2/V3,扫键流程通常如下。
1.1. H1/H2/H3和V1/V2/V3都设置为输入
1.2. 读H1/H2/H3和V1/V2/V3状态,如果Hx和Vy读到的状态均为0,则认为Hx与Vy交叉位置的键按下
从上面流程可以看出接法一的程序代码要简单不少,既能减少扫键的代码量,又能加快扫键处理的时间,站在软件的角度看确实要比接法二要好。
后来我反思了一下为什么我们教材上的传统处理方法没有采用接法一,虽然接法一软件上要简单一些,但硬件布局要复杂,传统的按键只有两条接线,接法一需要三条接线,所以用传统的按键是无法实现的,但现在许多电子产品的按键都用导电橡胶或锅仔片来实现,所以接法一变得可行。
注:这两种电路对于同时按键达到3个的情况都有可能形成错误的按键逻辑。