帮忙看看,

2020-01-30 13:43发布

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灯闪烁的太快了、、、
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。