矩阵键盘编程.doc

上传人:牧羊曲112 文档编号:2767318 上传时间:2023-02-24 格式:DOC 页数:8 大小:127KB
返回 下载 相关 举报
矩阵键盘编程.doc_第1页
第1页 / 共8页
矩阵键盘编程.doc_第2页
第2页 / 共8页
矩阵键盘编程.doc_第3页
第3页 / 共8页
矩阵键盘编程.doc_第4页
第4页 / 共8页
矩阵键盘编程.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《矩阵键盘编程.doc》由会员分享,可在线阅读,更多相关《矩阵键盘编程.doc(8页珍藏版)》请在三一办公上搜索。

1、精选优质文档-倾情为你奉上矩阵键盘编程键盘结构与类型独立式按键键盘由若干独立式按键组成。独立式按键指每个按键作为一位占用一根I/O口线,直接用I/O口线构成单个按键电路。独立式按键键盘可分为中断方式和查询方式两种。独立式按键键盘优点是配置灵活,软件结构简单,操作速度快;缺点是按键多时I/O口浪费较大,故只在按键数目不多时采用。 行列式键盘(矩阵式键盘)用I/O口线组成行、列结构,按键设置在行列的交点上。在按键较多时可节省I/O口线,如48行列结构可构成32个键的键盘。行列式键盘键输入过程及接口软件应解决的任务 键开关状态的可靠输入 主要应解决抖动问题。对按键编码以便识别 对按键编码,使不同的按

2、键有不同的键值或键号。按键状态的输入方式 有中断方式与查询方式两种。编制键盘程序 检测有无按键按下、去抖动、按键信息的逻辑处理、输出确定的键号等。 行列式键盘(矩阵式键盘)及接口程序设计 行列式键盘的结构及键值赋值方法键盘行线的一端经上拉电阻接+5v电源,另一端接单片机的输入口(因而各输入口均被钳位于高电平)。各列线的一端接单片机的输出口,另一端悬空。按键设置在行列线的交点上,行、列线分别连接到按键的两端,按键按下则相应交点的行列线接通。由图可见,矩阵式键盘接口的设计思想是把键盘既作为输入设备又作为输出设备对待的。为了让CPU能识别是哪个按键被按下,必须给每个按键都分配一个键号(一般以十进制数

3、表示)。例如,44列矩阵式键盘共16个按键,键号依次按顺序排列为015。 对行列式键盘的每个按键,还有一个更重要的概念:键值或者说键码。键值是一个可表征按键状态的8位数据,不同的按键有不同的键值。按键后根据键值便能转到相应的键处理子程序,实现键盘的数据输入功能或命令处理功能。同一个按键的键值和键号可以相同,也可以不相同,这主要取决于键盘的结构与采用的编码方法。对行列式键盘来说,识别被按键的位置也就是找出被按键所在行和列的坐标值。对于4行4列行列式键盘,被按键所在行和列的坐标值为两个4位数据;而对于8行8列行列式键盘,则为两个8位数据。采用某种方法将被按键所在行和列的两个坐标值加工成一个8位数据

4、(称为键码赋值或键值赋值),便得到该按键的键值。键值赋值的方法可任意选择,只需满足以下两个要求即可:每个按键具有唯一的键值;在有两个按键被同时按下时,求出的键值应不在键值表之内,以便CPU能识别串键。键值赋值的方法主要有两种:按二进制编码和按顺序排列键号。 (1)按二进制编码这是键值赋值的最直接方法。这种方法是将所有行线、列线的状态(高、低电平)分别用二进制编码,求得被按键所在行和列的坐标值,再将两个坐标值拼装成一个8位数据,便得到键值。下面以4行4列矩阵式键盘电路为例来说明这种方法。按键输入通常都采用低电平有效,因此,假定单片机I/O口向接在D1上的列线输出0信号,而向其它列线均输出1信号,

5、此时,若将D6行与D1列交点处的按键按下,则D6行将向单片机输入 0信号,而其它行将输入1信号。可见,代表D6行与D1列交点处的按键按下的特征信号(即单片机I/O口的输入信号和输出信号)为: 行信号(行坐标值):1011(D6行为0) 列信号(列坐标值):1101(D1列为0)在这里,行、列信号正好都是4位,为了便于单片机处理,可将行、列信号拼装在一个字节中,这样便得到用负逻辑表示的键值BDH。这种负逻辑表示往往不够直观,通过在行列线上加反相器或由软件求反,可得到用正逻辑表示的键值42H。拼装过程示意图如下:1011110101000010 行 信 号 列 信 号 求反 行 信 号 列 信 号

6、 同理,可得其余按键的键值(按各键从左至右、从上至下排列):77H7BH7DH7EH 88H 84H 82H 81HB7HBBHBDHBEH 48H 44H 42H 41HD7HDBHDDHDEH 28H 24H 22H 21HE7HEBHEDHEEH 18H 14H 12H 11H 用负逻辑表示的键值 用正逻辑表示的键值 由此种方法所得的键值与已按键的对应关系是唯一的,换言之,可以根据键值来识别键盘上的所有按键。键值按二进制编码时,软件较为简单直观,但键值太分散且不等距,入口地址安排不方便。按顺序排列键号可克服按二进制编码方法的缺点。 (2)按顺序排列键号 下面以4行8列矩阵式键盘为例说明这

7、种方法。当要求键值与键号相一致时,可将各键的键值分配如下: 行号 列号 0 1 2 3 4 5 6 7 0 00H 01H 02H 03H 04H 05H 06H 07H 1 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 2 10H 11H 12H 13H 14H 15H 16H 17H 3 18H 19H 1AH 1BH 1CH 1DH 1EH 1FH观察上述分配表可知,十六进制的各列号与列首键值(即第0行的各键值)相等,从左至右依次为00H、01H、07H;而十六进制的行号与行首键值(即第0列的各键值)不相等,但行号乘8即得到行首键值:08=0(00H),18=8(08H

8、), 28=16(10H), 38=24(18H)。则 任意键值=行首键值+列号=行号8+列号当单片机应用系统既有数字键又有功能键时,为了软件中便于区分,可将左边16个键定义为数字键,右边16个键定义为功能键。这样,一个键值的高半字节为0表示数字键,为1表示功能键;键值的低半字节则依次表示16个数字键和功能键。这样,可得另一种键值分配方案如下(键值与键号不一致): 行号 列号0 1 2 3 4 5 6 7 0 00H 01H 02H 03H 10H 11H 12H 13H 1 04H 05H 06H 07H 14H 15H 16H 17H 2 08H 09H 0AH 0BH 18H 19H 1

9、AH 1BH 3 0CH 0DH 0EH 0FH 1CH 1DH 1EH 1FH显然,键值与键号不一致时求键值的方法,比一致时要复杂一些,这可以在键值分析程序中用软件来完成。 行扫描法按键识别流程按键识别指如何确定被按键的行列坐标,并据此产生键码。这是非编码键盘接口设计的主要问题。常用按键识别技术有两种:行扫描法和线翻转法,其中行扫描法使用较为普遍。现以16键行列式键盘为例,说明行扫描法的按键识别流程。(1)测试有无按键被按下键盘中有无按键按下是由输出口向列线输出全扫描字(00H)、输入口读入行线状态来判断的。其方法是:先由输出口向所有列线输出低电平0,然后将行线电平状态读入,若行线状态都是高

10、电平,则表明无键按下;若行线状态中有低电平,则表明有键被按下。(2)去抖动一般调用延迟子程序来达到去抖动的目的。但当系统中有显示器时,也可只调用几次显示子程序来达到延迟去抖动的目的。(3)用行扫描法确定被按键物理位置只判断有无按键闭合还是不够的,更为关键的是判断究竟是哪一个按键闭合,以便CPU根据闭合键的功能进行处理。常用“行扫描法”来确定被按键的行、列位置。所谓行扫描即采用步进扫描方式,由CPU通过输出口依次给每条列线送0信号(称扫描键盘),而同时向其余各列线送1信号,然后通过输入口检测对应于每一列扫描时的所有行线状态。输出口给列线每输出一次0电平,就从输入口读入一次代表所有行线状态的数据,

11、若数据各位全为“1”,则此列线上无闭合键;若不全为“1”,则此列线上有闭合键,且闭合键就在“0”电平的行、列线交点上。行扫描识别闭合键原理见图(Note: No picture)。 (4)计算闭合键的键值 有闭合键时,根据从输出口输出的数据与从输入口读入的数据,就可计算出闭合键的键值,其方法前已述及,不再赘述。 (5)延时等待键释放按键释放后,就可根据键值转到相应的键处理子程序,进行数据输入或命令处理。CPU对键盘的控制方式 单片机对非编码键盘有三种控制方式:编程扫描方式 此方式是指CPU只在完成其它工作的空闲时间里才调用键盘扫描子程序,响应键输入请求。而在执行键功能程序时,CPU不再响应键输

12、入请求。因此,在单片机应用系统软件方案设计时,应考虑这种键盘扫描子程序的编程调用是否能满足键盘响应的要求。 定时扫描方式 指每隔一定时间对键盘扫描一次。通常利用单片机内部定时器产生定时中断(例如10ms),CPU响应后即对键盘进行扫描,并在有键按下时转入键功能处理程序。定时扫描工作方式的键盘硬件电路与编程扫描工作方式相同。 中断扫描方式 指在键盘有键按下时发中断申请,CPU响应中断后,才进行键盘扫描,执行该键功能程序。中断扫描方式可提高CPU效率,避免CPU处于空扫描状态(前两种扫描方式使CPU经常处于空扫描状态),但硬件电路比编程扫描方式、定时扫描方式复杂,因为需扩展中断电路。定时扫描方式在

13、本质上就是中断扫描方式。 行列式键盘接口及程序设计(编程扫描方式)单片机应用系统的键盘程序一般包括以下几个部分:判别有无闭合键,若有则应消除抖动;扫描键盘以获取闭合键的行值和列值并求出键值(用计算法或查表法);判别闭合键是否释放;执行键操作;返回。下面以4行8列矩阵式键盘为例,介绍行列式键盘与8031单片机的接口方法和键盘管理程序的设计。该电路以8155的PA口作输出口,地址为7F01H;PC口作输入口,地址为7F03H。键值与键号一致。由图可得各键的列信号(列值)与行信号(行值),见下表。 由表可见,首列扫描字(列值)为FEH,第一列扫描字为FDH,最后一列扫描字为7FH。故扫描字左移一位就

14、是下一列的扫描字。另外,利用PA7为0的标志可判别8列(一轮)扫描是否完成。当PA7=0且各行都查找结束时,该轮扫描即告结束,可重新开始键盘扫描。 设初始化程序在主程序中。下面给出判别是否有键闭合子程序、键盘扫描子程序。后者的作用是求出闭合键的键值送累加器。 在键盘扫描程序中需调用两个子程序:DISPLAY(显示子程序)、KEYCH(判别是否有键闭合子程序)。 表 4行8列矩阵式键盘的行值与列值列列线(PA)列行行线(PC)行号 76543210值号3210值0 11111110FE01110E1 11111101FD11101D2 11111011FB21011B3 11110111F730

15、11174 11101111EF5 11011111DF6 10111111BF7 011111117F矩阵键盘键值显示/* 网站: * 功能:根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管(一位)显示。开机时,数码管显示“”。当键按下时,数码管显示按下键的键值,蜂鸣器响一声。 * 接法:行线接P1.4P1.7,列线接P1.0P1.3。*/*头文件、变量定义、宏定义*/#include /#include #define uchar unsigned char#define uint unsigned intsbit BEEP = P37; /蜂鸣器驱动线uchar key;u

16、nsigned char code disp_code= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf;unsigned char code key_code= 0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7, 0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 ;/* 延时子函数*/void delayms(uint ms) uchar t; while(ms-) for(t = 0; t 120; t+);

17、 /* x*0.14mS 延时子函数*/void delay0(uchar x) uchar i; while(x-) for (i = 0; i13; i+) ; /* 蜂鸣器驱动子函数*/void beep() uchar i; for (i=0;i180;i+) delay0(5); BEEP=!BEEP; /BEEP取反 BEEP=1; /关闭蜂鸣器 delayms(250); /延时/*键盘扫描子函数*/uchar keyscan() uchar scan1,scan2,keycode,j; P1=0xf0; /P1口发 scan1=P1; /读P1口的状态 if(scan1&0xf

18、0)!=0xf0) /判键是否按下 delayms(30); /延时30ms scan1=P1; if(scan1&0xf0)!=0xf0) /二次判键是否按下 P1=0x0f; /线翻转法 scan2=P1; / keycode=scan1|scan2; /组合成键编码 for(j=0;j=15;j+) if(keycode= key_codej) /查表得键值 key=j; return(key); else P1=0xff; return (16); /?/* 判键是否按下子函数*/void keydown() P1=0x0f; if(P1&0x0f)!=0x0f) keyscan(); P0=disp_codekey; beep(); /*主函数*/void main() P0 = 0xbf; P2 = 0x7f; /数码管显示- P1 = 0xff; while(1) keydown(); /*/专心-专注-专业

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号