HT48RA0-5矩阵式与梯型式按键扫描实现方法
简述扫描法识别矩阵式键盘上闭合键的方法
简述扫描法识别矩阵式键盘上闭合键的方法扫描法是一种常见的识别矩阵式键盘上闭合键的方法。
矩阵式键盘是指将键排列成矩阵形式的键盘,其中每个键都有一个唯一的行列坐标。
扫描法通过依次扫描矩阵中的每个键,并检测按下的键是否闭合来实现键盘输入的识别。
以下是利用扫描法识别矩阵式键盘上闭合键的一般步骤: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;}}}。
HT48RA0-5矩阵式与梯型式按键扫描实现方法
范例原理图
矩阵式按键扫描
说明:以上使用 HT48RA0-5 的端口 A 和端口 B 扫描矩阵键盘,PA 扫描行、PB 扫描列。 1
梯型按键扫描
HT48RA0-5 矩阵式与梯型式按键扫描实现方法
说明:以上使用 HT48RA0-5 的 PA0~PA7 I/O 对应扫描键盘前第 1~8 行,PB0~PB3 I/O 对应 扫描第 9~12 行。
矩阵扫描方法是利用 HT48RA0-5 的 16 个 I/O 扫描一个 8×8 的矩阵键盘,利用循环检测的 方法逐行逐列的扫描,一旦有键按下时,处理按键的子程序获得键盘的键值来实现的。而 梯形按键扫描方法是利用 12 个 I/O 扫描一个 T-type 键盘。同样是按照逐行位置、逐行逐列 扫描的原理检测是否有键被按下,唯一与矩阵键盘不同的是梯形键盘分为前八行和后四行 的独立方式扫描来实现。
yyynnnht48ra05矩阵式与梯型式按键扫描实现方法矩阵式与梯型式按键扫描实现方法矩阵式与梯型式按键扫描实现方法矩阵式与梯型式按键扫描实现方法3梯型按键扫描梯型按键扫描梯型按键扫描梯型按键扫描开始参数初始化初始化变量matrow为feh同时输出matrow到pa变量matrow为feh同时输出matrow到pbmatrow值输出到pb扫描pb查询第912行按键执行键值获取函数getkey获取键值keyvaluekeyvaluekeyvalueturematrow值输出到pa置前8行中某一行为low执行键值获取函数getkey获取键值keyvalue扫描pa确认该行是否有键按下扫描pb低4位查询该行是否有键按下查询前8行是否扫描完毕判断第912行的某一行是否有键按下判断第12行是否扫描完毕keyvaluekeyvalueture执行第912行按键的取键函数getkeyfunkeyvaluekeyvalueture主循环计数count是否为20h延时40mskeyvalue是否改变主循环计数count是否为20h延时40mskeyvalue是否改变主循环计数是否为20hkeyvalue是否改变matrow向左移位1位matrow向左移位1位yyyyynnnnnnynynyynnynyht48ra05矩阵式与梯型式按键扫描实现方法矩阵式与梯型式按键扫描实现方法矩阵式与梯型式按键扫描实现方法矩阵式与梯型式按键扫描实现方法4程序范例说明程序范例说明程序范例说明程序范例说明矩阵式按键扫描矩阵式按键扫描矩阵式按键扫描矩阵式按键扫描程序首先在start初始化参数然后进入逐行扫描主循环keyloop以第1行为例先向pa输出feh让第1行为low然后读入pb的值确定是否有键按下如有则执行延时子程序之后再次确认是否该按键被按下若有则执行获取键值子程序getkey子程序getkey将按顺序逐一判断第1行哪个键被按下最后将该按键值指定到变量keyvalue以供客户使用否则程序将跳至下一行继续扫描
51单片机矩阵键盘原理
51单片机矩阵键盘原理介绍在嵌入式系统中,矩阵键盘是一种常见的输入装置。
51单片机是广泛使用的一种微控制器,结合矩阵键盘可以实现各种应用。
本文将详细介绍51单片机矩阵键盘的原理及其工作方式。
什么是矩阵键盘?矩阵键盘是将一组按钮布置成矩阵形式,以减少输入引脚的数量。
每个按钮在矩阵键盘中都会被分配一个坐标,通过扫描行和列,可以确定用户按下的是哪个按钮。
51单片机的输入输出结构51单片机具有强大的输入输出能力,可以连接各种外设。
在使用矩阵键盘时,通常使用IO口进行输入和输出操作。
矩阵键盘的接线方式将矩阵键盘与51单片机连接时,需要将键盘的行和列引脚分别连接到单片机的IO 口。
通过对行进行扫描,再根据列的输入状态判断按钮是否按下。
这种接线方式可以大大减少所需的IO口数量。
矩阵键盘的扫描原理矩阵键盘的扫描原理是通过不断扫描行并读取列的状态来判断按钮是否按下。
具体步骤如下: 1. 将所有行引脚设为输出,输出高电平。
2. 逐个扫描行,将当前行引脚设为低电平。
3. 读取所有列引脚的状态,如果有低电平表示有按钮按下。
4. 如果有按钮按下,则根据行和列的坐标确定按下的按钮。
51单片机矩阵键盘的实现以下是使用51单片机实现矩阵键盘的基本步骤: 1. 将行和列引脚连接到单片机的IO口。
2. 初始化IO口的状态。
3. 在主程序中进行循环扫描,根据扫描结果执行相应的操作。
优化矩阵键盘的扫描速度为了提高矩阵键盘的扫描速度,可以采用以下优化方法: 1. 使用硬件定时器来定时扫描行,减少CPU的负载。
2. 使用中断方式处理按键事件,从而减少程序中的轮询操作。
3. 将矩阵键盘的行和列布局进行优化,减少扫描的时间复杂度。
利用矩阵键盘实现密码输入矩阵键盘广泛应用于密码输入功能。
通过将矩阵键盘与51单片机结合,可以实现密码的输入、验证等功能。
以下是一个简单的密码输入的实现步骤: 1. 设置一个密码数组用于存储密码。
2. 使用矩阵键盘获取用户输入的密码,并依次存储到临时数组中。
实验7 矩阵按键识别技术
实验7 矩阵按键识别技术矩阵按键部份由16个轻触按键按照4行4列排列,连接到JP50端口。
将行线所接的单片机的I/O 口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
相关原理:程序运行照片:接线方法:1、用一条8PIN数据排线,把矩阵按键部份的JP50,接到CPU部份的P1口JP44.2、接8位数码管的数据线。
将数码管部份的数据口 JP5接到CPU部份的P0口JP51.3、接8位数码管的显示位线。
将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.;本程序实现扫描按键显示功能.;分别按16个键盘显示分别显示数字123A456B789C*0#D;键盘口P1,数码管显示第二位p21, 数码管段位p0口确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。
行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.程序流程图:8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。
列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。
4根行线和4根列线形成16个相交点。
1、检测当前是否有键被按下。
检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。
2、去除键抖动。
当检测到有键按下后,延时一段时间再做下一步的检测判断。
3、若有键被按下,应识别出是哪一个键闭合。
方法是对键盘的行线进行扫描。
P1.4-P1.7按下述4种组合依次输出:在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。
由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。
矩阵按键扫描原理
矩阵按键扫描原理版权所有,禁止任何形式的转载矩阵按键扫描原理矩阵按键扫描原理是键盘的常见组合技术,它使用矩阵的形式组织键盘。
它可以有效地把多个键盘上的按键形成一个“矩阵”,通过控制一组行引脚和一组列引脚来“扫描”矩阵,实现按键的识别,从而实现键盘的接口复用,减少接口数量,节省成本。
原理矩阵按键扫描的原理是:通过把按键排列成一个矩阵,每次激活一行,然后检查该行中哪些按键是按下的,从而实现按键的识别。
举例下图是一个 6 行 4 列的矩阵按键扫描图,把按键按行依次连接,每行连接 4 个按键,每一行都接上一个上拉电阻 R,这样按键就会生成一个矩阵。
![Alt](./1.png '参考图1')每行的上拉电阻连接到一个行引脚上,每列的按键连接到一个列引脚上。
同时,针对每一行的行引脚,都连接一个 I/O 引脚,当对行引脚产生低电平时,其连接的 I/O 引脚也会一并被拉低,导致 I/O 引脚与列引脚产生短接,从而形成了一个“矩阵”,如图2所示:![Alt](./2.png '参考图2')每次操作时,首先会把所有的行引脚拉高电平,同时将所有行对应的 I/O 引脚连接到一个空状态,然后分别把每一行的行引脚拉低电平,检测行对应的 I/O 引脚是否也跟着变低,如果变低,则说明该行所对应的按键被按下,如果不变低,则说明该行对应的按键没有被按下。
实现细节实现一个矩阵按键扫描,除了要了解原理外,还要考虑一些实现细节。
比如:1.选择正确的上下拉电阻:矩阵按键扫描需要用上拉电阻来保证矩阵中每一行按键与其行引脚之间的电压稳定,因此在实际硬件设计中,我们需要根据每一个按键的电阻值来选择上拉电阻的大小,以保证矩阵中的按键能够正确工作。
2.接线程序的设计:矩阵按键扫描的硬件原理很简单,但是在实际应用中,可能需要针对某些按键组合设定不同的功能,因此可能会有不同的接线程序,从而实现不同的功能。
3.控制的逻辑:在实际应用中,对矩阵按键扫描的控制需要采取一定的逻辑,以确保正确的运行,并且可以明确识别每一个按键。
矩阵式键盘扫描原理
矩阵式键盘扫描原理矩阵式键盘是我们日常生活中经常接触到的一种输入设备,它广泛应用于计算机、手机、电视遥控器等各种电子产品中。
那么,矩阵式键盘是如何实现按键扫描的呢?接下来,我们将深入探讨矩阵式键盘的扫描原理。
矩阵式键盘通常由若干行和若干列的按键组成。
当用户按下某个按键时,按键所在的行和列会产生连接,从而形成一个电路。
为了检测用户按下的是哪个按键,系统需要对矩阵式键盘进行扫描。
首先,系统会将所有的列设置为输入状态,而所有的行设置为输出状态。
接着,系统会逐一地将每一行的状态设置为高电平,然后读取所有的列的状态。
如果某一列的状态为低电平,那么说明用户按下了与该列相对应的按键。
通过这种方式,系统可以确定用户按下的是哪个按键。
在实际应用中,为了提高扫描的效率,系统会采用一种称为“轮询”的方法。
轮询是指系统会以一定的时间间隔不断地重复上述的扫描过程,从而实时地检测用户的按键操作。
这样一来,即使用户按下按键的时间很短暂,系统也能够准确地捕捉到按键信息。
除了轮询方法,还有一种更高效的扫描方式,即采用中断的方式。
在这种方式下,系统会通过硬件中断或者定时器中断来实现按键的扫描。
当用户按下按键时,会触发相应的中断,系统会立即停止当前的任务,转而处理按键事件,从而提高了对按键的响应速度。
总的来说,矩阵式键盘的扫描原理是通过设置行和列的输入输出状态,逐一扫描每一行的状态,并读取所有列的状态,从而确定用户按下的是哪个按键。
在实际应用中,系统会采用轮询或中断的方式来实现对按键的实时检测和响应。
通过对矩阵式键盘扫描原理的深入了解,我们不仅能够更好地理解矩阵式键盘的工作原理,还能够为我们设计和开发新的输入设备提供一定的参考和启发。
希望本文能够对大家有所帮助,谢谢阅读!。
holtek HT48 HT4键盘扫描程序 说明书
HT48 & HT46键盘扫描程序文件编码:HA0011s简介:这是一个4×4 的键盘阵列,总共有16个键,如图所示每个键都有一个16进制的代码。
键盘扫描程序扫描键盘阵列确认是哪一个键被按下了,确定键后用LED显示它的2进制代码。
如图,这有4个LED,表示的值是从0000H 到 1111H。
在扫描过程中,如果同时有两个键被按下的话,那么只有第一个被扫描到的键会被检测到并显示。
使用这种方法的编码键盘可以把每一个值指定给键电路设计:PA0~PA3设置为输出口,PA4~PA7设置为输入口,这样组成了一个4×4的阵列,程序扫描哪一个键被按下,查表确定它的值。
PB0~PB3定义为输出口,它输出4位二进制码,16个值每个值对应一个键。
扫描过程:以第一行第一列为例。
先向PA口输出0FEH,既扫描第一行。
如果第一行有键按下,则读入的PA口键值的高位不会为F;如果PA口高位不为F,则第一行有键按下,转入列扫描。
如果第一列有键按下,则PA.4为0,否则为1。
这样可以确定按下键的行和列,确定其编码。
程序清单:#include ht48r10a-1.inc;----------------------------------------------------------datadata .section ‘datat’ ;数据段temp db ?;暂时数据寄存器temp2 db ? ;用于保存键盘扫描码以检测列值disp db ?;键值显示寄存器count1 db ?;延时计数指针mask db ?;屏蔽寄存器matrix db ?;键盘阵列寄存器r;----------------------------------------------------------codecode .section at 0 ‘code’ ;程序段org 00hjmp startstart: ;程序开始clr pbc ;设置PB口为输出口mov a,0f0h ;(1) ;设置PA高4位为输入口、低四位为输出口mov pac,aclr pa ;清PA 口clr pb ;清PB 口keyloop: ;键扫描循环mov a,0feh ;(2) ;扫描第一行是否被按下mov matrix,a ;将第一行的代码送matrixmov pa,a ;输出扫描码到PA 口mov a,pa ;读入PA口的状态到ACCxor a,0feh ;判断高4位有无0?如有,则有键按下,ACC值应改变sz acc ;第一行是否有键按下:如果有键按下,则ACC不为0 jmp get_key ;有键按下跳到读键值mov a,0fdh ;(2) ;扫描第二行是否被按下mov matrix,a ;将第二行的代码送matrixmov pa,amov a,paxor a,0fdhsz accjmp get_keymov a,0fbh ;(2) ;扫描第三行是否被按下mov matrix,a ;将第三行的代码送matrixmov pa,amov a,paxor a,0fbhsz accjmp get_keymov a,0f7h ;(2) ;扫描第四行是否被按下mov matrix,a ;将第四行的代码送matrixmov pa,amov a,paxor a,0f7hsz accjmp get_keyjmp keyloop ;跳回键循环扫描get_key: ;取键值call key_in ;(3) ;调用key_in 子程序mov pb,a ;(11) ;从PB口显示键值jmp keyloop ;跳回键循环扫描key_inproc ;键值读入子程序mov a,pa ;读取PA口数据mov temp,a ;(4) ;将PA口的状态读入的 temp寄存器中mov temp2,a ;扫描值送入temp2用于检测列值call delays ;(5) ;调用延时子程序get_release: ;等待键松开mov a,pa ;将PA口的主状态值送ACCand a,0f0h ;屏蔽ACC高四位,取按键状态xor a,0f0hsz acc ;(6) ;等键松开 , 键如松开则acc=0jmp get_releasemov a,0fh ;取屏蔽寄存器的低四位andm a,matrixmov a,0get_row: ;取行数rrc matrix ;(7) ;右移 matrix 指针status.0 ;检查并取键行szjmp get_column1 ;如果找到键行,跳到 get_next clr c ;如果还未找到键行,清carry_c add a,4h ;(8) ;加4到显示指针jmp get_row ;跳回get_rowget_colmn1:mov temp,amov a,0f0handm a,temp2 ;取键盘扫描码的高4位,检测列值swap temp2 ;交换,把列值放到低4位上mov a,0h ;(9)get_column:rrc temp2 ;逐位检测,到该位为0为止snz status.0 ;为0,则说明该列有键按下jmp nextclr cadd a,1hjmp get_column ;取出列值next:add a,tempxor a,0ffh ;计算键值并求出显示码key_in endpproc ;延时子程序delaysmov a,0ffhmov count1,ad1:sdz count1jmp d1retdelays endp程序说明:(1)段定义了哪些口是输入口,哪些口是输出口。
扫描式按键解读
扫描式按键解读矩阵键盘扫描原理1. 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式如图1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
具体的识别及编程方法如下所述。
2.矩阵式键盘的按键识别方法确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。
3.判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
4.判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
5.下面给出一个具体的例子:8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。
列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。
单片机按键矩阵识别(含程序、原理图)
按键矩阵识别技术实验说明如图2所示,把P1端口的8条I/O口分成4条列线4条行线交叉但不接触构成4×4键盘阵列,16个按键放置交叉位置,这样在单片机复杂系统需要较多按键时,这种接法可以节省单片机的硬件资源。
1.结合给出的电路原理图试分析4*4键盘矩阵识别原理,及LED动态扫描原理。
(6分)2.根据分析的键盘矩阵识别原理设计程序实现一下功能:当按下某个按键时在2个七段数码管上显示该按键的编号(注意考虑同时按下多个按键时程序处理过程)、按下某个按键使其弹起时对于消抖情况程序的处理。
(9分)2.0相关原理图如下:3.0实验说明本试验给了1-8键判断方法。
按1-8键中任意键,则数码管显示该键编号。
想想怎样实现1-16个键的判断显示?参考程序见程序范例。
/************************************************************************ *******************描述: 按键距阵识别技术*编写: 秦立春*版本信息: V1.0 2008年4月20日*说明: sp1,sp2,SP3跳线向右;************************************************************************* *****************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define ON 0#define OFF 1uchar bdata OUT;sbit JDQ=OUT^0;sbit HF =OUT^1;sbit BZ =OUT^2;sbit AA =OUT^3;sbit BB =OUT^4;sbit CC =OUT^5;sbit DD =OUT^6;sbit X0=P2^0;sbit X1=P2^1;sbit X2=P2^2;sbit X3=P2^3;sbit Y0=P2^4;sbit Y1=P2^5;sbit Y2=P2^6;sbit Y3=P2^7;sbit RS=P1^7;sbit RW=P3^4;sbit E =P3^5;sbit HC574_LE=P3^3;//-----------------------------------------------------void delay(unsigned int t) // 延时函数{for(;t!=0;t--) ;}//------------------------------------------------------ void HC574(void) // 74HC574控制输出;{P0=OUT;HC574_LE=1;delay(2);HC574_LE=0;}//================================================== unsigned char Key_Scan(void){uchar a, key;P2=0xf0;if(!(Y0&&Y1&&Y2&&Y3)){P2=0xf0;delay(200);if(!(Y0&&Y1&&Y2&&Y3)){P2=0xff;X0=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0e);goto pp1;}P2=0xff;X1=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0d);goto pp1;} P2=0xff;X2=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0b);goto pp1;} P2=0xff;X3=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x07);goto pp1;} }else a=0xff;}else a=0xff;pp1: key=a;return key;}//-----------------------------------------------------------uchar key(void){uchar k, KEY;KEY=0xff;k=Key_Scan();if(k!=0xff){while(k==Key_Scan());switch(k) // 键码{case 0x7e: KEY=0x04;break; // 4case 0x7d: KEY=0x08;break; // 8case 0x7b: KEY=0x0b;break; //case 0x77: KEY=0x0f;break; //case 0xbe: KEY=0x03;break; // 3case 0xbd: KEY=0x07;break; // 7case 0xbb: KEY=0x0a;break; //case 0xb7: KEY=0x0e;break; //case 0xde: KEY=0x02;break; // 2case 0xdd: KEY=0x06;break; // 6case 0xdb: KEY=0x00;break; // 0case 0xd7: KEY=0x0d;break; //case 0xee: KEY=0x01;break; // 1case 0xed: KEY=0x05;break; // 5case 0xeb: KEY=0x09;break; // 9case 0xe7: KEY=0x0c;break; //default: KEY=0xff;break; // 无键按下}}return KEY;}main(){uchar code shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4,0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,0x00,0xff}; //灭共阳极数码管显示段码 uchar i,k;uchar display[2]={0xff,0xff};RS=0; RW=0; E=0;OUT=0;HC574();delay(60000);while(1){k=key();if(k<=0x0f){display[0]=k/10;display[1]=k%10;}for(i=0;i<2;i++){P1=(~(0X01<<i))&0X7F; P0=shu[display[i]]; delay(100);}}}。
矩阵按键扫描处理方法
说明: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 的电阻会减小,按下的越多,减的越小。
按键扫描系统和方法[发明专利]
专利名称:按键扫描系统和方法专利类型:发明专利
发明人:王强,刘建伟,首召兵
申请号:CN200710123928.9申请日:20071012
公开号:CN101162906A
公开日:
20080416
专利内容由知识产权出版社提供
摘要:本发明涉及一种按键扫描系统和方法;按键扫描系统包括按键矩阵和用于检测按键是否按下的扫描控制器,扫描控制器具有一个以上的扫描端口,每个扫描端口都可以作为输入端口或输出端口;每个扫描端口分别通过一个所述按键连接到地,任意两个所述扫描端口之间连接一个按键;按键扫描方法包括首先检测一端接地的按键,然后在通过扫描端口分为输入和输出两组的交替扫描检测连接在扫描端口之间的按键;通过本发明的按键扫描系统和方法可以实现较少的I/O端口实现较多按键的扫描。
申请人:深圳市和而泰电子科技有限公司
地址:518000 广东省深圳市高新区科技南十路国际技术创新研究院D座10楼
国籍:CN
代理机构:深圳市顺天达专利商标代理有限公司
代理人:高占元
更多信息请下载全文后查看。
一种矩阵式键盘操作识别及编码方法[发明专利]
专利名称:一种矩阵式键盘操作识别及编码方法专利类型:发明专利
发明人:聂辉,凌云,陈刚
申请号:CN201810591940.0
申请日:20160105
公开号:CN108809321B
公开日:
20220318
专利内容由知识产权出版社提供
摘要:一种矩阵式键盘操作识别及编码方法,包括有X行‑Y列按键矩阵的矩阵式键盘输出N位键盘状态信号,所述N=X+Y;按照扫描脉冲对N位键盘状态信号进行数据锁存得到现态键值,锁存脉冲对现态键值与前态键值进行状态锁存得到2×N位的状态码,N个移位脉冲对现态键值进行移位得到前态键值的顺序,周而复始进行相应的操作;对状态码进行编码并输出键号,由包括矩阵式键盘、第一移位寄存器、第二移位寄存器、状态码寄存器、编码器的电路实现。
如果需要增减按键操作功能或者是调整按键操作功能,不需要修改电路结构,只需根据增减后的状态码与键号之间的对应关系更改编码器的编码内容即可。
所述方法不用编写和运行程序,工作可靠。
申请人:湖南工业大学
地址:412007 湖南省株洲市泰山西路88号湖南工业大学科技处
国籍:CN
更多信息请下载全文后查看。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
N
扫描PB低4位,查询 该行是否有键按下
N
N
查询前8行是否
扫描完毕
Y
变量matrow为FEH, 同时输出matrow到PB
matrow值输出到PB 扫描PB
查询第9~12行按键
matrow向左 移位1位
判断第9~12行的 某一行是否有键按下
N
N Y
判断第12行是否 扫描完毕
执行键值获取函数
Y
get_key 获取键值key_value
按键扫描流程图
矩阵式按键扫描
开始
设置参数初始化
循环置8行中的 一行为低电平
第n行是否
Y
为低电平?
N
N
是否有键
按下?
Y
延时函数 delay_fun
行计数row 清零
N
再次确认是否
有键按下?
Y 取键值子程序
get_key
2
HT48RA0-5 矩阵式与梯型式按键扫描实现方法
梯型按键扫描
开始
参数初始化
初始化变量matrow为FEH,
使用梯型扫描方式时,若增加按键个数时,可能会增加一定的 ROM 空间,使用者需自行取 舍。
4
范例原理图
矩阵式按键扫描
说明:以上使用 HT48RA0-5 的端口 A 和端口 B 扫描矩阵键盘,PA 扫描行、PB 扫描列。 1
梯型按键扫描
HT48RA0-5 矩阵式与梯型式按键扫描实现方法
说明:以上使用 HT48RA0-5 的 PA0~PA7 I/O 对应扫描键盘前第 1~8 行,PB0~PB3 I/O 对应 扫描第 9~12 行。
N
主循环计数count
是否为20H(延时40ms)
Y
Y
Key_value是否改变
N
Key_value= key_value_ture
执行第9~12行按键的 取键函数计数是否为20H
Y
Y
Y
Key_value是否改变
N
Key_value= key_value_ture
3
HT48RA0-5 矩阵式与梯型式按键扫描实现方法
矩阵扫描方法是利用 HT48RA0-5 的 16 个 I/O 扫描一个 8×8 的矩阵键盘,利用循环检测的 方法逐行逐列的扫描,一旦有键按下时,处理按键的子程序获得键盘的键值来实现的。而 梯形按键扫描方法是利用 12 个 I/O 扫描一个 T-type 键盘。同样是按照逐行位置、逐行逐列 扫描的原理检测是否有键被按下,唯一与矩阵键盘不同的是梯形键盘分为前八行和后四行 的独立方式扫描来实现。
同时输出matrow到PA
N
matrow值输出到PA
置前8行中某一行为
Low
Y
matrow向左 移位1位
扫描PA,确认该行
Y
是否有键按下
执行键值获取函数 get_key
获取键值key_value
主循环计数count 是否为20H(延时40ms)
Y Key_value是否改变
N Key_value= key_value_ture
程序范例说明
矩阵式按键扫描
程序首先在 Start 初始化参数,然后进入逐行扫描主循环 key_loop,以第 1 行为例,先向 PA 输出 FEH,让第 1 行为 Low,然后读入 PB 的值确定是否有键按下,如有,则执行延时子 程序,之后再次确认是否该按键被按下,若有,则执行获取键值子程序 get_key,子程序 get_key 将按顺序逐一判断第 1 行哪个键被按下,最后将该按键值指定到变量 key_value 以 供客户使用,否则程序将跳至下一行继续扫描。其它行以此类推。
梯型按键扫描
程序首先逐行扫描键盘的 1~8 行,如某一行中有按键被按下,则执行键值获取函数 get_key, 函数 get_key 将按顺序逐个判断该行哪个键被按下,若延时 32ms 后,该键值依然不变,则 视作有效键值,将该按键值指定到变量 key_value_true,否则视作无效键值不予理会,程序 继续扫描下一行。当前 8 行扫描完毕就跳到 9~12 行逐行扫描,如有按键被按下,则执行获 取函数 get_key_fun,处理方法如前 8 行。当 9~12 行扫描完毕就跳至程序开始 Start,重新 扫描键盘。
矩阵与梯型按键扫描 ROM 与 RAM 的使用情况,如下表:
矩阵键盘 T 型键盘
项目 已使用 未使用 百分比 已使用 未使用 百分比
ROM (字) 91 933 8% 278 746 27%
RAM (字节) 7 25
21% 13 19 40%
结论
梯型键盘应用范例是使用 12 个 I/O,即使用端口 A 和端口 B 的 PB0 ~ PB3,使用者可根据 应用电路稍作修改即可使用。
HT48RA0-5 矩阵式与梯型式按键扫描实现方法
HT48RA0-5 矩阵式与梯型式按键扫描实现方法
文件编码:HA0262S
简介
HT48RA0-5 是 Holtek 新开发的 SRC 红外线遥控器 MCU,内建高精度的 4095kHz IRC、高 灌电流的遥控器信号输出脚,可直接推动红外线发射二极管而省掉晶体管的电流放大电路, 本文将以 HT48RA0-5 为母体,分别实现矩阵式与梯型式按键扫描方法。