;****************************************************************
;項目名稱: 數字式秒表設計;功能要求:數字式秒表上電或按鍵復位后能自動顯示系統提示符“P.”,進入準備工作狀態。該數字式秒表應具有開始、暫停、連續、清零和停止功能。
;****************************************************************
;堆棧棧底2FH;
;****************************************************************
;LED數碼管顯示器設定;
;P0.7---P0.0段控線,接LED的顯示段dp,g,f,e,d,c,b,a
;P2.0---P2.7位控線,從左至右 (LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
;顯示緩沖區設定從左至右依次為78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
;****************************************************************
;獨立式鍵盤設定;
;8個按鍵S2至S9分別依次接在P1.0至P1.7口線;
;****************************************************************
;獨立式鍵盤設定與功能;
;8個按鍵S1至S8分別依次接在P1.0至P1.7口線;
;S1的功能為復位
;S2的功能為啟動/停止(標識符為22H.0當它為1時啟動,為0時停止)
;S3的功能為暫停/繼續(標識符為22H.1當它為1時暫停,為0時繼續)
;S4的功能為清零
;****************************************************************
;定時器/計數器資源:
;T/C0:工作模式1;功能;定時時間;查詢或中斷
;****************************************************************
;中斷系統資源;
;T/C0
;****************************************************************
;鍵功能程序;
;K1 (S2鍵鍵功能程序)
;K2 (S3鍵鍵功能程序)
;K3 (S4鍵鍵功能程序)
;********************************************************
;中斷服務程序
;********************************************************
;常數表格;
;DISBH(系統提示符P.字型代碼序號表)
;DISBI(00-00-00字符的代碼序號)
;TAB (共陽數碼管字型代碼表)
;********************************************************
;子程序;
;DL (1毫秒延時子程序)
;DISP (數碼管顯示子程序)
;KEY (鍵掃描子程序);
;KEYCL (P1口數據處理子程序)
;ADD01 (加1子程序)
;*********************************************************
ORG 0000H
START: LJMP MAIN
ORG 000BH
LJMP ZHD
ORG 0030H
MAIN: MOV PSW, #00H
MOV SP, #2FH ;確立堆棧區
MOV R0, #20H ;RAM區首地址
MOV R7, #96 ;RAM區單元個數
MOV TMOD, #01H
SETB EA
SETB ET0
ML: MOV @R0, #00H
INC R0
DJNZ R7, ML
TSF: MOV DPTR, #DISBH ;系統初始化后提示符“P.”字符代碼表首地址
MOV R5, #08H
MOV R0, #78H
DISPTSF: CLR A
MOVC A, @A+DPTR
MOV @R0, A
INC R0
INC DPTR
DJNZ R5, DISPTSF
KEY0: LCALL DISP
LCALL KEY
JB 20H.0, K1
JB 20H.1, K2
JB 20H.2, K3
LJMP KEY0
KEY00: LCALL KEY
LCALL DISP
JB 20H.2, K3
LJMP KEY00
K1: JB 22H.1, KEY0
CPL 22H.0
JB 22H.0, 01 ;高電平則計時
CLR TR0 ;低電平則停止
LCALL DISP
LJMP KEY00
K01: MOV 7AH, #12H ;從零開始計時
MOV 7DH, #12H
MOV 7FH, #10H
MOV 79H, #00H
MOV 7BH, #00H
MOV 7CH, #00H
MOV 7EH, #00H
MOV 7FH, #00H
LCALL DISP
MOV TH0, #0D8H
MOV TL0, #0F0H
SETB TR0 ;啟動定時器
LJMP KEY0
K2: JB 22H.0, K21 ;判斷秒表是否啟動,如不是啟動狀態則此次按鍵無效
LJMP KEY0
K21: CPL 22H.1
JB 22H.1, K22
SETB TR0 ;繼續計時
LJMP KEY0
K22: CLR TR0 ;暫停秒表
LCALL DISP
LJMP KEY0
K3: JB 22H.0, KEY0 ;只有當停止是,清零鍵才有效
MOV R0, #79H ;秒表清零
LCALL CLR0
MOV R0, #7CH
LCALL CLR0
MOV R0, #7FH
LCALL CLR0
LJMP KEY0
ZHD: PUSH PSW
PUSH ACC
MOV TMOD, #01H ;定時器以工作方式1工作
SETB RS1 ;設定組號為2組
CLR RS0
MOV TH0, #0D8H
MOV TL0, #0F0H
MOV R0, #79H
LCALL ADD01
CJNE R2, #99, RETT ;判斷100毫秒到沒
MOV R0, #7CH
LCALL ADD01
CJNE R2, #60, RETT ;判斷60秒到沒
LCALL CLR0
MOV R0, #7FH
LCALL ADD01
CJNE R2, #60, RETT ;判斷60分到沒
LCALL CLR0
RETT: POP ACC
POP PSW
RETI
;*******************************************************
;常數表格區
;系統初始化后提示符“P.”字符代碼表;
DISBH: DB 10H,10H,10H,10H,10H,10H,10H,11H;提示符“P.”字符序號顯示字符段選碼表(共陽極代碼)
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;0-8
DB 90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0BFH
;9,A,B,C,D,E,F,滅,p.,-
;*******************************************************
;子程序區;
ADD01: MOV A, @R0
DEC R0
SWAP A
ORL A, @R0
ADD A, #01H
DA A
MOV R2, A
ANL A, #0FH
MOV @R0, A
MOV A, R2
ANL A, #0F0H
SWAP A
INC R0
MOV @R0, A
RET
CLR0 : MOV @R0, #00H
DEC R0
MOV @R0, #00H
RET
;鍵掃描子程序
KEY: LCALL KEYCL ;調P1口數據處理子程序
JZ EXIT ;沒有鍵按下,轉返回
LCALL DISP ;調顯示子程序去抖動
LCALL DISP
LCALL KEYCL ;調P1口數據處理子程序
JZ EXIT ;沒有鍵按下,轉返回
MOV B, 20H ;保存取反后的鍵值
KEYSF: LCALL KEYCL ;調P1口數據處理子程序
JZ KEY1 ;鍵釋放,轉恢復鍵值
LCALL DISP
LCALL DISP ;調顯示子程序延時
LJMP KEYSF ;等待釋放
KEY1: MOV 20H, B ;鍵值送20H保存
EXIT: RET
;子程序返回
;P1口數據處理子程序
KEYCL: PUSH PSW ;保護現場
CLR RS1 ;改變當前寄存器組為組1
SETB RS0
MOV P1, #0FFH ;先向P1口寫1
MOV A, P1 ;讀P1口數據
CPL A ;P1口數據取反
MOV 20H, A ;保存取反后的鍵值
CLR RS1 ;恢復當前寄存器組為組0
CLR RS0
POP PSW ;恢復現場
RET ;子程序返回
;顯示子程序
;入口: 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH,
DISP: PUSH DPH ;保護現場
PUSH DPL
PUSH ACC
PUSH PSW
CLR RS1 ;改變當前寄存器組為組1
SETB RS0
MOV R1, #78H ;顯示緩沖存儲單元首地址
MOV R2, #01H ;從右至左顯示
MOV R5, #08H ;循環次數,即驅動數碼管的位數
DISP1: MOV A, @R1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P0, A ;送段控
MOV P2, R2 ;送位控
LCALL DL ;延時1毫秒
MOV A, R2 ;位控碼送A
RL A ;獲得新的位控碼
MOV R2, A ;保存新的位控碼
INC R1 ;獲得新的顯示緩沖單元地址
DJNZ R5, DISP1 ;循環沒有結束則繼續
DISP2: POP PSW ;恢復現場
POP ACC
POP DPL
POP DPH
RET
;延時1ms子程序(晶振頻率12MHz)DL
DL: MOV R7, #01H
DL1: MOV R6, #8EH
DL0: MOV R5, #02H
DJNZ R5, $
DJNZ R6, DL0
DJNZ R7, DL1
RET
END
|