📄 151.asm
字号:
ORG 0000H
AJMP START
ORG 0030H
START:
MOV SP, #60H
MOV R4, #08H ;清除30H-37H的地址
MOV R0, #30H
LCALL DISP ;初始化全部显示零
CLEAR: MOV @R0, #00H
INC R0
DJNZ R4, CLEAR
L1: MOV R3, #0F7H ;扫描初值(P1.3=0)
MOV R1, #00H ;取码指针
L2: MOV A, R3 ;开始扫描
MOV P1, A ;将扫描值输出至P1
MOV A, P1 ;读入P1值,判断是否有键按下?
MOV R4, A ;存入R4,以判断是否放开
SETB C ;C=1
MOV R5, #04H ;扫描P1.4-P1.7
L3: RLC A ;将按键值左移一位
JNC KEYIN ;判断C=0?有键按下则C=0,跳至KEYIN
INC R1 ;C=1则表示没键按下,将取码指针值加1
DJNZ R5, L3 ;4列扫描完毕了?
LCALL DISP ;调用显示子程序
MOV A, R3 ;扫描值载入
SETB C ;C=1
RRC A ;扫描下一行(P1.3-P1.0)
MOV R3, A ;存回扫描寄存器
JC L2 ;C=1?是则P1.0尚未扫描到
JMP L1 ;C=0则4行已扫描完毕
KEYIN: MOV R7, #60 ;消除抖动
D2: MOV R6, #248
DJNZ R6, $
DJNZ R7, D2
D3: MOV A, P1 ;读入P1值
XRL A, R4 ;与上次读入值作比较
JZ D3 ;ACC=0则相等,表示按钮未放
MOV A, R1 ;按钮已放开,取码指针载入累加器
MOV DPTR, #TABLE ;数据指针指到TABLE
MOVC A, @A+DPTR ;至TABLE取码
CLR C
CJNE A, #0AH, A0
LJMP LEFT ;确定送数
A0: JC QA
CJNE A, #0BH, B0
LJMP RIGHT ;步进10K
B0: CJNE A, #0CH, C0
LJMP SS ;步退10K
DELAY: MOV R7, #50 ;显示器扫描时间,延时1ms
D7: MOV R6, #20
D1: DJNZ R6, D1
DJNZ R7, D7
RET
;;;;;;;;;;;;;;;;;;扫描子程序;;;;;;;;;;;;;;;;;;;;;;
LL1: MOV R3, #0F7H
MOV R1, #00H
LL2: MOV A, R3
MOV P1, A
MOV A, P1
MOV R4, A
SETB C
MOV R5, #04H
LL3: RLC A
JNC KEYINN
INC R1
DJNZ R5, LL3
CALL DISP
MOV A, R3
SETB C
RRC A
MOV R3, A
JC LL2
JMP LL1
KEYINN: MOV R7, #60
DD2: MOV R6, #248
DJNZ R6, $
DJNZ R7, DD2
DD3: MOV A, P1
XRL A, R4
JZ DD3
MOV A, R1
MOV DPTR, #TABLE
MOVC A, @A+DPTR
RET
;;;;;;;;;;组合;;;;;;;;;出口:高位3AH,低位38H;;;;;;;;;;;;;;;;;;;;;;;;;;
LEFT: LCALL ZUHE
LCALL START0
LCALL PIN
LCALL MAIN2
LJMP SHUCHU
ZUHE: MOV A, 36H
SWAP A
ORL A, 37H
MOV 38H, A
MOV A, 34H
SWAP A
ORL A, 35H
MOV 39H, A
MOV 3AH, 33H
NOP
NOP
MOV R1, #50H
MOV R7, #03H
MOV R0, #3AH
RET
;;;;;;;;;;;;;;;;;;;;;;;BCD码转换;;;;;;;;;;;;;;;
;;;;;入口:3AH,39H,38H;;;出口:50H,51H,52H;;;;;;;;;;;;;
START0: PUSH PSW
PUSH ACC
PUSH B
NOP
NOP
MOV A, R1
MOV R6, A
MOV A, R7
MOV R3, A
CLR A
LOOP10: MOV @R1, A
INC R1
DJNZ R3, LOOP10
MOV A, R7
MOV R3, A
LOOP11: ACALL SC11
MOV A, @R0
ANL A, #0F0H
SWAP A
ACALL SC12
ACALL SC11
MOV A, @R0
ANL A, #0FH
ACALL SC12
DEC R0
DJNZ R3, LOOP11
POP B
POP ACC
POP PSW
RET
SC11: MOV A, R7
MOV R4, A
MOV A, R6
MOV R1, A
CLR C
MOV R2, #00H
LOOP14: MOV A, @R1
MOV B, #0AH
PUSH PSW
MUL AB
POP PSW
ADDC A, R2
MOV @R1, A
MOV R2, B
INC R1
DJNZ R4, LOOP14
RET
SC12: MOV R5, A
MOV A, R6
MOV R1, A
MOV A, R7
MOV R4, A
MOV A, R5
ADD A, @R1
MOV @R1, A
INC R1
DEC R4
JNZ LOOP15
AJMP LOOP16
LOOP15: MOV A, @R1
ADDC A, #00H
MOV @R1, A
INC R1
DJNZ R4, LOOP15
LOOP16: RET
;;;;;;;;;;;;;;;除5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;入口:高位51H送R7,低位50H送R6
;;;;;;;;;;;;;;;;;;;出口:一样;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN2: ;除于5,计算分频比
MOV R7, 51H
MOV R6, 50H
MOV R5, #5
START1: CLR A
MOV R2, A
MOV R1, #16
DIV1: CLR C
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R2
RLC A
MOV R2, A
TIAO1: MOV A, R2
SUBB A, R5
JC NEXT
MOV R2, A
INC R6
NEXT: DJNZ R1, DIV1
MOV A, R2
JB ACC.7, ROUND
RLC A
SUBB A, R5
JC DONE
ROUND: MOV A, R6
ADD A, #1
MOV R6, A
MOV A, R7
ADDC A, #0
MOV R7, A
DONE: MOV OVER, #0
MOV 50H, R6
MOV 51H, R7
RET
OVER: MOV OVER, #0FFH
MOV 50H, R6
MOV 51H, R7
RET
;;;;;;;;;;;;;;;;;;;;;;;显示;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP: MOV A, 37H
ADD A, #70H ;D8数据值加上74138扫描值
MOV P0, A ;显示D8
CALL DELAY ;扫描延时
MOV A, 36H
ADD A, #60H ;D7数据值加上74138扫描值
MOV P0, A ;显示D7
CALL DELAY ;扫描延时
MOV A, 35H
ADD A, #50H ;D6数据值加上74138扫描值
MOV P0, A ;显示D6
CALL DELAY ;扫描延时
MOV A, 34H
ADD A, #40H ;D5数据值加上74138扫描值
MOV P0, A ;显示D5
CALL DELAY ;扫描延时
MOV A, 33H
ADD A, #30H ;D4数据值加上74138扫描值
MOV P0, A ;显示D4
CALL DELAY ;扫描延时
MOV A, 32H
ADD A, #20H ;D3数据值加上74138扫描值
MOV P0, A ;显示D3
CALL DELAY ;扫描延时
MOV A, 31H
ADD A, #10H ;D2数据值加上74138扫描值
MOV P0, A ;显示D2
CALL DELAY ;扫描延时
MOV A, 30H
ADD A, #00H ;D1数据值加上74138扫描值
MOV P0, A ;显示D1
CALL DELAY ;扫描延时
RET
;;;;;;;;;;;;;;;;;;;;;;;加10K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RIGHT: LCALL ZHISHU ;置数 为加法服务
LCALL BCDADD
LCALL CHAI
LCALL LEFT
ZHISHU: MOV R0, #38H
MOV R1, #40H
MOV 40H, #00H
MOV 41H, #01H
MOV 42H, #00H
MOV R7, #03H
RET
BCDADD: CLR C
ADDL: MOV A, @R0
ADDC A, @R1
DA A
MOV @R0, A
INC R0
INC R1
DJNZ R7, ADDL
CLR A
MOV ACC.0, C
MOV @R0, A
RET
;;;;;;;;;;;;;;;;;;;拆送到37H.....33H显示;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHAI: MOV A, 38H
ANL A, #0FH
MOV 37H, A
MOV A, 38H
SWAP A
ANL A, #0FH
MOV 36H, A
MOV A, 39H
ANL A, #0FH
MOV 35H, A
MOV A, 39H
SWAP A
ANL A, #0FH
MOV 34H, A
MOV 33H, 3AH
LCALL DISP
RET
SHUCHU: LCALL CUAN ;送到P2、P3口
LCALL DISP
LJMP L1
;;;;;;;;;;;;;数的交换;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QQ: XCH A, 37H ;现按键值存入(37H)
XCH A, 36H ;旧(37H)值存入(36H)
XCH A, 35H ;旧(36H)值存入(35H)
XCH A, 34H ;旧(35H)值存入(34H)
XCH A, 33H ;旧(34H)值存入(33H)
XCH A, 32H ;旧(33H)值存入(32H)
XCH A, 31H ;旧(32H)值存入(31H)
XCH A, 30H ;旧(31H)值存入(30H)
ACALL DISP ;调用子程序
RET
;;;;;;;;;;;;;;;;;;;;减10K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SS: LCALL ZHISHU
LCALL BCDSUB
LCALL CHAI
LCALL DISP
LJMP LEFT
BCDSUB: MOV R3, #00H
CLR 07H
CLR C
SUBCD1: MOV A, #9AH
SUBB A, @R1
ADD A, @R0
DA A
MOV @R0, A
INC R0
INC R1
INC R3
CPL C
DJNZ R7, SUBCD1
JNC SUBCD2
SETB 07H
SUBCD2: RET
UU: MOV 48H, #20H
TP: ACALL DISP
ACALL TZ
DJNZ 48H, TP
RET
YS: MOV 45H, #02FH
M7: MOV 46H, #02FH
M1: NOP
DJNZ 46H, M1
DJNZ 45H, M7
RET
;---------------
CUAN: MOV P2, 51H ;送数
MOV P3, 50H
RET
TABLE: DB 0CH,08H,04H,00H
DB 0DH,09H,05H,01H
DB 0EH,0AH,06H,02H
DB 0FH,0BH,07H,03H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -