标题:
单片机时钟程序(汇编)
[打印本页]
作者:
daming
时间:
2014-12-29 19:27
标题:
单片机时钟程序(汇编)
/*
程序效果:通过六位数码管显示时间,通过按键可以调节相应的数值
KEY1的作用是:停止计数、显示准备要改变的数字位上
(分别为:秒、分、时),开始计数。
KEY2:的作用是:对应的数值加1
KEY3:的作用是:对应的数值减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按下的次数
MOV TMOD,#01H //工作方式1
SETB ET0 //打开分控
SETB EA //打开总控
MOV TH0,#40H //定时时间为:50ms
MOV TL0,#00H
SETB TR0 //启动定时器
LOOP: MOV A,40H //控制循环次数
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
//六位数码管显示子程序
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 //数码管显示的数值
DB 6DH,7DH,07H,7FH,6FH
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H //带小数点的数码管显示的数值
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.51hei.com/bbs/)
Powered by Discuz! X3.1