📄 mcu51.asm
字号:
KM EQU 00H ; 设定标志位 ”0“是锁键盘”1“解锁
DERECT EQU 01H ;0时左移动,1时候右移
KP EQU 02H ; 设定标志位 "0"是长按,“1”是短按
ORG 0000H
LJMP MAIN
ORG 000BH;开中断
LJMP PTT0
MAIN:MOV R2,#5
DL21:MOV R4,#200
DL41:MOV R5,#200
DL51:DJNZ R5,DL51
DJNZ R4,DL41
DJNZ R2,DL21
MOV DPTR ,#7F00H
MOV A ,#03H
MOVX @DPTR ,A ;8155初始化
MOV 76H,#00H ;4
MOV 77H,#00H ;3
MOV 78H,#00H ;2
MOV 79H,#00H ;低位显示缓冲区
MOV 40H,#12H
MOV 41H,#00H
MOV 42H,#13H
MOV 43H,#0EH
MOV 44H,#11H
MOV 45H,#14H
MOV 46H,#00H
MOV 47H,#13H
MOV 48H,#11H
MOV 49H,#15H
MOV 4AH,#01H
MOV 4BH,#01H
MOV 4CH,#00H
MOV 4DH,#03H
MOV 4EH,#00H
MOV 4FH,#00H
MOV 50H,#05H
MOV 51H,#03H
MOV 52H,#01H
MOV 53H,#11H
MOV 54H,#11H
MOV 55H,#11H ; 键值保存区
MOV R2 ,#05H ; 显示次数
SETB KM ;清设定标志位
MOV TMOD,#01H ;中断初始化
MOV TH0,#3CH
MOV TL0,#0B0H
SETB ET0
SETB EA
MOV 60H,#50
RD:
LCALL RDKEY
SUBB A,#0AH ;
JNB KP ,LONG ;判断是否长按键
JNC GN ;判断是否为功能键
JNB KM ,RD ;判断是否在设定状态
MOV 76H,77H
MOV 77H,78H
MOV 78H,79H
MOV 79H,30H
SJMP RD
GN :
MOV DPTR,#TAB1;GAI
MOV A, 30H
SUBB A ,#0AH
MOV B, #03H
MUL AB
JMP @A+DPTR
PKA : LCALL FUN_A
LJMP RD
PKB :LCALL FUN_B
LJMP RD
PKC :LCALL FUN_C
LJMP RD
PKD : LCALL FUN_D
LJMP RD ;设定键
PKE :
MOV 76H,#11H
MOV 77H,#11H
MOV 78H,#11H
MOV 79H,#11H
SJMP RD ;清零
PKF : CPL KM
JNB KM,PKF_LOP
MOV 76H,#10H
MOV 77H,#10H
MOV 78H,#10H
MOV 79H,#10H
PKF_LOP: SJMP RD ; 开解锁
LONG : SETB KP
MOV DPTR,#TAB2
MOV A, 30H
SUBB A ,#0AH
MOV B, #03H
MUL AB
JMP @A+DPTR
PKA_L : LCALL FUN_B
LJMP RD
PKB_L :LCALL FUN_A
LJMP RD
PKC_L :LCALL FUN_D
LJMP RD
PKD_L: LCALL FUN_C
LJMP RD ;设定键
FUN_A:
MOV 76H,#11H
MOV 77H,#11H
MOV 78H,#11H
MOV 79H,#11H
MOV R1,#40H
LOP_A:
JB DERECT,LOP_B
MOV 76H,77H
MOV 77H,78H
MOV 78H,79H
MOV A,@R1
MOV 79H,A
LCALL DL500MS
INC R1
LCALL KS
JNZ OUT_A
CJNE R1,#56H,LOP_A
MOV R1,#40H
JMP FUN_A
OUT_A:RET
FUN_B: CPL DERECT
JNB DERECT,LOP_A
DEC R1
DEC R1
DEC R1
LOP_B:MOV 79H,78H
MOV 78H,77H
MOV 77H,76H
MOV A,@R1
MOV 76H,A
LCALL DL500MS
DEC R1
LCALL KS
JNZ OUT_A
CJNE R1,#39H,LOP_B
MOV R1,#55H
JMP LOP_B
RET
RDKEY: LCALL DIS
LCALL KS ;有键闭合否
JZ RDKEY
LCALL DIS ;调用延时去抖动
LCALL KS
JZ RDKEY ; 键是否还闭合
MOV R3 ,#0F7H ;开始查键
MOV R4 ,#00H
KEY1: MOV DPTR ,#7F01H
MOV A ,R3
MOVX @DPTR,A
INC DPTR
INC DPTR
MOVX A ,@DPTR
JB ACC.0,ONE
MOV A ,#00H
SJMP PADD
ONE: JB ACC.1,TWO
MOV A,#04H
SJMP PADD
TWO: JB ACC.2,THR
MOV A ,#08H
SJMP PADD
THR: JB ACC.3,NEXT
MOV A ,#0CH
PADD: ADD A,R4
PUSH ACC
SETB TR0
KEY2: LCALL DIS
LCALL KS
JNZ KEY2
CLR TR0
MOV 60H,#50
MOV TH0,#3CH
MOV TL0,#0B0H
POP ACC
MOV 30H ,A
RET
NEXT: INC R4
MOV A,R3
RR A
MOV R3,A
JB ACC.7,KEY1
SJMP RDKEY
DIS: MOV R0,#79H
MOV R5,#0F7H
DIS1: MOV A,@R0
MOV DPTR ,#TAB
MOVC A,@A+DPTR
MOV DPTR ,#7F02H
MOVX @DPTR,A
DEC DPL
MOV A,R5
MOVX @DPTR,A
RR A
MOV R5,A
DEC R0
LCALL DLY1MS
JB ACC.7,DIS1
CLR A
MOV DPTR ,#7F02H
MOVX @DPTR,A
RET
DLY1MS: MOV R6,#10
DLY2: MOV R7,#100
DLY1:DJNZ R7 ,DLY1
DJNZ R6 ,DLY2
RET
KS:MOV A,#00H
MOV DPTR,#7F01H
MOVX @DPTR,A
INC DPTR
INC DPTR
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
DL500MS:MOV R2,#50
LOP_DL:LCALL DIS
DJNZ R2,LOP_DL
RET
FUN_C: INC 79H
MOV A,79H
SUBB A,#0AH
JC OUT_C
MOV 79H,A
INC 78H
MOV A,78H
SUBB A,#0AH
JC OUT_C
MOV 78H,A
INC 77H
MOV A,77H
SUBB A,#0AH
JC OUT_C
MOV 77H,A
INC 76H
MOV A,76H
SUBB A,#0AH
JC OUT_C
MOV 76H,#09H
MOV 77H,#09H
MOV 78H,#09H
MOV 79H,#09H
OUT_C:RET
FUN_D: DEC 79H
MOV A,79H
JNB ACC.7,OUT_D
MOV 79H,#9
DEC 78H
MOV A,78H
JNB ACC.7,OUT_D
MOV 78H,#9
DEC 77H
MOV A,77H
JNB ACC.7,OUT_D
MOV 77H,#9
DEC 76H
MOV A,76H
JNB ACC.7,OUT_D
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H
MOV 79H,#00H
OUT_D:RET
PTT0:MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ 60H,PRETI
MOV 60H,#50
CLR KP
CLR TR0
PRETI:RETI
TAB2: LJMP PKA_L
LJMP PKB_L
LJMP PKC_L
LJMP PKD_L
TAB1: LJMP PKA
LJMP PKB
LJMP PKC
LJMP PKD
LJMP PKE
LJMP PKF
TAB: DB 3FH 06H 5BH 4FH 66H 6DH 7DH 07H
DB 7FH 6FH 77H 7CH 39H 5EH 79H 71H
DB 40H 00H 38H 3EH 6EH 40H ;-, ,L,U,Y,S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -