人机交互界面程序的完整设计
通过以上几课的学习,我们已经初步掌握了按键,显示器,中断程序的设计,下面我们来设计一个完整的人机交互程序,任务如下:
当实验板开机时,段码管显示器显示”8951”,当有键按下时,显示器显示所有按键,并且从右向左移动,如果10秒内没有键按下,又回到原来的显示状态,显示”8951”,
思路:至于按键和段码管显示器的程序,上面已经有实例了,10秒的程序怎样做呢?用延时吗?如果在延时时,有键按下怎幺办?用延时去做10秒的定时可能有些麻烦,因此用中断是首选的方式,只要注意中断的开关即可,我们用T0模式1产生20毫秒定时,当中断500次时,10秒定时时间到,下面我们不妨来试一是:
主程序如下: (程序编号为:LEDKEY02.ASM)
说明:50---53H 用作显示缓冲区; 71—72H用作中断计数区
OVERFLAG EQU 70H ;10秒定时到标志,1为有效
KEYFLAG EQU 69H ;按键按下标志,1为有效
ORG 0000H
LJMP START
ORG 000BH
LJMP TTT000
ORG 0050H
START:
LCALL INITI
MOV A,#0FFH ;请按键
MOV P1,A
MOV P2,A ;关显示
MOV R4,#04H
MOV R0,#50H
CLEAR:
MOV @R0,#00H
INC R0
DJNZ R4,CLEAR
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 ;扫描四列了吗?
LCALL DISPLAY
MOV A,R3 ;扫描值送入A
SETB C
RRC A
MOV R3,A
JC START2 ;4行扫描完了吗?
MOV A,OVERFLAG
CJNE A,#1,START1
MOV OVERFLAG, #0
MOV 50H,#2
MOV 51H,#5
MOV 52H,#9
MOV 53H,#8
CLR TR0
LJMP START1 ;是
KEYIN:
MOV R7,#70 ;消抖延时程序
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 ;键值存在50H中
XCH A,50H ;所有键值前移一位
XCH A,51H
XCH A,52H
XCH A,53H
LCALL DISPLAY ;显示键值
MOV 71H,#00H
MOV 72H,#00H
MOV OVERFLAG, #0
SETB TR0
LJMP START1
DISPLAY:
MOV A,#0FH ;清第1个显示器
ADD A,#40H
MOV P2,A
LCALL DELAY
MOV A,50H ;显示当前按键值
ADD A,#40H
MOV P2,A
LCALL DELAY
MOV A,#0FH ;清第2个显示器
ADD A,#10H
MOV P2,A
MOV A,51H ;显示第2个按键值
ADD A,#10H
MOV P2,A
LCALL DELAY
MOV A,#0FH ;清第3个显示器
ADD A,#20H
MOV P2,A
MOV A,52H ;显示第3个按键值
ADD A,#20H
MOV P2,A
LCALL DELAY
MOV A,#0FH ;清第4个显示器
ADD A,#30H
MOV P2,A
MOV A,53H ;显示第4个按键值
ADD A,#30H
MOV P2,A
LCALL DELAY
RET
DELAY:
PUSH 07H
PUSH 06H
MOV R7,#08H
DELAY1:
MOV R6,#200
DJNZ R6,$
DJNZ R7,DELAY1
POP 06H
POP 07H
RET
INITI:
MOV P1,#0FFH
MOV P2,#00H
MOV P0,#00H
MOV P3,#00H
MOV OVERFLAG, #1
MOV KEYFLAG,#00H
MOV 50H,#2
MOV 51H,#5
MOV 52H,#9
MOV 53H,#8
MOV TMOD,#01H ;T0模式1
MOV TH0,#0B1H ;定时20MS
MOV TL0,#0E0H ;
SETB ET0 ;充许T0中断
SETB EA ;开所有中断
CLR TR0 ;关T0中断
RET
TTT000:
MOV TL0,#0E0H ;;重设置定时参数
MOV TH0,#00B1H ;;
INC 71H ;;中断次数加1
MOV A,71H ;;
CJNE A,#0FFH,RN00 ;;中断255次吗?
MOV 71H,#00H ;;是,清0
INC 72H ;;
MOV A,72H ;;
CJNE A,#02H,RN00 ;;中断1000次吗?
MOV 72H,#00H ;;是
MOV OVERFLAG, #1
MOV KEYFLAG,#0H
RN00:
RETI
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