📄 succ.asm
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
AJMP IT0P
ORG 0100H
MAIN: MOV TMOD,#01H ;T0为方式一
MOV 20H,#0AH ;装入中断次数
MOV 49H,#00H ;存放整点的数
CLR P1.7
lcall chushi ;调用初始化子程序
SETB ET0
SETB EA
MOV TH0,#3CH ;T0装入计数初值
MOV TL0,#0B0H
SETB TR0
HERE: LCALL DISPLAY ;调用显示子程序
SJMP HERE
IT0P: PUSH PSW
PUSH Acc
mov r5,#0ffh
lcall KEYI ;调用键盘子程序
cjne r5,#0ffh,keyinput ;有键输入
Ljmp nokey ;无键输入跳
keyinput:cjne r5,#0fh,nokey ;对有键输入并且是最右下角的进行处理不是则转移
clr TR0 ;关中断
lcall chushi ;调用初始化程序,使40H-42H全为0,便于用户输入
lcall DISPLAY ;显示
lcall DL1S
mov r5,#0ffh
shu0: lcall KEYI ;输入小时的高位
cjne r5,#0ffh,ok0
lcall DISPLAY
jmp shu0
ok0: mov 43h,r5
lcall DISPLAY
lcall DL1S
mov r5,#0ffh
shu1: lcall KEYI ;输入小时的低位
cjne r5,#0ffh,ok1
lcall DISPLAY
jmp shu1
ok1: mov 44h,r5
lcall DISPLAY
lcall DL1S
mov r5,#0ffh
shu2: lcall KEYI ;输入分的高位
cjne r5,#0ffh,ok2
lcall DISPLAY
jmp shu2
ok2: mov 45h,r5
lcall DISPLAY
jmp goon
nokey: jmp nokey1
goon: lcall DL1S
mov r5,#0ffh
shu3: lcall KEYI ;输入分的低位
cjne r5,#0ffh,ok3
lcall DISPLAY
jmp shu3
ok3: mov 46h,a
lcall DISPLAY
lcall DL1S
mov r5,#0ffh
shu4: lcall KEYI ;输入秒的高位
cjne r5,#0ffh,ok4
lcall DISPLAY
jmp shu4
ok4: mov 47h,r5
lcall DISPLAY
lcall DL1S
mov r5,#0ffh
shu5: lcall KEYI ;输入秒的低位
cjne r5,#0ffh,ok5
lcall DISPLAY
jmp shu5
ok5: mov 48h,a
lcall DISPLAY
mov a,43h ;对输入的转化存到40H,41H,43H里
lcall youyi
mov r4,44h
orl a,r4
mov 40h,a
mov a,45h
lcall youyi
mov r4,46h
orl a,r4
mov 41h,a
mov a,47h
lcall youyi
mov r4,48h
orl a,r4
mov 42h,a
SETB TR0
lcall DISPLAY
nokey1: DJNZ 20H,RETURN ;1S未到
MOV A,49H ;是否还需要响
CJNE A,#00H,XIANG ;需要
JMP BUXIANG ;不需要
XIANG: LCALL SOUND ;调用响子程序
DEC A
MOV 49H,A
BUXIANG: MOV TH0,#3CH
MOV TL0,#0B0H
MOV 20H,#0AH ;重置
MOV A,#01H ;秒加一
ADD A,42H
DA A ;秒的十进置调整
MOV 42H,A
CJNE A,#60h,RETURN ;判断是否到60秒
MOV 42H,#00H ;到了清零
MOV A,#01H
ADD A,41H
DA A
MOV 41H,A
CJNE A,#60h,RETURN ;判断是否到60分
MOV 41H,#00H ;到了清零
MOV A,#01H
ADD A,40H
DA A ;转换成10进制
MOV 40H,A
mov a,#0f0h
anl a,40h
lcall youyi
mov 43h,a
mov a,#0fh
anl a,40h
mov 44h,a
MOV A,44H ;转换成8421BCD
MOV R0,43H
CJNE R0,#01H,COUNT10
ADD A,#10
AJMP OUT
COUNT10: JC OUT
ADD A,#20
OUT: MOV 49H,A ;将整点数存入49H
MOV A,40H
CJNE A,#24h,RETURN ;判断是否到24小时
MOV 40H,#00H
RETURN: lcall shijin ;转换
POP Acc
POP PSW
RETI
DISPLAY: MOV DPTR,#7f00H ;显示程序
MOV A,#03H ;8155初始化
MOVX @DPTR,A
test: MOV R0,#43H ;置缓冲器指针初值
MOV R3,#20H
MOV A,R3
LD0: MOV DPTR,#7f01H
MOVX @DPTR,A
INC DPTR
MOV A,@R0
ADD A,#0DH
MOVC A,@A+PC
DIR1: MOVX @DPTR,A ;段码送至8155的PB口
ACALL DL1ms
INC R0
MOV A,R3
JB ACC.0,LD1
Rr A ;位选码右移一位
MOV R3,A
AJMP LD0
LD1: RET
DSEG1: DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,73H,3EH
DB 31H,6EH,1CH,23H,40H,03H
DB 18H,00
DL1ms: MOV R7,#02H ;延时1ms子程序
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
DL1S: mov r5,#02fh
DL61: LCALL DL1ms
LCALL DISPLAY
DJNZ r5,DL61
RET
shijin: mov a,#0f0h ;将时钟的数据转换成可显示的存于43H后6
anl a,40h
lcall youyi
mov 43h,a
mov a,#0fh
anl a,40h
mov 44h,a
mov a,#0f0h
anl a,41h
lcall youyi
mov 45h,a
mov a,#0fh
anl a,41h
mov 46h,a
mov a,#0f0h
anl a,42h
lcall youyi
mov 47h,a
mov a,#0fh
anl a,42h
mov 48h,a
ret
youyi: rr a ;A右移四位
rr a
rr a
rr a
ret
SOUND: MOV R0,#6FH
LLL: mov r1,#20h
SETB P1.7
L1: DJNZ R0,L1
L2: INC R0
CJNE R0,#0FH,L2
DJNZ R1,L1
CLR P1.7
RET
KEYI: LCALL KS1 ;键盘程序
JZ KEYEND ;没有按下
LK1: LCALL DL1MS
LCALL DISPLAY
LCALL DL1MS
LCALL DISPLAY
LCALL KS1
JZ KEYEND ;是抖动引起的
LK2: MOV R2,#0FEH ;列选到R2
MOV R4,#00H ;R4为列号计数器
LK4: MOV DPTR,#07f01H
MOV A,R2
MOVX @DPTR,A
INC DPTR
INC DPTR
MOVX A,@DPTR ;读8155的C口
JB Acc.0,LONE ;第0线为高,无键闭合,跳转判第一行
MOV A,#00H ;第0行有键闭合,0到A
AJMP LKP ;跳LKP,计算键号
LONE: JB Acc.1,LTW0
MOV A,#08H ;1行有键闭合,8到A
AJMP LKP
LTW0: JB Acc.2,LTHR
MOV A,#10H ;1行有键闭合,10到A
AJMP LKP
LTHR: JB Acc.3,NEXT
MOV A,#18H ;1行有键闭合,18到A
AJMP LKP
NEXT: INC R4
MOV A,R2
JNB Acc.7,KEYEND
RL A
MOV R2,A
AJMP LK4
LKP: ADD A,R4 ;计算键号,即:行首键号+列号=键号
PUSH Acc ;键号进栈保护
MOV DPTR,#KEYTAB
POP ACC
MOVC A,@A+DPTR ;得到键值
mov r5,a
KEYEND: RET
KEYTAB: DB 00H,01H,02H,03H,04H,05H,0AH,0AH
DB 06H,07H,08H,09H,0AH,0AH,0AH,0AH
DB 0AH,0AH,0AH,0AH,0AH,0AH,0AH,0AH
DB 0AH,0AH,0AH,0AH,0AH,0FH,0AH,0AH
KS1: MOV DPTR,#07f01H ;判断有无键按下
MOV A,#00H ;列线全为底电平
MOVX @DPTR,A
INC DPTR
INC DPTR
MOVX A,@DPTR ;从PC口读取行线状态
CPL A ;行线状态取反,若无键按下则A中内容为零
ANL A,#0FH
RET
chushi: mov A,#00H
DA A
MOV 40H,A
MOV 41H,A
MOV 42H,A
lcall shijin ;将时,分,秒转化成可显示的
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -