標題:
單片機時鐘程序(匯編)
[打印本頁]
作者:
daming
時間:
2014-12-29 19:27
標題:
單片機時鐘程序(匯編)
/*
程序效果:通過六位數(shù)碼管顯示時間,通過按鍵可以調節(jié)相應的數(shù)值
KEY1的作用是:停止計數(shù)、顯示準備要改變的數(shù)字位上
(分別為:秒、分、時),開始計數(shù)。
KEY2:的作用是:對應的數(shù)值加1
KEY3:的作用是:對應的數(shù)值減1
注:程序尚有精簡的地方。
*/
ORG 0000H //起始地址
LJMP START
ORG 000BH //定時器0
LJMP INT00
ORG 0030H
START: MOV 30H,#00 //賦初值時間為:
MOV 31H,#05 //
MOV 32H,#09 //
MOV 33H,#05 //
MOV 34H,#03 // 23:59:50
MOV 35H,#02 //
MOV 40H,#00 //控制定時時間,為1s
MOV 50H,#00 //計算KEY1按下的次數(shù)
MOV TMOD,#01H //工作方式1
SETB ET0 //打開分控
SETB EA //打開總控
MOV TH0,#40H //定時時間為:50ms
MOV TL0,#00H
SETB TR0 //啟動定時器
LOOP: MOV A,40H //控制循環(huán)次數(shù)
CJNE A,#20,LOOP1 //到了20次,時間按為1s
MOV 40H,#00 //清零,為下次做準備
LCALL ADD1 //加1
LOOP1: LCALL DISPLAY //調用顯示,防止掉顯
JNB P3.5,KEY1 //判斷KEY1是否按下
JNB P3.6,KEY2 // 判斷KEY2是否按下
JNB P3.7,KE3Y //判斷KEY3是否按下 @1
KEY1: LCALL DISPLAY //延時,消抖
JNB P3.5,KEY10 //判斷KEY1是否按下
LJMP LOOP
KE3Y: LJMP KEY3 //@1 這兩句的做就是擴大JNB的跳轉范圍
KEY10: JNB P3.5,DIS1 //檢查是否放手,防止掉顯
LJMP DI1
DIS1: LCALL DISPLAY
LJMP KEY10
//P3.5按下第一次,關閉定時器
DI1: INC 50H
MOV A,50H
CJNE A,#01,KEY11
CLR TR0
LJMP KEY
//按下第兩次,準備修改秒
KEY11: MOV A,50H
CJNE A,#02,KEY12
MOV R1,#42
DE500: LCALL DISPLAY_M
DJNZ R1,DE500
MOV R1,#42
DE512: LCALL DISPLAY_M
DJNZ R1,DE512
LJMP KEY
//按下第三次,準備修改分
KEY12: MOV A,50H
CJNE A,#03,KEY13
MOV R1,#42
DE513: LCALL DISPLAY_F
DJNZ R1,DE513
MOV R1,#42
DE514: LCALL DISPLAY_F
DJNZ R1,DE514
LJMP KEY
//按下第四次,準備修改時
KEY13: MOV A,50H
CJNE A,#04,KEY14
MOV R1,#42
DE515: LCALL DISPLAY_S
DJNZ R1,DE515
MOV R1,#42
DE516: LCALL DISPLAY_S
DJNZ R1,DE516
LJMP KEY
//按下第五次,啟動定時器
KEY14: MOV A,50H
CJNE A,#05,KEY
MOV 50H,#00
SETB TR0
KEY: LJMP LOOP
KEY2: LCALL DISPLAY //判斷KEY2是否按下
JNB P3.6,KEY20
LJMP LOOP
KEY20: JNB P3.6,KEY201 //
LJMP KEY202 //
KEY201: LCALL DISPLAY //
LJMP KEY20 //檢查按鍵是否松手
//按鍵KEY1按下第二次,秒加1
KEY202: MOV A,50H
CJNE A,#02,KEY21
INC 30H
MOV A,30H
CJNE A,#10,LK2P //判斷個位是否到10
MOV 30H,#00 //清零
INC 31H //十位加1
MOV A,31H
CJNE A,#06,LK2P //判斷是否到6
MOV 31H,#00 //到了,清零
LJMP LOOP
//按鍵KEY1按下第三次,分加1
KEY21: CJNE A,#03,KEY22
INC 32H
MOV A,32H
CJNE A,#10,LK2P
MOV 32H,#00
INC 33H
MOV A,33H
CJNE A,#06,LK2P
MOV 33H,#00
LJMP LOOP
//按鍵KEY1按下第四次,時加1
KEY22: CJNE A,#04,LK2P
INC 34H
MOV A,34H
CJNE A,#04,LK2P
MOV 34H,#00
INC 35H
MOV A,35H
CJNE A,#03,LK2P
MOV 35H,#00
LK2P: LJMP LOOP
KEY3: LCALL DISPLAY
JNB P3.7,KEY30
LJMP LOOP
KEY30: JNB P3.7,KEY301 //
LJMP KEY302 //
KEY301: LCALL DISPLAY //
LJMP KEY30 // 檢查放手
//按鍵KEY1按下第二次,秒減1
KEY302: MOV A,50H
CJNE A,#02,KEY31
DEC 30H //減1
MOV A,30H
CJNE A,#0FFH,LK3P //減到255時
MOV 30H,#09 //賦初值
DEC 31H
MOV A,31H
CJNE A,#0FFH,LK3P
MOV 31H,#05
LJMP LOOP
//按鍵KEY1按下第三次,分減1
KEY31: CJNE A,#03,KEY32
DEC 32H
MOV A,32H
CJNE A,#0FFH,LK3P
MOV 32H,#09
DEC 33H
MOV A,33H
CJNE A,#0FFH,LK3P
MOV 33H,#05
LJMP LOOP
//按鍵KEY1按下第三次,時減1
KEY32: CJNE A,#04,LK3P
DEC 34H
MOV A,34H
CJNE A,#0FFH,LK3P
MOV A,35H
CJNE A,#02, KEY33
MOV 34H,#09
LJMP KEY35
KEY33: CJNE A,#01,KEY34
MOV 34H,#09
LJMP KEY35
KEY34: MOV 34H,#03
KEY35: DEC 35H
MOV A,35H
CJNE A,#0FFH,LK3P
MOV 35H,#02
LK3P: LJMP LOOP
//加1子程序
ADD1: INC 30H
MOV A,30H
CJNE A,#10,LAP
MOV 30H,#00
INC 31H
MOV A,31H
CJNE A,#06,LAP
MOV 31H,#00
INC 32H
MOV A,32H
CJNE A,#10,LAP
MOV 32H,#00
INC 33H
MOV A,33H
CJNE A,#06,LAP
MOV 33H,#00
INC 34H
MOV A,34H
CJNE A,#04,LAP
MOV 34H,#00
INC 35H
MOV A,35H
CJNE A,#03,LAP
MOV 35H,#00
LAP: RET
//六位數(shù)碼管顯示子程序
DISPLAY: PUSH 00
PUSH 01
PUSH 02
MOV DPTR,#TAB
MOV R2,#04
MOV R0,#30H
MOV A,#7FH
MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV DPTR,#TAB1
LDP: MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
DJNZ R2,LDP
POP 02
POP 01
POP 00
RET
//秒顯示,用于判斷什么時候調整秒
DISPLAY_M:
PUSH 00
PUSH 01
PUSH 02
MOV DPTR,#TAB
MOV R2,#04
MOV R0,#30H
MOV A,#7FH
MOV P2,A
XCH A,R1
MOV A,#00
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV P2,A
XCH A,R1
MOV A,#00
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV DPTR,#TAB1
LDMP: MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
DJNZ R2,LDMP
POP 02
POP 01
POP 00
RET
//秒顯示,用于判斷什么時候調整分
DISPLAY_F:
PUSH 00
PUSH 01
PUSH 02
MOV DPTR,#TAB
MOV R2,#02
MOV R0,#30H
MOV A,#7FH
MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV DPTR,#TAB1
MOV P2,A
XCH A,R1
MOV A,#00
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV P2,A
XCH A,R1
MOV A,#00
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
LDFP: MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
DJNZ R2,LDFP
POP 02
POP 01
POP 00
RET
//秒顯示,用于判斷什么時候調整時
DISPLAY_S:
PUSH 00
PUSH 01
PUSH 02
MOV DPTR,#TAB
MOV R2,#02
MOV R0,#30H
MOV A,#7FH
MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV DPTR,#TAB1
LDSP: MOV P2,A
XCH A,R1
MOV A, @R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
DJNZ R2,LDSP
MOV P2,A
XCH A,R1
MOV A,#00
MOV P0,A
LCALL DELAY2MS
INC R0
XCH A,R1
RR A
MOV P2,A
XCH A,R1
MOV A,#00
MOV P0,A
LCALL DELAY2MS
POP 02
POP 01
POP 00
RET
//定時50ms
INT00: MOV TH0,#40H
MOV TL0,#00H
INC 40H
RETI
TAB: DB 3FH,06H,5BH,4FH,66H //數(shù)碼管顯示的數(shù)值
DB 6DH,7DH,07H,7FH,6FH
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H //帶小數(shù)點的數(shù)碼管顯示的數(shù)值
DB 0EDH,0FDH,87H,0FFH,0EFH
DELAY2MS:
MOV R7,#04
DEL2: MOV R6,#250
DEL1: DJNZ R6,DEL1
DJNZ R7,DEL2
RET
END
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1