按键程序的设计
按键的硬件通常有两种形式:
1.独立式:
独立式键盘较为单一,通过判断键盘接入口的状态就能判断有无键按下;
2.矩阵式也叫行列式:
所谓矩阵式就是说每一个按键不是单独的,键与键之间有一定的硬件联系,它的判断是通过先设置某行或某列的状态再来读某列或某行的状态来实现的.
相比之下,两种方式各有千秋,如果单片机资源充足的情况下,用独立式键盘较方便,如果单片机资源紧缺,当然要用矩阵式键盘,下面我们来简单的讲一下独立式键盘的程序编写原理:
试验板上P1为按键输入口,当有按键按下时,对应的P3.2,P3.3的LED会闪动,我们这样做的目的在于让初学者知道散转指令的一些用法,知道按键的实际应用意义,因程序中有延时,有时候按键会没有效,后面的讲课我们会教你如何去克服这种现象,程序设计如下:
VCC
89c51 |
P1.0
P1.1
…
P1.7
程序编号为: (KEY00.ASM)
ORG 0000H
LJMP START0
ORG 0050H
START0:
MOV P1,#0FFH
MOV A,P1
START:
JNB ACC.0,PG0 ;是P1.0被按下吗?是的,转PG0
JNB ACC.1,PG1 ;是P1.1被按下吗?是的,转PG1
JNB ACC.2,PG2 ;是P1.2被按下吗?是的,转PG2
JNB ACC.3,PG3 ;是P1.3被按下吗?是的,转PG3
JNB ACC.4,PG4 ;是P1.4被按下吗?是的,转PG4
JNB ACC.5,PG5 ;是P1.5被按下吗?是的,转PG5
JNB ACC.6,PG6 ;是P1.6被按下吗?是的,转PG6
JNB ACC.7,PG7 ;是P1.7被按下吗?是的,转PG7
SJMP START
PG0:
MOV P3,#0FFH
CLR P3.2 ;点亮D7
SJMP START
PG1:
MOV P3,#0FFH
CLR P3.3 ;点亮D8
SJMP START
PG2:
MOV P3,#0FFH
CLR P3.2 ;点亮D7
CLR P3.3 ;点亮D8
SJMP START
PG3:
MOV P3,#0FFH
MOV A,#8
NEXT0:
CLR P3.2 ; ;点亮D7
CALL DELAY1Ms ;延时1S
SETB P3.2 ;灭D7
DEC A
CJNE A,#00,NEXT0 ;循环8次
SJMP START
PG4:
MOV P3,#0FFH
CLR P3.3
SJMP START
PG5:
MOV P3,#0FFH
CLR P3.2
SJMP START
PG6:
MOV P3,#0FFH
CLR P3.2
CLR P3.3
SJMP START
PG7:
MOV P3,#0FFH
SJMP START
END
那幺矩阵式键盘的程序又是怎样设计的呢?通常有三种方法来设计按键扫描程序:⒈计算法;⒉查表法;⒊查寻法。下面我用计算法来设计一下按键扫描程序:
程序标号为: KEY01.ASM
89C51 |
P1.4 P1.5 P1.6 P1.7
P1.0
P1.1
P1.2
P1.3
程序编号为: (KEY.ASM)
ORG 0000H
LJMP START
ORG 0050H
START:
MOV P1,#0FH ;按键初始化
LCALL KEYIN ;调按键输入子程序
JNZ LKOUT ;有按键吗?
LJMP START
LKOUT:
MOV R2,#0EFH ;首列扫描码送入R2
MOV R4,#00H ;首列偏移值送R4
CONU:
MOV P1,R2 ;列扫描码送P1
MOV A,P1 ;读按键值
JB ACC.0,L0NE ;检查按键是否在第0行.
MOV A,#00H ;此行有键按下,将列号放入A
AJMP KCODE ;求出键号
LONE:
JB ACC.1,LTWO ; 检查按键是否在第1行.
MOV A,#04H ; 此行有键按下,将列号放入A
AJMP KCODE ; 求出键号
LTWO:
JB ACC.2,LTHREE ; 检查按键是否在第2行.
MOV A,#08H ; 此行有键按下,将列号放入A
AJMP KCODE ; 求出键号
LTHREE:
JB ACC.3,LFOUR ; 检查按键是否在第2行.
MOV A,#0CH ; 此行有键按下,将列号放入A
LKP: ; 求出键号
ADD A,R4 ;行号加列号进行编码
PUSH A ;将A中的值保存起来
LCALL KEYIN ;等待按键释放
JNZ WKFE ; 按键松开了码?
POP A ;按键松开,键值放在A中
LJMP KJMP ;根据键值处理相关事项
LFOUR:
INC R4 ;此列没有键按下,继续检查下一列
MOV A,R2 ;
JNB ACC.7,KND ;4列检查完了码?
RL A ;没有,继续检查.
MOV R2,A ;
LJMP CONU ;
KND: ; 4列检查完,返回
RET
KEYIN:
MOV P1,#0FH ;想将按键初始化
MOV A,P1 ;读按键
CPL A ;取反
ANL A,#0FH ;屏蔽高四位,在这里其实是检查有无按键按
;下,如A不等于0,表示有按键按下.
RET
KJMP:
…… ;后面的显示程序中我们会将此转散程序加
;上的
从上面的程序我们知道,按键的编码其实就是按照我们预先定义的键号来做的,至于键号是多少,我们不要去理会,因为我们可以根据自己想要的一个键号值去处理相关的事务.光有按键程序,我们看不到按键执行的效果,下面我重点讲一下用查表法来设计按键扫描程序的设计:
程序编号为: (KEY00.ASM)
ORG 0000H
LJMP START
ORG 0050H
START:
MOV A,#0FFH ;请按键
MOV P1,A
MOV P2,A ;关显示
START1:
MOV R3,#0F7H ;按键扫描码送R3
MOV R1,#00H ;先将按键值置0
START2:
MOV A,R3 ;开始扫描按键
MOV P1,A
MOV A,P1 ;读按键
MOV R4,A ;按键存入R4
SETB C
MOV R5,#04H ;按键扫描4次
START3:
RLC A ;看有没有按键按下
JNC KEYIN
INC R1 ;没有,指针加一
DJNZ R5,START3 ;扫描四列了吗?
MOV A,R3 ;扫描值送入A
SETB C
RRC A
MOV R3,A
JC START2 ;4行扫描完了吗?
LJMP START1 ;是
KEYIN:
MOV R7,#80 ;消抖延时程序
KEYIN1:
MOV R6,#200
DJNZ R6,$
DJNZ R7,KEYIN1
KEYIN2:
MOV A,P1 ;在次读按键
XRL A,R4 ;与前一次按键值比较
JZ KEYIN2 ;按键松开了吗?
MOV A,R1 ;是
MOV DPTR,#TAB1 ;查表
MOVC A,@A+DPTR
MOV 30H,A ;键值存在30H中
LJMP START1
TAB1:
DB 0DH,0EH,00H,0FH
DB 0CH,07H,08H,09H
DB 0BH,04H,05H,06H
DB 0AH,01H,02H,03H
END
从上面的两个程序我们可以分析得出,查表法设计程序较为简洁,比较好懂,用查寻法设计程序,逻辑较差,程序似乎不紧奏,无论用那种方法,结果都一样,因此,初学者最好定好一种格式,将自己的风格加进去,学会用自己的个性来设计程序。
- 作者:ziqintian | 发布:2013年10月29日
- 分类:IT类别
- 标签:单片机设计,按键程序设计
- 转载文章请注明:单片机设计之按键程序设计 | 太极博弈原理官方站|紫欽天|融通百科为我所用|生活全智慧|生活智慧之书
文章是怎么写出来的?
好吧,我承认我想多了
大师受教了,缘来如此。。。
...也许网络安全产业以后会是
此法确实可靠吗?
hello!,I like y
I was suggested
Thanks , I've j