📄 timer.asm
字号:
/************************************************************/
/* 程序名称: 时、分、秒计时器设计 */
/* 功能: 动态显示六位数字,可以通过按键调整时间 */
/* 设计者: 代云启; */
/* EMEL: yunqi145@yahoo.com.cn; QQ: 99399143 */
/* Date: 2007-05-05 */
/************************************************************/
/************************* 主程序 ***************************/
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0
MAIN: MOV SP, #6FH
MOV R5, #08H
MOV R0, #20H
MOV 2AH, #00H
MOV 2BH, #00H
MOV 2CH, #00H
MOV TMOD, #01H
MOV TH0, #0ECH
MOV TL0, #78H
SETB EA
SETB ET0
MOV R4, #200
SETB TR0
/********************************************************/
/* 以下为循环扫描按键以检测外界对时、分、秒的设置和修改 */
/* 其中,K1、K2、K3为加1调整,K4、K5、K6为减1调整,K8为 */
/* 清零按钮 */
/********************************************************/
LOOP: JB P1.7, NEXT2 /* K7复位键检测 */
LCALL DELAY
JB P1.7, NEXT2
NEXT1: JNB P1.7, NEXT1
MOV 2CH, #00H
MOV 2BH, #00H
MOV 2AH, #00H
NEXT2: JB P1.0, NEXT4 /* K1、K2、K3键检测 */
LCALL DELAY
JB P1.0, NEXT4
NEXT3: JNB P1.0, NEXT3
MOV A, 2CH
ADD A, #01H
DA A
MOV 2CH, A
CJNE A, #60H, NEXT4
MOV 2CH, #00H
NEXT4: JB P1.1, NEXT6
ACALL DELAY
JB P1.1, NEXT6
NEXT5: JNB P1.1, NEXT5
MOV A, 2BH
ADD A, #01H
DA A
MOV 2BH, A
CJNE A, #60H, NEXT6
MOV 2BH, #00H
NEXT6: JB P1.2, NEXT8
ACALL DELAY
JB P1.2, NEXT8
NEXT7: JNB P1.2, NEXT7
MOV A, 2AH
ADD A, #1H
DA A
MOV 2AH, A
CJNE A, #24H, NEXT8
MOV 2AH, #00H
NEXT8: JB P1.3, NEXT10 //* K4、K5、K6键检测
ACALL DELAY
JB P1.3, NEXT10
NEXT9: JNB P1.3, NEXT9
MOV A, 2CH
CLR C
SUBB A, #01H
MOV 2CH, A
CJNE A, #0FFH, NEXT10
MOV 2CH, #59H
NEXT10: JB P1.4, NEXT12
ACALL DELAY
JB P1.4, NEXT12
NEXT11: JNB P1.4, NEXT11
MOV A, 2BH
CLR C
SUBB A, #01H
MOV 2BH, A
CJNE A, #0FFH, NEXT12
MOV 2BH, #59H
NEXT12: JB P1.5, NEXT14
ACALL DELAY
JB P1.5, NEXT14
NEXT13: JNB P1.5, NEXT13
MOV A, 2AH
CLR C
SUBB A, #01H
MOV 2AH, A
CJNE A, #0FFH, NEXT14
MOV 2AH, #23H
NEXT14: LJMP LOOP
/*******************************************************************************/
/* 以下为T0中断子程序。每500us中断一次,在该子程序中判断是否1s计时到,并做相应 */
/* 调整和处理(CLK_CHANGE子程序和CONVERT子程序),同时实现每5000us的显示更新。 */
/*******************************************************************************/
TIMER0: MOV TH0, #0ECH
MOV TL0, #78H
PUSH ACC
PUSH PSW
DJNZ R4, TIMLP1
MOV R4, #200
ACALL CLK_CHANGE
ACALL CONVERT
TIMLP1: ACALL DISP
POP PSW
POP ACC
RETI
/*******************************************************/
/* DISP子程序实现时、分、秒计时值在数码管上的动态显示,*/
/* 每一次调用(相隔5000us)只驱动显示8个数码管中的一个。 */
/*******************************************************/
DISP: MOV A, 30H /* 循环显示位码*/
MOV DPTR, #BITTAB
MOVC A, @A+DPTR
MOV P2, A
MOV DPTR, #DISTAB /* 查表显示段码*/
MOV A, @R0
MOVC A, @A+DPTR
MOV P0, A
INC 30H
INC R0
DJNZ R5, DISPEND
MOV 30H, #00H
MOV R5, #08H
MOV R0, #20H
DISPEND: RET
BITTAB: DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH /* 位码表,一次只选中一位 */
DISTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH /* "0","1",...."9" */
DB 40H /* "-" */
/*******************************************************/
/* CLK_CHANGE子程序为计时到各时、分、秒数据的处理程序 */
/*******************************************************/
CLK_CHANGE: MOV A, 2CH
ADD A, #1
DA A
MOV 2CH, A
CJNE A, #60H, CLKEND
MOV 2CH, #00
MOV A, 2BH
ADD A, #1
DA A
MOV 2BH, A
CJNE A, #60H, CLKEND
MOV 2BH, #00
MOV A, 2AH
ADD A, #1
DA A
MOV 2AH, A
CJNE A, #24H, CLKEND
MOV 2AH, #00
CLKEND: RET
/***************************************************************/
/* CONVERT子程序实现时、分、秒计时值转换为BCD码并存储在以20H为 */
/* 起始地址的显示输出数据存储单元里,即显示缓冲区20H到25H单元。*/
/***************************************************************/
CONVERT: MOV R1, #20H
MOV A, 2CH
ANL A, #0FH
MOV @R1, A
INC R1
MOV A, 2CH
ANL A, #0F0H
SWAP A
MOV @R1, A
INC R1
MOV @R1, #0AH
INC R1
MOV A, 2BH
ANL A, #0FH
MOV @R1, A
INC R1
MOV A, 2BH
ANL A, #0F0H
SWAP A
MOV @R1, A
INC R1
MOV @R1, #0AH
INC R1
MOV A, 2AH
ANL A, #0FH
MOV @R1, A
INC R1
MOV A, 2AH
ANL A, #0F0H
SWAP A
MOV @R1, A
RET
/****************************************************************/
/* DELAY子程序。实现延时约5ms(晶振12MHz,机器周期为1us),执行一个 */
/* 指令花2个机器周期,所以共需计数2500次。即5ms=2us*2500。 */
/****************************************************************/
DELAY: MOV R6, #10
D1: MOV R7, #250
DJNZ R7, $
DJNZ R6, D1
RET
END
/***************************程序结束****************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -