;/**********************************************************************************************/
;/************************ 带按键可调时间电子钟 ***************************/
;/**********************************************************************************************/
;; 程序说明:
;/* 接通电源后,数码管显示12 00 00 然后就开始走时,按"小时+"每按一次小时加1,按“小时-”每按一次
;/*小时减1,按"分钟+"每按一次分钟加1,按"分钟-"每按一次分钟减1
;/**********************************************************************************************/
;/************************ 端口定义 *************************/
;/**********************************************************************************************/
DISP_DUAN EQU P0
DISP_WEI EQU P2
DISP_WEI_SEC EQU P1
K1 EQU P2.4
K2 EQU P2.5
K3 EQU P2.6
K4 EQU P2.7
SEC_LED EQU P1.0
HOU EQU 34H //time
MIN EQU 35H
SEC EQU 36H
;/**********************************************************************************************/
;/************************ 主程序 ***************************/
;/**********************************************************************************************/
ORG 0000H
SJMP MAIN
ORG 000BH
LJMP TIME0
ORG 0030H
MAIN: LCALL INIT
LOOP: LCALL DISPLAY
LCALL IN_KEY
SJMP LOOP
;/**********************************************************************************************/
;/************************ 初始化程序 ***************************/
;/**********************************************************************************************/
INIT: MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
MOV HOU,#12
MOV MIN,#00
MOV SEC,#00
RET
;/**********************************************************************************************/
;/************************ 按键子程序 *************************/
;/**********************************************************************************************/
IN_KEY:
MOV A,DISP_WEI
ANL A,#0F0H
CJNE A,#0F0H,KEY_LOOP
SJMP EXIT_KEY
KEY_LOOP: CALL DISPLAY
MOV A,DISP_WEI
ANL A,#0F0H
CJNE A,#0F0H,KEY_LOOP2
SJMP EXIT_KEY
KEY_LOOP2:JNB K1,HOU_ADD
JNB K2,HOU_SUBB
JNB K3,MIN_ADD
JNB K4,MIN_SUBB
SJMP EXIT_KEY
;/*************************************/
HOU_ADD: CALL DISPLAY
JNB K1,HOU_ADD
MOV A,HOU
CJNE A,#23,HOU_ADD2
MOV HOU,#00
SJMP EXIT_KEY
HOU_ADD2: INC HOU
SJMP EXIT_KEY
;/*************************************/
HOU_SUBB: CALL DISPLAY
JNB K2,HOU_SUBB
MOV A,HOU
CJNE A,#00,HOU_SUBB2
MOV HOU,#23
SJMP EXIT_KEY
HOU_SUBB2:SUBB A,#1
MOV HOU,A
SJMP EXIT_KEY
;/*************************************/
MIN_ADD: CALL DISPLAY
JNB K3,MIN_ADD
MOV A,MIN
CJNE A,#59,MIN_ADD2
MOV MIN,#00
SJMP EXIT_KEY
MIN_ADD2: INC MIN
SJMP EXIT_KEY
;/*************************************/
MIN_SUBB: CALL DISPLAY
JNB K4,MIN_SUBB
MOV A,MIN
CJNE A,#00,MIN_SUBB2
MOV MIN,#59
SJMP EXIT_KEY
MIN_SUBB2:SUBB A,#1
MOV MIN,A
SJMP EXIT_KEY
;/*************************************/
EXIT_KEY: RET
;/**********************************************************************************************/
;/************************ 时间显示子程序 *************************/
;/**********************************************************************************************/
DISPLAY:
MOV DISP_DUAN,#0FFH
MOV DISP_WEI,#0FFH
MOV DISP_WEI_SEC,#0FFH
MOV DPTR,#TABLE
MOV R0,#34H
MOV 40H,#2
MOV 41H,#0
MOV 42H,#0FEH
DISP_1:
MOV A,@R0
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV DISP_DUAN,A
MOV DISP_WEI,42H
ACALL DELAY
MOV DISP_WEI,#0FFH
MOV A,42H
RL A
MOV 42H,A
MOV A,B
MOVC A,@A+DPTR
MOV DISP_DUAN,A
MOV DISP_WEI,42H
ACALL DELAY
MOV DISP_WEI,#0FFH
INC R0
INC 41H
MOV A,42H
RL A
MOV 42H,A
DJNZ 40H,DISP_1 /*******************************************************/
//*********************************************************************************************
MOV A,@R0 //这段程序是秒显示,可以不用,在原理图中的数码管是独立的
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV DISP_DUAN,A
MOV DISP_WEI_SEC,#7FH //////////
ACALL DELAY
MOV DISP_WEI_SEC,#0FFH //////////
//INC R0
MOV A,42H
RL A
MOV 42H,A
MOV A,B
MOVC A,@A+DPTR
MOV DISP_DUAN,A
MOV DISP_WEI_SEC,#0BFH ///////////
ACALL DELAY
MOV DISP_WEI_SEC,#0FFH ///////////
// INC R0
MOV A,42H
RL A
MOV 42H,A /*******************************************************/
//*********************************************************************************************
RET
;/**********************************************************************************************/
;/************************ 延时子程序1S **********************/
;/**********************************************************************************************/
DELAY1S : MOV 44H,#200
DELAY21: MOV 43H,#255
DJNZ 43H,$
DJNZ 44H,DELAY21
RET
;/**********************************************************************************************/
;/************************ 延时子程序 ***********************/
;/**********************************************************************************************/
DELAY : MOV 44H,#25
DELAY1: MOV 43H,#25
DJNZ 43H,$
DJNZ 44H,DELAY1
RET
;/**********************************************************************************************/
;/************************ 定时器子程序 ***************************/
;/**********************************************************************************************/
TIME0:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#3CH
MOV TL0,#0B0H
INC R7
MOV A,R7
CJNE A,#20,EXIT
MOV R7,#0
LCALL TIME_CALC
EXIT: POP ACC
POP DPL
POP DPH
RETI
;/**********************************************************************************************/
;/************************ 定时器时间计算子程序 ***************************/
;/**********************************************************************************************/
TIME_CALC:
MOV A,SEC
CJNE A,#59,EXIT_TIME_SEC
MOV SEC,#00
MOV A,MIN
CJNE A,#59,EXIT_TIME_MIN
MOV MIN,#00
MOV A,HOU
CJNE A,#23,EXIT_TIME_HOU
MOV HOU,#00
SJMP EXIT_TIME_CALC
EXIT_TIME_SEC:
MOV A,SEC
ADD A,#1
MOV SEC,A
SJMP EXIT_TIME_CALC
EXIT_TIME_MIN:
MOV A,MIN
ADD A,#1
MOV MIN,A
SJMP EXIT_TIME_CALC
EXIT_TIME_HOU:
MOV A,HOU
ADD A,#1
MOV HOU,A
SJMP EXIT_TIME_CALC
EXIT_TIME_CALC:
RET
;/**********************************************************************************************/
;/************************ 数码管断码表 ***************************/
;/**********************************************************************************************/
TABLE:
DB 0C0H //0
DB 0F9H //1
DB 0A4H //2
DB 0B0H //3
DB 99H //4
DB 92H //5
DB 82H //6
DB 0F8H //7
DB 80H //8
DB 90H //9
DB 88H //A 10
DB 83H //B 11
DB 0C6H //C 12
DB 0A1H //D 13
DB 86H //E 14
DB 8EH //F 15
DB 8BH //h 16
DB 89H //H 17
DB 0A3H //o 18
DB 0C1H //U 19
DB 0AAH //M 20
DB 0CFH //I 21
DB 0C8H //N 22
DB 0BFH //- 23
;/**********************************************************************************************/
;/************************ 程序结束 ***************************/
;/**********************************************************************************************/
END