矩阵键盘控制程序汇总(汇编语言)
大小:0.16 MB 人气: 2017-09-06 需要积分:0
1、矩阵键盘控制数码管移位显示
;本程序按下矩阵键盘的按钮实现数码管的0123456789....移位显示,并在按下矩阵键盘的"P1.3*1.6"键后个位实现闪烁功能;按键行列值表示如下:
;----P1.7---P1.6---P1.5---P1.4-------
;----03H----02H----01H----00H----P1.0
;----07H----06H----05H----04H----P1.1
;----0BH----0AH----09H----08H----P1.2
;----0FH----0EH----0DH----0CH----P1.3
;///////////////////////////////////////////
?
org?0000h
ajmp?main
org?0030h
CLR P3.3
setb p2.4;
setb p2.5;
setb p2.6;
setb p2.7;
MOV P2,#0001111B
?
main:
?mov?dptr,#tab??????????????? ? ;将表头位置送入DPT
?mov?? 30h,#00h?????????????????? ? ;将30显示单元清零?
?mov?? 31h,#00h?????????????????? ? ;将30显示单元清零?
?mov?? 32h,#00h?????????????????? ? ;将30显示单元清零?
?mov?? 33h,#00h?????????????????? ? ;将30显示单元清零?
?mov?35h,#00h???????????????? ? ;将30显示单元清零???
loop:??????????????????????????????????? ?
?jb?f0,kk1?????????????????? ? ;f0若等于一则跳到KK1处
?mov?35h,#00h???????????????? ?
kk2:???????????????????????????????????? ?
?lcall display?????????? ? ;调用显示程序????????????????????
?lcall?key?????????? ? ;调用键盘描程序??????????????????
?cpl?a??????????????????????? ? ;将A的值取反?????????????????????
?jz??loop???????????? ? ;无键按下则返回????????????????
?mov?a,34h??????????????????? ? ;有键按下将键值送入ACC???????????
?cjne a,#0ah,norp???????????????? ? ;若A键未按下则返回到LOOP处???????
?setb?f0?????????????????????? ? ;若A键按下则将F0值1???
?ljmp loop??????????????????????? ? ;返回LOOP处不断的循环??
kk1:???????????????????????????????????? ?
?inc?35h????????????????????? ? ;将35H向上加一
?mov?a,35h??????????????????? ? ;将35H中的值送入ACC
?cjne?a,#10,kk2??????????????? ? ;ACC中的值与10相等则跳转至KK2
?mov?35h,#00h???????????????? ? ;若ACC等于零则将35H清零
?cpl?00h????????????????????? ? ;将00H位取反
?ajmp?kk2????????????????????? ? ;跳转至KK2处
???????????????????????????????????????? ?
norp:??????????????????????????????????? ?
?mov?33h,32h????????????????? ? ;将32H显示单元的内容送入33H??
?mov 32h,31h????????????????????? ? ;将31H显示单元的内容送入32H??
?mov 31h,30h????????????????????? ? ;将30H单元的内容送入31H??????
?mov?a,34h??????????????????? ? ;将键值送入ACC???????????????
?mov?30h,a??????????????????? ? ;将ACC的值送入30H????????????
?ljmp?loop???????????????????? ? ;返回主程序循环??????????????
display:
???mov? p2,#0ffh??????????? ;将P2口置高电平???????????????????????????
???mov r7,#100????????????? ;软件计数器赋值???????????????????????????
dd1:???????????????????????????????????????????????????????????????????????????????????????
???jnb?00h,dd1d???????? ;若00H等0跳至DD1D
???ajmp?dd1b???????????? ;若00H等于1则跳转至DD1B
dd1d:????????? mov a,30h??????????????? ;将显示缓冲区30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC?????
???mov p0,a???????????????? ;将要显示的数送入P0口??????????????????????
???clr p2.3???????????????? ;开个位显示单元????????????????????????????
???lcall delay100us???????? ;延时100US?????????????????????????????????
???setb p2.3??????????????? ;关个位显示单??????????????????????????????
???ajmp?dd1c????????????????????????????????????????????????????????
dd1b:????????????????????????????????????????????????
???mov a,30h??????????????? ;将显示缓冲区30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC?????
???mov p0,a???????????????? ;将要显示的数送入P0口??????????????????????
???setb p2.3??????????????? ;开个位显示单元????????????????????????????
???lcall delay100us???????? ;延时100US?????????????????????????????????
???setb p2.3??????????????? ;开个位显示单元???????????????????????????
dd1c:??????????????????????????????????????????????????????????????????????????????????????
???mov a,31h??????????????? ;将显示缓冲区别31H中的值送入A?????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC????
???mov p0,a???????????????? ;将要显示的数送入P0口?????????????????????
???clr p2.2???????????????? ;开十位显示单元???????????????????????????
???lcall delay100us???????? ;延时100US????????????????????????????????
???setb p2.2??????????????? ;关十位显示单元???????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????
???mov a,32h??????????????? ;将显示缓冲区32H中的值送入ACC????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC???
???mov p0,a???????????????? ;将要显示的数送入P0口????????????????????
???clr p2.1???????????????? ;开百位显示单元??????????????????????????
???lcall delay100us???????? ;延时100US???????????????????????????????
???setb p2.1??????????????? ;关百位显示单元?????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????
???mov a,33h??????????????? ;将显示缓冲区33H中的值送入ACC??????????????????????????????????????????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC?
???mov p0,a???????????????? ;将要显示的数送入P0口??????????????????
???clr p2.0???????????????? ;开千位显示单元????????????????????????
???lcall delay100us???????? ;延时100US?????????????????????????????
???setb p2.0??????????????? ;关千位显示单元????????????????????????
???djnz r7,dd1????????????? ;R7不等于0返回至DD1处??????????????????
???ret????????????????????? ;R7等于0子程序返回?????????????????????
?
KEY: ?LCALL KS??????????? ;调用检测按键子程序???????????????????????????
???? ?JNZ K1?????????????????????????????????? ;有键按下继续????????????????????????????
?ljmp?key_exit???????????????????????? ;无键按下退出KEY子程序???????????????????
K1:? LCALL delay4ms????????????????????????????? ;返回继续检测有无按键按下????????????????
???? LCALL delay4ms???????????????????????????????????????????????????????????????????????
???? LCALL KS??????????????????????????????????? ;有键按下继续延时去抖动??????????????????
???? JNZ K2????????????????????????????????????? ;再一次调用检测按键程序??????????????????
?ljmp?key_exit???????????????????????? ;无键按下退出KEY子程序???????????????????
K2:?MOV R2,#0EFH???????????????????????????? ;将扫描值送入 R2暂存?????????????????????
???? ?MOV R4,#00H????????????????????????????? ;将第一列的列值00H送入R4暂存,R4用于存放列
K3:?MOV P1,R2??????????????????????????????? ;将R2的值送入P1口????????????????????????
L6:?JB P1.0,L1?????????????????????????????? ;P1.0等于1跳转到L1???????????????????????
???? ?MOV A,#00H?????????????????????????????? ;将第一行的行值00H送入ACC????????????????
???? ?AJMP LK????????????????????????????????? ;跳转到键值处理程序??????????????????????
L1:?JB P1.1,L2?????????????????????????????? ;P1.1等于1跳转到L2???????????????????????
???? MOV A,#04H????????????????????????????????? ;将第二行的行值04H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳转到键值理程序进行键值处理????????????
L2: JB P1.2,L3?????????????????????????????????? ;P1.2等于1跳转到L3???????????????????????
???? MOV A,#08H????????????????????????????????? ;将第三行的行值08H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳转到键值处理程序??????????????????????
L3:?JB P1.3,NEXT???????????????????????????? ;P1.3等于1跳转到NEXT处???????????????????
???? MOV A,#0cH????????????????????????????????? ;将第四行的行值0CH送入ACC???????????????????
LK:?ADD A,R4???????????????????????????????? ;行值与列值相加后的键值送入A?????????????
??mov?34h,a??????????????????? ;将A中的值送入34h暂存????????????????????
K4:?;LCALL delay4ms????????????????????????? ;????????????????????????????????????????
??lcall display??????????????????? ;调用动态显示子程序??????????????????????
???? LCALL KS??????????????????????????????????? ;????????????????????????????????????????
???? JNZ K4????????????????????????????????????? ;按键没有松开继续返回检测????????????????
???? RET???????????????????????????????????????? ;按键松开返回????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
NEXT:?????????????????????????????????????????????????????????????????????????????????????
??? INC? R4????????????????????????????????????? ;将列值加一??????????????????????????????
??? MOV A,R2???????????????????????????????????? ;将R2的值送入A???????????????????????????
??? JNB ACC.7,key_exit?????????????????????????? ;扫描完成跳至KEY处进行下一回合的扫描?????
??? RL A???????????????????????????????????????? ;扫描未完成将A中的值右移一位进行下一列的扫描??
??? MOV R2,A???????????????????????????????????? ;将ACC的值送入R2暂存?????????????????????
??? AJMP K3????????????????????????????????????? ;跳转到K3继续????????????????????????????
key_exit:?????????????????????????????????????????????????????????????????????????????????
??mov a,#0ffh????????????????????? ;无键按下则将A赋成0FFH。?????????????????
??ret???????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
KS:?MOV P1,#0FH????????????????????????????? ;将P1口高四位置0低四位值1????????????????
???? MOV A,P1??????????????????????????????????? ;读P1口??????????????????????????????????
???? XRL A,#0FH????????????????????????????????? ;将A中的值与A中的值相异或????????????????
???? RET???????????????????????????????????????? ;子程序返回??????????????????????????????
delay4ms:???????????? ;4ms延时
????? MOV R5,#08H
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
delay100us:????????????????????????????????????? ;100us延时
???mov r5,#50
???djnz?r5,$
???ret
tab:?db?0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end
?
??
?
?
?
?
?
2、矩阵键盘控制数码管移位显示
;本程序按下矩阵键盘的按钮实现数码管的0123456789....移位显示,并在按下矩阵键盘的"P1.3*1.6"键后个位实现闪烁功能;按键行列值表示如下:
;----P1.7---P1.6---P1.5---P1.4-------
;----03H----02H----01H----00H----P1.0
;----07H----06H----05H----04H----P1.1
;----0BH----0AH----09H----08H----P1.2
;----0FH----0EH----0DH----0CH----P1.3
;///////////////////////////////////////////
?
org?0000h
ajmp?main
org?0030h
CLR P3.3
setb p2.4;
setb p2.5;
setb p2.6;
setb p2.7;
MOV P2,#0001111B
?
main:
?mov?dptr,#tab??????????????? ? ;将表头位置送入DPT
?mov?? 30h,#00h?????????????????? ? ;将30显示单元清零?
?mov?? 31h,#00h?????????????????? ? ;将30显示单元清零?
?mov?? 32h,#00h?????????????????? ? ;将30显示单元清零?
?mov?? 33h,#00h?????????????????? ? ;将30显示单元清零?
?mov?35h,#00h???????????????? ? ;将30显示单元清零???
loop:??????????????????????????????????? ?
?jb?f0,kk1?????????????????? ? ;f0若等于一则跳到KK1处
?mov?35h,#00h???????????????? ?
kk2:???????????????????????????????????? ?
?lcall display?????????? ? ;调用显示程序????????????????????
?lcall?key?????????? ? ;调用键盘描程序??????????????????
?cpl?a??????????????????????? ? ;将A的值取反?????????????????????
?jz??loop???????????? ? ;无键按下则返回????????????????
?mov?a,34h??????????????????? ? ;有键按下将键值送入ACC???????????
?cjne a,#0ah,norp???????????????? ? ;若A键未按下则返回到LOOP处???????
?setb?f0?????????????????????? ? ;若A键按下则将F0值1???
?ljmp loop??????????????????????? ? ;返回LOOP处不断的循环??
kk1:???????????????????????????????????? ?
?inc?35h????????????????????? ? ;将35H向上加一
?mov?a,35h??????????????????? ? ;将35H中的值送入ACC
?cjne?a,#10,kk2??????????????? ? ;ACC中的值与10相等则跳转至KK2
?mov?35h,#00h???????????????? ? ;若ACC等于零则将35H清零
?cpl?00h????????????????????? ? ;将00H位取反
?ajmp?kk2????????????????????? ? ;跳转至KK2处
???????????????????????????????????????? ?
norp:??????????????????????????????????? ?
?mov?33h,32h????????????????? ? ;将32H显示单元的内容送入33H??
?mov 32h,31h????????????????????? ? ;将31H显示单元的内容送入32H??
?mov 31h,30h????????????????????? ? ;将30H单元的内容送入31H??????
?mov?a,34h??????????????????? ? ;将键值送入ACC???????????????
?mov?30h,a??????????????????? ? ;将ACC的值送入30H????????????
?ljmp?loop???????????????????? ? ;返回主程序循环??????????????
display:
???mov? p2,#0ffh??????????? ;将P2口置高电平???????????????????????????
???mov r7,#100????????????? ;软件计数器赋值???????????????????????????
dd1:???????????????????????????????????????????????????????????????????????????????????????
???jnb?00h,dd1d???????? ;若00H等0跳至DD1D
???ajmp?dd1b???????????? ;若00H等于1则跳转至DD1B
dd1d:????????? mov a,30h??????????????? ;将显示缓冲区30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC?????
???mov p0,a???????????????? ;将要显示的数送入P0口??????????????????????
???clr p2.3???????????????? ;开个位显示单元????????????????????????????
???lcall delay100us???????? ;延时100US?????????????????????????????????
???setb p2.3??????????????? ;关个位显示单??????????????????????????????
???ajmp?dd1c????????????????????????????????????????????????????????
dd1b:????????????????????????????????????????????????
???mov a,30h??????????????? ;将显示缓冲区30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC?????
???mov p0,a???????????????? ;将要显示的数送入P0口??????????????????????
???setb p2.3??????????????? ;开个位显示单元????????????????????????????
???lcall delay100us???????? ;延时100US?????????????????????????????????
???setb p2.3??????????????? ;开个位显示单元???????????????????????????
dd1c:??????????????????????????????????????????????????????????????????????????????????????
???mov a,31h??????????????? ;将显示缓冲区别31H中的值送入A?????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC????
???mov p0,a???????????????? ;将要显示的数送入P0口?????????????????????
???clr p2.2???????????????? ;开十位显示单元???????????????????????????
???lcall delay100us???????? ;延时100US????????????????????????????????
???setb p2.2??????????????? ;关十位显示单元???????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????
???mov a,32h??????????????? ;将显示缓冲区32H中的值送入ACC????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC???
???mov p0,a???????????????? ;将要显示的数送入P0口????????????????????
???clr p2.1???????????????? ;开百位显示单元??????????????????????????
???lcall delay100us???????? ;延时100US???????????????????????????????
???setb p2.1??????????????? ;关百位显示单元?????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????
???mov a,33h??????????????? ;将显示缓冲区33H中的值送入ACC??????????????????????????????????????????????????
???movc a,@a+dptr?????????? ;查表取要显示的数并把查表的结果送入ACC?
???mov p0,a???????????????? ;将要显示的数送入P0口??????????????????
???clr p2.0???????????????? ;开千位显示单元????????????????????????
???lcall delay100us???????? ;延时100US?????????????????????????????
???setb p2.0??????????????? ;关千位显示单元????????????????????????
???djnz r7,dd1????????????? ;R7不等于0返回至DD1处??????????????????
???ret????????????????????? ;R7等于0子程序返回?????????????????????
?
KEY: ?LCALL KS??????????? ;调用检测按键子程序???????????????????????????
???? ?JNZ K1?????????????????????????????????? ;有键按下继续????????????????????????????
?ljmp?key_exit???????????????????????? ;无键按下退出KEY子程序???????????????????
K1:? LCALL delay4ms????????????????????????????? ;返回继续检测有无按键按下????????????????
???? LCALL delay4ms???????????????????????????????????????????????????????????????????????
???? LCALL KS??????????????????????????????????? ;有键按下继续延时去抖动??????????????????
???? JNZ K2????????????????????????????????????? ;再一次调用检测按键程序??????????????????
?ljmp?key_exit???????????????????????? ;无键按下退出KEY子程序???????????????????
K2:?MOV R2,#0EFH???????????????????????????? ;将扫描值送入 R2暂存?????????????????????
???? ?MOV R4,#00H????????????????????????????? ;将第一列的列值00H送入R4暂存,R4用于存放列
K3:?MOV P1,R2??????????????????????????????? ;将R2的值送入P1口????????????????????????
L6:?JB P1.0,L1?????????????????????????????? ;P1.0等于1跳转到L1???????????????????????
???? ?MOV A,#00H?????????????????????????????? ;将第一行的行值00H送入ACC????????????????
???? ?AJMP LK????????????????????????????????? ;跳转到键值处理程序??????????????????????
L1:?JB P1.1,L2?????????????????????????????? ;P1.1等于1跳转到L2???????????????????????
???? MOV A,#04H????????????????????????????????? ;将第二行的行值04H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳转到键值理程序进行键值处理????????????
L2: JB P1.2,L3?????????????????????????????????? ;P1.2等于1跳转到L3???????????????????????
???? MOV A,#08H????????????????????????????????? ;将第三行的行值08H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳转到键值处理程序??????????????????????
L3:?JB P1.3,NEXT???????????????????????????? ;P1.3等于1跳转到NEXT处???????????????????
???? MOV A,#0cH????????????????????????????????? ;将第四行的行值0CH送入ACC???????????????????
LK:?ADD A,R4???????????????????????????????? ;行值与列值相加后的键值送入A?????????????
??mov?34h,a??????????????????? ;将A中的值送入34h暂存????????????????????
K4:?;LCALL delay4ms????????????????????????? ;????????????????????????????????????????
??lcall display??????????????????? ;调用动态显示子程序??????????????????????
???? LCALL KS??????????????????????????????????? ;????????????????????????????????????????
???? JNZ K4????????????????????????????????????? ;按键没有松开继续返回检测????????????????
???? RET???????????????????????????????????????? ;按键松开返回????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
NEXT:?????????????????????????????????????????????????????????????????????????????????????
??? INC? R4????????????????????????????????????? ;将列值加一??????????????????????????????
??? MOV A,R2???????????????????????????????????? ;将R2的值送入A???????????????????????????
??? JNB ACC.7,key_exit?????????????????????????? ;扫描完成跳至KEY处进行下一回合的扫描?????
??? RL A???????????????????????????????????????? ;扫描未完成将A中的值右移一位进行下一列的扫描??
??? MOV R2,A???????????????????????????????????? ;将ACC的值送入R2暂存?????????????????????
??? AJMP K3????????????????????????????????????? ;跳转到K3继续????????????????????????????
key_exit:?????????????????????????????????????????????????????????????????????????????????
??mov a,#0ffh????????????????????? ;无键按下则将A赋成0FFH。?????????????????
??ret???????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
KS:?MOV P1,#0FH????????????????????????????? ;将P1口高四位置0低四位值1????????????????
???? MOV A,P1??????????????????????????????????? ;读P1口??????????????????????????????????
???? XRL A,#0FH????????????????????????????????? ;将A中的值与A中的值相异或????????????????
???? RET???????????????????????????????????????? ;子程序返回??????????????????????????????
delay4ms:???????????? ;4ms延时
????? MOV R5,#08H
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
delay100us:????????????????????????????????????? ;100us延时
???mov r5,#50
???djnz?r5,$
???ret
tab:?db?0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end
?
?
?
?
?
?
?
?
?
?
3、矩阵键盘按钮=液晶1602流动显示预定字符
;按压矩阵键盘按钮=液晶1602显示预定字符;按键行列值表示如下:?????????????????????
;----P1.7---P1.6---P1.5---P1.4-------?????
;----03H----02H----01H----00H----P1.0?????
;----07H----06H----05H----04H----P1.1?????
;----0BH----0AH----09H----08H----P1.2????
;----0FH----0EH----0DH----0CH----P1.3??
;///////////////////////////////////////////???????
RS EQU P2.0 ????;决定要传送的是命令还是数据???
RW EQU P2.1???????????????? ;决定要读还是写,一般写的时候多.?????
E? EQU P2.2???????????????? ;时钟信号???????????????????????????
SJ EQU P0?????????????????? ;数据线?????????????????????????????
org?00h
ajmp main
org 030h????????????
main:
mov sp,#60h????
main1:???????????
lcall delay????????????????????????????? ;延时一段时间??????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令38H?????????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令38H?????????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令38H?????????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令38H?????????????????????
MOV SJ,#08H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令08H?????????????????????
MOV SJ,#01H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令01H????????????????????
MOV SJ,#06H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令06H?????????????????????
MOV SJ,#0cH????????????????????????? ;
ACALL ENABLE???????????????????????????? ;写指令0CH????????????????????
?mov?dptr,#table????????????? ;将表头地址送入DPTR
?lcall?key????????????????????? ;调用键盘描程序
?mov?b,#02h?????????????????? ;将立即数送入寄存器B
?mul?ab?????????????????????? ;将键值与B中的数相乘
?mov?30h,a??????????????????? ;将相乘后的结果送入30H暂存
?movc?a,@a+dptr??????????????? ;查表并将所查得结果送入ACC中
?mov??31h,a??????????? ;将ACC中的数送入31H
?mov??a,30h??????????? ;送30H中的数至ACC
?inc??a??????????????? ;将ACC中的值加一
?movc?a,@a+dptr??????????????? ;查表并所查到的低半字节送入ACC中
?mov??dpl,a??????????? ;将ACC中的值送入数据指针的低8位?
mov ?dph,31h????????????????????????? ;将ACC中的值送入数据指针的高8位
?
MOV SJ,#80H;wei zhi????????????????????? ;第一行位置???????????
ACALL ENABLE???????????????????????????? ;调用写时序
call write1????????????????????????????? ;调用写子程序
jmp main1??????????????????????????????? ;返回主程序循环
ENABLE:?????;写指令时序子程序????
CLR RS
CLR RW?
CLR E?
ACALL DELAY?
SETB E?
RET
write1:?????;写字符串 子程序?
mov r1,#00h??????????????????????????????
a1:mov a,r1????????????????????????
movc a,@a+dptr?????????????????????
call write2????????????????????????
inc r1?????????????????????????????
cjne r1,#10h,a1????????????????????
ret????????????????????????????????
???????????????????????????????????
write2:????????????????????????????????? ;写单个字符子程序????????????
mov SJ,a????????????????
setb rs????????????????????????????
clr rw
clr e
call delay
setb e
ret
delay:??????????????????????????????? ;130ms延时子程序
mov r7,#255
d1:mov r6,#255
d2:djnz r6,d2
djnz r7,d1
ret
KEY: LCALL KS?????????????????????????? ;调用检测按键子程序????????????????????????????????????????????
???? JNZ K1???????????????????????????? ;有键按下继续?????????????????????????????????????
???? LCALL DELAY2?????????????????????? ;无键按下调用延时去抖动程序???????????????????????
???? AJMP KEY?????????????????????????? ;返回继续检测有无按键按下?????????????????????????
K1:? LCALL DELAY2?????????????????????????????????????????????????????????????????????????
???? LCALL DELAY2?????????????????????? ;有键按下继续延时去抖动???????????????????????????
???? LCALL KS?????????????????????????? ;再一次调用检测按键程序???????????????????????????
???? JNZ K2???????????????????????????? ;确认有按下进行下一步?????????????????????????????
???? AJMP KEY?????????????????????????? ;无键按下返回继续检测?????????????????????????????
K2:?MOV R2,#0EFH??????????????????? ;将扫描值送入 R2暂存??????????????????????????????
???? MOV R4,#00H??????????????????????? ;将第一列的列值00H送入R4暂存,R4用于存放列值。?????
K3:?MOV P1,R2?????????????????????? ;将R2的值送入P1口?????????????????????????????????
L6:?JB P1.0,L1????????????????????? ;P1.0等于1跳转到L1????????????????????????????????
???? MOV A,#00H???????????????????????? ;将第一行的行值00H送入ACC?????????????????????????
???? AJMP LK??????????????????????????? ;跳转到键值处理程序???????????????????????????????
L1:?JB P1.1,L2????????????????????? ;P1.1等于1跳转到L2????????????????????????????????
???? MOV A,#04H???????????????????????? ;将第二行的行值送入ACC????????????????????????????
???? AJMP LK??????????????????????????? ;跳转到键值理程序进行键值处理?????????????????????
L2: JB P1.2,L3????????????????????????? ;P1.2等于1跳转到L3????????????????????????????????
???? MOV A,#08H???????????????????????? ;将第三行的行值送入ACC????????????????????????????
???? AJMP LK??????????????????????????? ;跳转到键值处理程序???????????????????????????????
L3:?JB P1.3,NEXT??????????????????? ;P1.3等于1跳转到NEXT处????????????????????????????
???? MOV A,#0cH???????????????????????? ;将第四行的行值送入ACC????????????????????????????
LK:?ADD A,R4??????????????????????? ;行值与列值相加后的键值送入A??????????????????????
???? PUSH ACC?????????????????????????? ;将A中的值送入堆栈暂存????????????????????????????
K4:?LCALL DELAY2??????????????????? ;调用延时去抖动程序???????????????????????????????
???? LCALL KS?????????????????????????? ;调用按键检测程序?????????????????????????????????
???? JNZ K4???????????????????????????? ;按键没有松开继续返回检测?????????????????????????
???? POP ACC??????????????????????????? ;将堆栈的值送入ACC????????????????????????????????
???? RET??????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
NEXT:?????????????????????????????????????????????????????????????????????????????????????
??? INC? R4???????????????????????????? ;将列值加一???????????????????????????????????????
??? MOV A,R2??????????????????????????? ;将R2的值送入A????????????????????????????????????
??? JNB ACC.7,KEY?????????????????????? ;扫描完成跳至KEY处进行下一回合的扫描??????????????
??? RL A??????????????????????????????? ;扫描未完成将A中的值右移一位进行下一列的扫描??????
??? MOV R2,A??????????????????????????? ;将ACC的值送入R2暂存??????????????????????????????
??? AJMP K3???????????????????????????? ;跳转到K3继续?????????????????????????????????????
KS:?MOV P1,#0FH???????????????????? ;将P1口高四位置0低四位值1?????????????????????????
???? MOV A,P1?????????????????????????? ;读P1口???????????????????????????????????????????
???? XRL A,#0FH???????????????????????? ;将A中的值与A中的值相异或?????????????????????????
???? RET??????????????????????????????? ;子程序返回???????????????????????????????????????
DELAY2:???????????????????????????????? ;40ms延时去抖动子程序8*FA*2=40ms??????????????????
????? MOV R5,#08H?????????????????????????????????????????????????????????????????????????
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
table:?dw?table0,table1,table2,table3,table4,table5,table6,table7,table8??????
?dw?table9,table10,table11,table12,table13,table14,table15
table0: db "? 0451-82314775 "? ;矩阵键盘P1.0*1.4
table1: db "? www.pp51.com? "? ;矩阵键盘P1.0*1.5
table2: db "pp51com@163.com "? ;矩阵键盘P1.0*1.6
table3: db "pp51com@tom.com "? ;矩阵键盘P1.0*1.7
table4: db "the 4th key???? "? ;矩阵键盘P1.1*1.4
table5: db "the 5th key???? "? ;矩阵键盘P1.1*1.5
table6: db "the 6th key???? "? ;矩阵键盘P1.1*1.6
table7: db "the 7th key???? "? ;矩阵键盘P1.1*1.7
table8: db "the 8th key???? "? ;矩阵键盘P1.2*1.4
table9: db "the 9th key???? "? ;矩阵键盘P1.2*1.5
table10: db "the 10th key??? " ;矩阵键盘P1.2*1.6
table11: db "the 11th key??? " ;矩阵键盘P1.2*1.7
table12: db "the 12th key??? " ;矩阵键盘P1.3*1.4
table13: db "the 13th key??? " ;矩阵键盘P1.3*1.5
table14: db "the 14th key??? " ;矩阵键盘P1.3*1.6
table15: db "the 15th key??? " ;矩阵键盘P1.3*1.7
end
?
4、矩阵键盘数码管显示键值
? ? ? ? ? ?RELAY? EQU? P1.3?????????? BEEP?? EQU? P3.7
;------------------------------------------------------
?????????? ORG? 0000H
?????????? JMP? MAIN
;------------------------------------------------------
MAIN:????? MOV? SP,#60H
?????????? MOV? 30H,#00H??????????
LOOP1:
?????????? CALL? KEY_IN
?????????? CALL? KEY_PLAER
?????????? JMP? LOOP1
;-----------------------------------------------------
KEY_IN:??? MOV? P1,#0F0H????????? ;置列线为0,行线为1
?????????? MOV? A,P1
?????????? ANL? A,#0F0H
?????????? MOV? B,A
?????????? MOV? P1,#0FH?????????? ;置列线为1,行线为0
?????????? MOV? A,P1
?????????? ANL? A,#0FH
?????????? ORL? A,B?????????????? ;高四位与低四位重新组合
?????????? CJNE? A,#0FFH,KEY_IN1? ;0FFH为末按键
?????????? RET
KEY_IN1:?? MOV? B,A
?????????? MOV? DPTR,#KEYTABLE
?????????? MOV? R3,#0FFH?????????? ;
KEY_IN2:?? INC? R3
?????????? MOV? A,R3
?????????? MOVC? A,@A+DPTR
?????????? CJNE? A,B,KEY_IN3
?????????? MOV? A,R3???????????? ;找到,取顺序码????????????
?????????? MOV? 30H,A
?????????? CALL? BEEP_BL
?????????? RET
KEY_IN3:?? CJNE? A,#0FFH,KEY_IN2? ;末完,继续查
?????????? RET??????????????????? ;0FFH为结束码
;----------------------------------------------
;蜂鸣器响一声子程序
;----------------------------------------------
BEEP_BL:
?????????? MOV? R6,#100
? BL1:???? CALL? DEX1
?????????? CPL? BEEP
?????????? DJNZ? R6,BL1
?????????? MOV? R5,#25
?????????? CALL? DELAY
?????????? RET
?DEX1:???? MOV? R7,#180
?DEX2:???? NOP
?????????? DJNZ? R7,DEX2
?????????? RET
DELAY:??????????????????? ;延时R5×10MS
?????????? MOV? R6,#50
DELAY1:??? MOV? R7,#100
?????????? DJNZ? R7,$
?????????? DJNZ? R6,DELAY1
?????????? DJNZ? R5,DELAY
?????????? RET
;-----------------------------------------------------
KEYTABLE:
??? DB? 0EEH,0EDH,0EBH,0E7H,0DEH? ;0,1,2,3,4,? 顺序码
??? DB? 0DDH,0DBH,0D7H,0BEH,0BDH? ;5,6,7,8,9,
??? DB? 0BBH,0B7H,07EH,07DH,07BH? ;A,B,C,D,E,
??? DB? 077H,0FFH???????????????? ;F????? 0FF为结束码
;-----------------------------------------------------
;键值显示子程序
;使用一个数码管显示
;-----------------------------------------------------
KEY_PLAER:
????????????
???????????? MOV? A,30H
???????????? MOV? DPTR,#TAB????? ;取段码表地址
???????????? MOVC? A,@A+DPTR???? ;查显示数据对应段码
???????????? MOV? P0,A?????????? ;段码放入P0口
???????????? CLR? P2.7?????????? ;第一个数码管亮
???????????? RET???????????????
;-----------------------------------------------------
TAB:
?DB? 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
?DB? 80H,90H,88h,83h,0c6h,0a1h,86h,8eh
;-----------------------------------------------------
??? END
?
5、矩阵键盘声音提示数码管输出
;本程序按下矩阵键盘的按钮实现数码管的0 1 2 3 4 5 6 7 8 9 A B C D E F,同时喇叭输出声音提示;///////////////////////////////////////////
?org 0000h
?ajmp?main
?org?000bh
?ajmp?timer0
?org 0030h
main:
?mov?30h,#100
?mov tmod,#01h
?mov ie,#82h
?mov th0,#high(64536)
?mov tl0,#low(64536)
?mov?dptr,#tab
?lcall?key
?movc?a,@a+dptr
?mov?p0,a
?CLR P2.0
?ljmp?main
timer0:???;1ms timer
?mov th0,#high(64536)
?mov tl0,#low(64536)
?cpl?p3.7
?djnz?30h,t_e
?mov?30h,#100
?clr?tr0
t_e:?reti
??
KEY: LCALL KS
???? JNZ K1
???? LCALL DELAY2
???? AJMP KEY
K1:? LCALL DELAY2
???? LCALL DELAY2
???? LCALL KS
???? JNZ K2
???? AJMP KEY
K2:? setb?tr0
?MOV R2,#0EFH
???? MOV R4,#00H
K3:?MOV P1,R2
L6:?JB P1.0,L1?
???? MOV A,#00H
???? AJMP LK
L1:?JB P1.1,L2
???? MOV A,#04H
???? AJMP LK
L2: JB P1.2,L3??????????????
???? MOV A,#08H
???? AJMP LK
L3:?JB P1.3,NEXT
???? MOV A,#0cH
LK:?ADD A,R4
???? PUSH ACC
K4:?LCALL DELAY2
???? LCALL KS
???? JNZ K4
???? POP ACC
?????
???? RET
?????
NEXT:
??? INC? R4
??? MOV A,R2
??? JNB ACC.7,KEY
??? RL A
??? MOV R2,A
??? AJMP K3
KS:?MOV P1,#0FH
???? MOV A,P1
???? XRL A,#0FH
???? RET
DELAY2:
????? MOV R5,#08H
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
tab:?db?0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end
?
6、最简单的键盘控制
;当按压键盘P1.4,P1.5,P1.6,P1.7的时候会看到P2口作出的反映,此为平凡经典入门教程范例之一main:mov p1,#0ffh? ;把11111111(FF)移动到P1口,使P1的8个口在没有键盘置低的情况下输出高电
loop:mov a,p1? ;把P1的值移动到寄存器A
mov p2,a? ;把寄存器A的值移动到P2,就此完成在了P1输入状态控制P2输出状态的最简过程
ljmp loop? ;这是个重要的命令,否则上面的语句将失去作用,详解请参看平凡单片机入门教程
END
?
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%
下载地址
矩阵键盘控制程序汇总(汇编语言)下载
相关电子资料下载
- 火遍童年的FC游戏是使用什么语言编写的 330
- 汇编语言中常见的两个指令 167
- 汇编语言的产生 汇编语言的组成 233
- 汇编语言之内存访问(寄存器) 242
- 2种扩展plc输入点数的方法有哪些 216
- 扩展模块之矩阵键盘 215
- 为什么要反汇编?反汇编文件的生成和解读 500
- Linux内核调试:指令追踪大法简析 360
- 基于FPGA的4x4矩阵键盘驱动设计 546
- 在Proteus软件中如何读取矩阵键盘? 994