📄 004.asm
字号:
/********************************************************************
*
* 程序功能 : 实现铵键的移位显示并在按下"A"键后个位闪烁功能
* 应用软件: KEIL C
*
********************************************************************/
;按键行列值表示如下:
;----P1.7---P1.6---P1.5---P1.4-------
;----0----1----2----3----P1.0
;----4----5----6----7----P1.1
;----8----9----A----B----P1.2
;----C----D----E----F----P1.3
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV DPTR,#TAB1 ;将表头位置送入DPT
MOV 30H,#00H ;将30显示单元清零
MOV 31H,#0FFH ;将31显示单元清零
MOV 32H,#0FFH ;将32显示单元清零
MOV 33H,#0FFH ;将33显示单元清零
MOV 35H,#00H ;将35显示单元清零
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.0 ;开个位显示单元
LCALL DELAY100US ;延时100US
SETB P2.0 ;关个位显示单
AJMP DD1C
DD1B:
MOV A,30H ;将显示缓冲区30H中的值送入ACC
MOVC A,@A+DPTR ;查表取要显示的数并把查表的结果送入ACC
MOV P0,A ;将要显示的数送入P0口
SETB P2.0 ;开个位显示单元
LCALL DELAY100US ;延时100US
SETB P2.0 ;开个位显示单元
DD1C:
MOV A,31H ;将显示缓冲区别31H中的值送入A
MOVC A,@A+DPTR ;查表取要显示的数并把查表的结果送入ACC
MOV P0,A ;将要显示的数送入P0口
CLR P2.1 ;开十位显示单元
LCALL DELAY100US ;延时100US
SETB P2.1 ;关十位显示单元
MOV A,32H ;将显示缓冲区32H中的值送入ACC
MOVC A,@A+DPTR ;查表取要显示的数并把查表的结果送入ACC
MOV P0,A ;将要显示的数送入P0口
CLR P2.2 ;开百位显示单元
LCALL DELAY100US ;延时100US
SETB P2.2 ;关百位显示单元
MOV A,33H ;将显示缓冲区33H中的值送入ACC
MOVC A,@A+DPTR ;查表取要显示的数并把查表的结果送入ACC
MOV P0,A ;将要显示的数送入P0口
CLR P2.3 ;开千位显示单元
LCALL DELAY100US ;延时100US
SETB P2.3 ;关千位显示单元
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 ;
MOV DPTR,#TAB ;将表头位置送入DPT
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
TAB1: DB 8CH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -