?? 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 + -