|
STRT EQU P0.4 ; 定義 (等價代換) 第一列
SEC EQU P0.5 ;矩陣鍵盤接口處
MIN EQU P0.6
HOUR EQU P0.7 //第4列
CL EQU P2.6 ;蜂鳴器
ORG 0000H
SJMP MAIN
ORG 000BH ;TO溢出時的 定時器 T0中斷程序入口地址
AJMP T0INT0 ;TO溢,跳到T0INT0
ORG 0050H
MAIN: CLR P0.0 ;鍵盤的第一行有效
MOV P2,#0FFH ; 初值 11111111 給所有的位選端置零
MOV R4,#20
;計20次 后面中斷進(jìn)位
MOV TMOD,#01H ; TO為模式1 //向TMOD寄存器寫入立即數(shù)01h。
MOV TH0,#03CH //表示對定時器T0賦初值低八位
MOV TL0,#0B0H
SETB TR0 ; 開啟TO 定時/計數(shù)器0開始運行 TR0是單片機(jī)會響應(yīng)定時/計數(shù)器0的啟動位 與下面不同 這個是開啟 下面這個是允許
SETB ET0 ;T0中斷允許控制位位 開定時器中斷0
SETB EA ;開中斷 開總中斷
MOV 30H,#00H ; 清零30H-32H地址單元:
MOV 31H,#00H
MOV 32H,#00H ;時分秒的儲存單元
KS: LCALL DISP ;作用:無任何按鍵,動態(tài)顯示
JB SEC, KM ;檢查 秒鍵 按否?當(dāng)sec等于1就去執(zhí)行KM,否則往下執(zhí)行
KSS: LCALL DISP
LCALL DALY2 ;顯示
JNB SEC,KSS ;$當(dāng)前地址,產(chǎn)生中斷
AJMP SINC ;松 秒鍵 (秒+1)
KM: LCALL DISP
JB MIN,KH ;分調(diào)整按鍵(按,不管)
KMM:LCALL DISP
LCALL DALY2
JNB MIN,KMM
AJMP MINC ;(分+1)
KH: LCALL DISP
JB HOUR,K1 ;時調(diào)整按鍵 (按,不跳)
KHH:LCALL DISP
LCALL DALY2
JNB HOUR,KHH
AJMP HINC ;(時+1)
SINC: LCALL DISP //秒
LCALL CLO
LCALL DISP
INC 30H ;秒調(diào)整 30H單元的數(shù)據(jù)+1
MOV A,30H
CJNE A,#60,SINC0 ;A=60時,不管 , 否則跳
MOV 30H,#0 ;A=60 30H單元的數(shù)據(jù)清零 60/10=6.0 (6與0) 59/10=(5與9)
SINC0:AJMP KS //A的值跟60不同就回去再掃
MINC: LCALL DISP //分
LCALL CLO
LCALL DISP
INC 31H ;31H單元的數(shù)據(jù)+1
MOV A,31H
CJNE A,#60,MINC0
MOV 31H,#0
MINC0: AJMP KM ;返回"主跳"
HINC: LCALL DISP //時
LCALL CLO
LCALL DISP
INC 32H
MOV A,32H
CJNE A,#24,HINC0
MOV 32H,#0
HINC0:AJMP KH
k1: LCALL DISP
JB STRT,KS ;檢查開始鍵
K11:LCALL DISP
LCALL DALY2
JNB STRT,K11 //當(dāng)strt等于0時就跳k11
AJMP START
START:LCALL DISP
LCALL CLO
LCALL DISP
CPL TR0 ;////入口開始.將TR0位給取反。以來實現(xiàn)一個暫停
AJMP K1
DISP: MOV A,30H //單元中的數(shù)據(jù)/10,分離個位與十位 將地址為30H的寄存器內(nèi)的數(shù)據(jù)送入A,結(jié)果A=由該寄存器內(nèi)所存的實際數(shù)值決定。
MOV B,#10
DIV AB ; ;A除B,商存入A,余存入B
MOV 40H,B ;余數(shù)(秒個位數(shù))
MOV 41H,A ;商(秒十位數(shù))
MOV A,31H //分
MOV B,#10
DIV AB // ;A除B,商存入A,余存入B
MOV 42H,B ;余數(shù)(分個位數(shù))
MOV 43H,A ;商(分十位數(shù))
MOV A,32H //時
MOV B,#10
DIV AB
MOV 44H,B ;余數(shù)(時個位數(shù))
MOV 45H,A ;商(時十位數(shù))
////////時間在數(shù)碼管顯示//////////
MOV A,40H ;秒個位
ACALL SEG7
MOV P1,A
CLR P2.5
ACALL DLY
SETB P2.5
MOV A,41H ;秒十位
ACALL SEG7
MOV P1,A
CLR P2.4
ACALL DLY
SETB P2.4
MOV A,42H ;分個位
ACALL SEG7
MOV P1,A
CLR P2.3
ACALL DLY
SETB P2.3
MOV A,43H ;分十位
ACALL SEG7
MOV P1,A
CLR P2.2
ACALL DLY
SETB P2.2
MOV A,44H ;時個位
ACALL SEG7
MOV P1,A
CLR P2.1
ACALL DLY
SETB P2.1
MOV A,45H ;時十位
ACALL SEG7
MOV P1,A
CLR P2.0
ACALL DLY
SETB P2.0
RET
T0INT0:PUSH ACC
PUSH PSW
CLR TR0 ;暫停定時器T0
MOV A,#0B5H ; ; 10110101
ADD A,TL0 ; 低八位初值修正
MOV TH0,#03CH ; 00111100 ;定時中斷子程序。重裝定時常數(shù)
MOV TL0,A ; 重裝初值(低8位修正值)
SETB TR0 ;開啟定時器T0
DJNZ R4,T0INTR ; ;R4減1,不為0短跳轉(zhuǎn)TOINTR
MOV R4,#20
INC 30H ;1S,秒存儲單元內(nèi)數(shù)+1
MOV A,30H
CJNE A,#60,T0INTR ;未滿60S,跳出中斷。
MOV 30H,#0 ;滿60S,秒單元清零
INC 31H ;分+1
MOV A,31H
CJNE A,#60,T0INTR ;未滿60分,跳出中斷。
MOV 31H,#0 ;滿60分,分單元清零
INC 32H ;時+1
MOV A,32H
CJNE A,#24,T0INTR ;未滿24,跳出中斷。
MOV 32H,#0 ;滿24時,時單元清零
T0INTR: POP PSW
POP ACC
RETI
CLO: CLR CL ;P2.6蜂鳴器 CL0是蜂鳴器子程序
LCALL DALY1
SETB CL
RET
DALY1: ;誤差 0us
MOV R6,#0D7H //0.215毫秒
DALY2: ;誤差 0us
MOV R6,#01H // 消抖
DL0:
MOV R5,#2FH
DJNZ R5,$
DJNZ R6,DL0
RET
DLY: MOV R7,#2
D1: MOV R6,#40
DJNZ R6,$
DJNZ R7,D1
RET
DL3:
MOV R5,#2DH
DJNZ R5,$
DJNZ R6,DL3
NOP
NOP
RET
SEG7: INC A ; A加1 結(jié)果存在A
MOVC A,@A+PC //查表取值送入A
RETI ; 中斷返回
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H //0-9的表格
END
這是矩陣鍵盤加數(shù)碼管顯示 |
|