单片机实验——查询式键盘实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验——查询式键盘实验
1.实验目的
(1)掌握查询式按键检测方法
(2)掌握数码管动态扫描汇编语言的编制方法
2.预习要点
(1)按键检测的基本原理
(2)数码管动态扫描显示方法
3.实验设备
计算机、单片机实验箱。
4.实验内容
基本要求:
接实验二的实验内容,通过实验板的4个按键电路,将按键的检测线连接到CPU 的p1.0~p1.3上。当按下按键1到4时,在实验板显示电路分别对应显示30H到33H存储单元的内容。
扩展要求:
30H~33H中放置字母A~D的ASCII码,当按下按键1到4时,A~D字母循环间隔分别为1至4秒
实验3
ORG 0000H
SJMP MAIN
;********************************
;主程序
ORG 0030H
MAIN:MOV SP,#70H
;初始化8155
MOV DPTR,#0100H
MOV A,#03H
MOVX @DPTR,A
LOOP:LCALL KEYSCAN ;键扫描
LCALL DISPLAY ;数码管显示
SJMP LOOP
;********************************
;显示子程序
DISPLAY:
LD0:MOV DPTR,#0102H
MOV A,#0FEH
MOVX @DPTR,A
MOV DPTR,#DTAB
MOV A,R0
MOVC A,@A+DPTR
MOV DPTR,#0101H
MOVX @DPTR,A
LCALL DELAY
RET
;********************************
;字形表
DTAB:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DB 77H,7CH,39H,5EH,79H
DB 71H
;********************************
;延时1ms
DELAY:
MOV R7,#2
DEL1:MOV R6,#0FFH ;(这里用的是FFH,和250差不多的这里精确度要求不高) DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET
;********************************
;延时20ms ;用来消除抖动用的
DELAY20MS:
MOV R7,#40
DEL11:MOV R6,#0FFH
DEL22:DJNZ R6,DEL22
DJNZ R7,DEL11
RET
;********************************
;键扫描子程序
KEYSCAN:
MOV P1,#0FFH ;给P1全高,如果此时有键按下的话下一瞬间对应的位会马上变0
MOV A,P1
CJNE A,#0FFH,K_NEXT1 ;如果A=FFH则表明没有键按下,退出子程序,有键按下的话跳转到K_NEXT1
RET
K_NEXT1:LCALL DELAY20MS ;延时20ms,用来消除抖动
MOV A,P1
CJNE A,#0FFH,K1 ;再次检测P1是否为FFH,若为FFH说明刚才的是干扰,退出子程序,如果实在有键按下则跳转K1
RET
K1:JB ACC.0,K2 ;下面是逐位检测看看到底是哪一个按键按下,然后执行对应的操作,这里是把要现实的内容放到
MOV R0,#01H ;R0里,ABCD键分别对应1234
RET
K2:JB ACC.1,K3
MOV R0,#02H
RET
K3:JB ACC.2,K4
MOV R0,#03H
RET
K4:JB ACC.3,KRET
MOV R0,#04H
RET
KRET:MOV R0,#00H
RET
;********************************
实验3扩展
ORG 0000H
SJMP MAIN
;*******************************************
ORG 0030H
MAIN: MOV SP,#70H ;主程序
;设置显示缓存区
MOV 30H,#0AH
MOV 31H,#0BH
MOV 32H,#0CH
MOV 33H,#0DH
;初始化8155
MOV DPTR,#0100H
MOV A,#03H
MOVX @DPTR,A
MOV 40H,#0
LOOP:MOV DPTR,#0102H ;关显示(控制字位) 为了使当没有键按下时数码管不亮MOV A,#0FFH
MOVX @DPTR,A
MOV DPTR,#0101H ;关显示(控制字形) 为了使当没有键按下时数码管不亮,其实这两个只取一个就可以了.
MOV A,#0H ;显示间隔标志
MOVX @DPTR,A
LCALL KEYSCAN ;键扫描
MOV R4,40H ;R4为字母变化的间隔
CJNE R4,#0,LOOP1 ;若间隔为0,则表示没有键按下,若不为0,则跳转LOOP1,进行对应间隔的显示
SJMP LOOP
LOOP1:LCALL DISPLAY ;调用显示
SJMP LOOP
;*********************************************
;显示子程序
DISPLAY:
MOV R0,#30H
MOV R3,#0FEH
MOV R4,40H ;显示间隔
LD0:MOV DPTR,#0102H ;送字位
MOV A,R3
MOVX @DPTR,A
NEXT:MOV DPTR,#DTAB ;查表,送字形
MOV A,@R0
MOVC A,@A+DPTR
MOV DPTR,#0101H
MOVX @DPTR,A
NEXT1:LCALL DELAY1 ;延时T=R4*250ms
DJNZ R4,NEXT1
MOV R4,40H
INC R0
CJNE R0,#34H,NEXT ;没有显示完ABCD的话继续显示,显示了跳出子程序
RET
;************************************************8
;字形表
DTAB:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH