📄 13简单时钟.asm
字号:
;=================================================
; 简单时钟
;
; 时间设定 分钟减1 SW1
; 分钟加1 SW2
; 小时减1 SW3
; 小时加1 SW4
;=================================================
;
; ew51仿真编程器 配套实验板学习例程
;
; 中山单片机学习网 诚电科技
;
; http://www.zsmcu.com
; E-mail:ew51@zsmcu.com
;=================================================
LED1 EQU 021H
LED2 EQU 022H
LED3 EQU 023H
LED4 EQU 024H
JS1 EQU 025H ;25MS (0-99)
JS2 EQU 026H ;1S (0-39)
TimeS EQU 027H ;(0-59)秒
TimeM EQU 028H ;(0-59)分钟
TimeH EQU 029H ;(0-23)小时
LedT0 EQU 030H
ORG 0000H
LJMP START;转入主程序
ORG 000BH ;定时器0中断入口
INT_TO:
PUSH ACC
PUSH PSW
;=============================时钟
INC JS1
MOV A,JS1
CJNE A,#100,INT_TIME
MOV JS1,#00
INC JS2
MOV A,JS2
CJNE A,#40,INT_TIME
MOV JS2,#00
;===========================================
;(11.0592MHz 补偿)提高精度。
;(250.6510417-250)*4000/250=10.4166672
MOV JS1,#10
;===========================================
;秒数加1
INC TimeS
MOV A,TimeS
CJNE A,#60,INT_TIME
MOV TimeS,#00
;分钟加1
INC TimeM
MOV A,TimeM
CJNE A,#60,INT_TIME
MOV TimeM,#00
;小时加1
INC TimeH
MOV A,TimeH
CJNE A,#24,INT_TIME
MOV TimeH,#00
INT_TIME:
MOV A,TimeH
CALL HEXtoBCD
MOV LED1,A
MOV LED2,B
MOV A,TimeM
CALL HEXtoBCD
MOV LED3,A
MOV LED4,B
;=============================显示
MOV A,#11110000B ;关数码管
ORL P2,A
MOV A,LedT0
CJNE A,#0,INT_T0_1
MOV A,LED1
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
MOV LedT0,#1
LJMP INT_T0_END
INT_T0_1:
MOV A,LedT0
CJNE A,#1,INT_T0_2
MOV A,LED2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
MOV LedT0,#2
;点小数点
MOV C,TimeS.0
MOV P0.5,C
LJMP INT_T0_END
INT_T0_2:
MOV A,LedT0
CJNE A,#2,INT_T0_3
MOV A,LED3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
MOV LedT0,#3
LJMP INT_T0_END
INT_T0_3:
MOV A,LED4
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
MOV LedT0,#0
LJMP INT_T0_END
INT_T0_END:
POP PSW
POP ACC
RETI
;========十六进制转换为十进制,A高位,B低位
HEXtoBCD:
mov b,#0ah ; HEX>BCD
div ab
anl a,#00001111b
anl b,#00001111b
RET
START:
MOV SP,#60H
CLR A
MOV JS1,A
MOV JS2,A
MOV TimeH,A
MOV TimeS,A
MOV TimeM,A
MOV TMOD,#02H ;设定T0为工作方式2,八位自动重载。
MOV TH0,#025 ;
MOV TL0,#025 ;256-(250*11.0592/12)=256-230.4=25.6 250us(11.0592)
;用25时,中断时间为250.6510417us
;
SETB TR0 ;开定时器0
SETB ET0 ;致能定时0中断
CLR TF0 ;清定时0中断标志
SETB EA ;开总中断
MOV LedT0,#00H
MOV DPTR,#TABLE
MAIN:
MOV A,#00000011B
ORL A,P3
CPL A
JZ MAIN
LCALL DELAY10MS ;去抖动
MOV A,#00000011B
ORL A,P3
CPL A
JZ MAIN
JB ACC.2,KEY_SW1
JB ACC.3,KEY_SW2
JB ACC.4,KEY_SW3
JB ACC.5,KEY_SW4
LJMP MAIN
;==============时间设定.分钟减1
KEY_SW1:
CLR C
MOV A,TimeM
SUBB A,#1
MOV TimeM,A
JNC KEY_SW1_END
;借位,表示已经减到小于0
MOV TimeM,#59
KEY_SW1_END:
AJMP KEY_END
;==============时间设定.分钟加1
KEY_SW2:
INC TimeM
MOV A,TimeM
CJNE A,#60,KEY_SW2_END
MOV TimeM,#00
KEY_SW2_END:
AJMP KEY_END
;==============时间设定.小时减1
KEY_SW3:
CLR C
MOV A,TimeH
SUBB A,#1
MOV TimeH,A
JNC KEY_SW3_END
;借位,表示已经减到小于0
MOV TimeH,#23
KEY_SW3_END:
AJMP KEY_END
;==============时间设定.小时加1
KEY_SW4:
INC TimeH
MOV A,TimeH
CJNE A,#24,KEY_SW4_END
MOV TimeH,#00
KEY_SW4_END:
AJMP KEY_END
;按键放开处理
KEY_END:
MOV A,#00000011B
ORL A,P3
CPL A
JNZ KEY_END
LJMP MAIN
DELAY10MS:
MOV R4,#20
DELAY10MSA:
MOV R5,#247
DJNZ R5,$
DJNZ R4,DELAY10MSA
RET
TABLE:
DB 00101000B ;0
DB 11101011B ;1
DB 00110010B ;2
DB 10100010B ;3
DB 11100001B ;4
DB 10100100B ;5
DB 00100100B ;6
DB 11101010B ;7
DB 00100000B ;8
DB 10100000B ;9
DB 01100000B ;A
DB 00100101B ;b
DB 00111100B ;C
DB 00100011B ;d
DB 00110100B ;E
DB 01110100B ;F
DB 11110111B ;-
DB 11111111B ;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -