HOUR EQU 40H ;小时变量
MIN EQU 41H ;分钟变量
SEC EQU 42H ;秒变量
HOUR_1 EQU 50H ;小时BCD码个位
HOUR_2 EQU 51H ;小时BCD码十位
MIN_1 EQU 52H ;分钟BCD码个位
MIN_2 EQU 53H ;分钟BCD码十位
SW1 BIT P3.2 ;小时加1按键
SW2 BIT P3.3 ;分钟加1按键
ORG 0000H
LJMP START ;转移到初始化程序
ORG 000BH
LJMP CT0S ;到定时器0的中断服务程序
ORG 0030H
START: ;初始化部分
MOV HOUR,#12 ;初始时间12:00
MOV MIN,#00
MOV R3,#20 ;初始化R3(20次50ms的中断)
MOV TMOD,#01H ;初始化T0定时器,T0工作方式1 ,定时50ms
MOV TH0,#04BH ;送定时器初值
MOV TL0,#0FFH
SETB EA ;开总中断
SETB ET0 ;开定时器0中断
SETB TR0 ;启动定时器
MAIN:
LCALL KEYPRESS ;调按键处理子程序
LCALL BCD8421 ;调BCD码转换子程序
LCALL DISPLAY ;调显示子程序
LJMP MAIN
;***************************************************
DELAY: MOV R7,#255 ;延时子程序
D2: DJNZ R7,D2
RET
;***************************************************
KEYPRESS: ;按键处理子程序,p3.2、P3.3为按键的接口
SETB SW1 ;设置为输入
JB SW1,KEY1 ;按键没有按下,查询下一按键
LCALL DELAY ;若按下,延时去抖
JB SW1,KEY1
MOV A,HOUR ;小时变量送A
INC A ;小时数加1
MOV HOUR,A ;保存小时数
CJNE A,#24,KEY0 ;如果不等于24,等待按键释放
MOV HOUR,#00H ;如果等于24,则使小时变量送0
KEY0: LCALL DISPLAY ;调显示起延时去抖作用,保证扫描显示不停止
JNB SW1,KEY0 ;没有释放,继续等待
LCALL DISPLAY
JNB SW1,KEY0
KEY1: SETB SW2
JB SW2,KRET
LCALL DELAY
JB SW2,KRET
MOV A,MIN
INC A ;分钟变量加1
MOV MIN,A
CJNE A,#60,KEY10 ;如果不等于60,等待按键释放
MOV MIN,#00H ;如果等于60,则使分钟变量送0
KEY10: LCALL DISPLAY
JNB SW2,KEY10
LCALL DISPLAY
JNB SW2,KEY10
KRET: RET
;**************************************************
CT0S: ;走时部分。延时1s,秒加1,秒满60分钟加1,分钟满60小时加1
PUSH ACC ;保护现场
MOV TH0,#04BH ;重新送定时器初值
MOV TL0,#0FFH
DJNZ R3,TIMEEND ;中断次数不足20次直接返回
MOV R3,#20 ;中断次数满20次为1秒,重新送计数初值
MOV A,SEC ;秒增加1
INC A
MOV SEC,A
CJNE A,#60,TIMEEND
MOV SEC,#00H
MOV A,MIN ;满60秒,分钟加1
INC A
MOV MIN,A
CJNE A,#60,TIMEEND
MOV MIN,#00H
MOV A,HOUR ;满60分,小时加1
INC A
MOV HOUR,A
CJNE A,#24,TIMEEND
MOV HOUR,#00H
TIMEEND:POP ACC ;恢复现场
CPL P2.4
RETI
;*********************BCD码转换子程序,变量不大于60,没有百位
BCD8421:MOV A,HOUR
MOV B,#0AH
DIV AB ;除以10,商为十位,余数为个位
MOV HOUR_2,A
MOV HOUR_1,B
MOV A,MIN
MOV B,#0AH
DIV AB
MOV MIN_2,A
MOV MIN_1,B
RET
;*****************************************************************
DISPLAY: ;以下是显示子程序,P1口输出段码,P2口输出位码
MOV P2,#00H ;显示小时的部分
MOV DPTR,#CHAR
MOV A,HOUR_2
MOVC A,@A+DPTR
MOV P1,A
MOV P2,#0FDH
LCALL DELAY
MOV A,HOUR_1
MOVC A,@A+DPTR
MOV P1,A
MOV P2,#0FEH
LCALL DELAY
MOV A,MIN_2 ;显示分钟的部分
MOVC A,@A+DPTR
MOV P1,A
MOV P2,#0F7H
LCALL DELAY
MOV A,MIN_1
MOVC A,@A+DPTR
MOV P1,A
MOV P2,#0FBH
LCALL DELAY
RET
CHAR:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳型字型码表
END
秒是用led灯的显示的,小时和分钟用数码管,数码管可以正常显示,就是led灯闪烁的太快了、、、
一周热门 更多>