PersonalCorpus 版 (精华区)
寄信人: asaki (牙子·:-#)
标 题: 没主题
发信站: 哈工大紫丁香 (2003年06月17日13:11:25 星期二)
来 源: 202.118.248.68
键盘行扫描法
1. 判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只
要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线
相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2. 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程
。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列
线与置为低电平的行线交叉处的按键就是闭合的按键。
P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘
的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线P
1.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.7 1 1 1 0
P1.6 1 1 0 1
P1.5 1 0 1 1
P1.4 0 1 1 1
在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否
则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行
值和列值转换成所定义的键值
4. 为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。
延时子程序D20MS你自己编吧。几个循环递减就成。
键盘扫描程序:
SCAN: MOV P1,#0FH ;望P1.4-P1.7输出0
MOV A,P1 ;读P1
ANL A,#0FH ;取P1.0-P1.3的值
CJNE A,#0FH,NEXT1 ;如果P1.0-P1.3都为1无键按下
SJMP NEXT3 ;退出键盘扫描程序
NEXT1: ACALL D20MS ;延时20毫秒
MOV A,#0EFH
NEXT2: MOV R1,A
MOV P1,A ;P1口输出11101111,判断第一行
MOV A,P1
ANL A,#0FH ;读P1口底四位
CJNE A,#0FH,KCODE ;如果底位都为1,这行无键按下
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH ;
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
INC B
INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.248.68]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.558毫秒