⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.src

📁 C51单片机的C语言例程,可实现定时器中断及其时钟功能的源代码
💻 SRC
📖 第 1 页 / 共 2 页
字号:
; .\clock.SRC generated from: clock.c
; COMPILER INVOKED BY:
;        D:\KeilC51\C51\BIN\C51.EXE clock.c ROM(COMPACT) BROWSE DEFINE(evalboard) DEBUG OBJECTEXTEND LISTINCLUDE SYMBOLS SRC(.\clock.SRC)


NAME	CLOCK

?PR?clock_init?CLOCK SEGMENT CODE INBLOCK 
?PR?clock_update?CLOCK                   SEGMENT CODE INBLOCK 
?XD?CLOCK            SEGMENT XDATA 
?PR?_clock_set?CLOCK SEGMENT CODE INBLOCK 
?PR?_clock_scan?CLOCK                    SEGMENT CODE INBLOCK 
?PR?clock_out_time?CLOCK                 SEGMENT CODE INBLOCK 
?DT?clock_out_time?CLOCK                 SEGMENT DATA OVERLAYABLE 
?PR?_strtotm?CLOCK   SEGMENT CODE INBLOCK 
?DT?_strtotm?CLOCK   SEGMENT DATA OVERLAYABLE 
?PR?_alarm_set?CLOCK SEGMENT CODE INBLOCK 
?PR?alarm_clr?CLOCK  SEGMENT CODE INBLOCK 
?PR?alarm_out_time?CLOCK                 SEGMENT CODE INBLOCK 
?DT?alarm_out_time?CLOCK                 SEGMENT DATA OVERLAYABLE 
?CO?CLOCK            SEGMENT CODE 
?C_INITSEG           SEGMENT CODE 
?DT?CLOCK            SEGMENT DATA 
?XD?clock_out_time?CLOCK                 SEGMENT XDATA OVERLAYABLE 
?XD?alarm_out_time?CLOCK                 SEGMENT XDATA OVERLAYABLE 
	EXTRN	CODE (_timer0_elapsed_count)
	EXTRN	CODE (cmdb_prompt)
	EXTRN	CODE (_DISPLY)
	EXTRN	CODE (_com_puts)
	EXTRN	CODE (_isdigit)
	EXTRN	CODE (timer0_count)
	EXTRN	CODE (_strlen)
	EXTRN	CODE (_com_putchar)
	EXTRN	CODE (?C?LSTKXDATA)
	EXTRN	CODE (?C?LSTXDATA)
	EXTRN	CODE (?C?ULCMP)
	EXTRN	CODE (?C?ULDIV)
	EXTRN	CODE (?C?UIDIV)
	EXTRN	CODE (?C?CLDPTR)
	EXTRN	CODE (?C?CLDOPTR)
	EXTRN	CODE (?C?LSTPTR)
	EXTRN	CODE (?C?LLDPTR)
	EXTRN	CODE (?C?LMUL)
	PUBLIC	alarm_out_time
	PUBLIC	alarm_clr
	PUBLIC	_alarm_set
	PUBLIC	?_strtotm?BYTE
	PUBLIC	_strtotm
	PUBLIC	clock_out_time
	PUBLIC	_clock_scan
	PUBLIC	_clock_set
	PUBLIC	clock_update
	PUBLIC	clock_init

	RSEG  ?DT?_strtotm?CLOCK
?_strtotm?BYTE:
          t?549:   DS   3
          s?550:   DS   3
	ORG  6
         s2?551:   DS   3
        tmp?552:   DS   1

	RSEG  ?DT?clock_out_time?CLOCK
?clock_out_time?BYTE:
      hsecs?444:   DS   2
       secs?445:   DS   2
       mins?446:   DS   2
          t?448:   DS   4

	RSEG  ?DT?alarm_out_time?CLOCK
?alarm_out_time?BYTE:
       mins?855:   DS   2

	RSEG  ?XD?CLOCK
last_daysecs?140:   DS   4
      scan_flag:   DS   1
       alm_flag:   DS   1
      last_tick:   DS   2
       dayhsecs:   DS   4
        almmins:   DS   2

	RSEG  ?DT?CLOCK
             dg:   DS   8

	RSEG  ?XD?clock_out_time?CLOCK
        buf?443:   DS   21

	RSEG  ?XD?alarm_out_time?CLOCK
        buf?854:   DS   21

	RSEG  ?CO?CLOCK
?SC_0:
	DB  00DH,00AH,000H

?SC_3:
	DB  00DH,00AH,'N' ,'o' ,'n' ,'e' ,00DH,00AH,000H


	RSEG ?PR?_strtotm?CLOCK

	RSEG  ?C_INITSEG
	DB	008H
	DB	dg
	DB	000H
	DB	000H
	DB	00AH
	DB	000H
	DB	000H
	DB	00AH
	DB	000H
	DB	000H

; #include <ctype.h>
; #include <string.h>
; #include <stdio.h>
; #include "tdp.h"
; #ifdef evalboard           /* 采用硬件目标板时需要使用以下外部函数 */
; extern void DINPUT(unsigned char aa, unsigned char bb);
; extern void DISPLY(unsigned char data *cc);
; #endif
; 
; /* 全局变量定义  */
; static xdata unsigned long dayhsecs;
; static xdata unsigned last_tick;
; static xdata unsigned char scan_flag;
; static xdata unsigned char alm_flag;
; static xdata unsigned almmins;
; 
; #define MAX_HSEC_DAY	(100 * 60 * 60 * 24)
; #ifdef evalboard           /* 采用硬件目标板时需要使用以下数组 */
; static unsigned char data dg[]={0,0,10,0,0,10,0,0};
; #endif
; 
; /* 时钟初始化函数 */
; void clock_init (void) {

	RSEG  ?PR?clock_init?CLOCK
clock_init:
	USING	0
			; SOURCE LINE # 23
; 	scan_flag = 0;
			; SOURCE LINE # 24
	CLR  	A
	MOV  	DPTR,#scan_flag
	MOVX 	@DPTR,A
; 	alm_flag = 0;
			; SOURCE LINE # 25
	INC  	DPTR
	MOVX 	@DPTR,A
; 	dayhsecs = 0L;
			; SOURCE LINE # 26
	MOV  	DPTR,#dayhsecs
	LCALL	?C?LSTKXDATA
	DB   	00H
	DB   	00H
	DB   	00H
	DB   	00H
; 	last_tick = timer0_count ();
			; SOURCE LINE # 27
	LCALL	timer0_count
	MOV  	DPTR,#last_tick
	MOV  	A,R6
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 28
	RET  	
; END OF clock_init

; 
; /* 时钟更新函数 */
; void clock_update (void) {

	RSEG  ?PR?clock_update?CLOCK
clock_update:
	USING	0
			; SOURCE LINE # 31
; 	static xdata unsigned long last_daysecs;
; 	dayhsecs += timer0_elapsed_count (last_tick);
			; SOURCE LINE # 33
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	PUSH 	AR0
	PUSH 	AR1
	PUSH 	AR2
	PUSH 	AR3
	MOV  	DPTR,#last_tick
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	_timer0_elapsed_count
	CLR  	A
	MOV  	R4,A
	MOV  	R5,A
	POP  	AR3
	POP  	AR2
	POP  	AR1
	POP  	AR0
	MOV  	A,R3
	ADD  	A,R7
	MOV  	R7,A
	MOV  	A,R2
	ADDC 	A,R6
	MOV  	R6,A
	MOV  	A,R5
	ADDC 	A,R1
	MOV  	R5,A
	MOV  	A,R4
	ADDC 	A,R0
	MOV  	R4,A
	MOV  	DPTR,#dayhsecs
	LCALL	?C?LSTXDATA
; 	last_tick = timer0_count ();
			; SOURCE LINE # 34
	LCALL	timer0_count
	MOV  	DPTR,#last_tick
	MOV  	A,R6
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
?C0002:
; 	while (dayhsecs >= MAX_HSEC_DAY)
			; SOURCE LINE # 35
	MOV  	R7,#00H
	MOV  	R6,#0D6H
	MOV  	R5,#0FFH
	MOV  	R4,#0FFH
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	CLR  	C
	LCALL	?C?ULCMP
	JC   	?C0003
; 	  dayhsecs -= MAX_HSEC_DAY;
			; SOURCE LINE # 36
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	SUBB 	A,#00H
	MOV  	R7,A
	MOV  	A,R6
	SUBB 	A,#0D6H
	MOV  	R6,A
	MOV  	A,R5
	SUBB 	A,#0FFH
	MOV  	R5,A
	MOV  	A,R4
	SUBB 	A,#0FFH
	MOV  	R4,A
	MOV  	DPTR,#dayhsecs
	LCALL	?C?LSTXDATA
	SJMP 	?C0002
?C0003:
; 	if ((dayhsecs / 100) == last_daysecs)
			; SOURCE LINE # 37
	CLR  	A
	MOV  	R3,#064H
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?ULDIV
	MOV  	DPTR,#last_daysecs?140
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	CLR  	C
	LCALL	?C?ULCMP
	JZ   	?C0005
?C0004:
; 	  return;
; 	last_daysecs = dayhsecs / 100;
			; SOURCE LINE # 39
	CLR  	A
	MOV  	R3,#064H
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?ULDIV
	MOV  	DPTR,#last_daysecs?140
	LCALL	?C?LSTXDATA
; 	if (alm_flag != 0)
			; SOURCE LINE # 40
	MOV  	DPTR,#alm_flag
	MOVX 	A,@DPTR
	JZ   	?C0006
; 	  if ((dayhsecs / (100 * 60)) == almmins)
			; SOURCE LINE # 41
	CLR  	A
	MOV  	R3,#070H
	MOV  	R2,#017H
	MOV  	R1,A
	MOV  	R0,A
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	LCALL	?C?ULDIV
	MOV  	R0,AR4
	MOV  	R1,AR5
	MOV  	R2,AR6
	MOV  	R3,AR7
	MOV  	DPTR,#almmins
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	A
	MOV  	R4,A
	MOV  	R5,A
	CLR  	C
	LCALL	?C?ULCMP
	JNZ  	?C0006
;     	com_putchar ('\x7');
			; SOURCE LINE # 42
	MOV  	R7,#07H
	LCALL	_com_putchar
?C0006:
; 	if (scan_flag != 0)  {
			; SOURCE LINE # 43
	MOV  	DPTR,#scan_flag
	MOVX 	A,@DPTR
	JZ   	?C0005
; 	  clock_out_time ();
			; SOURCE LINE # 44
	LCALL	clock_out_time
; 	  cmdb_prompt ();
			; SOURCE LINE # 45
	LCALL	cmdb_prompt
; 	}
			; SOURCE LINE # 46
; }
			; SOURCE LINE # 47
?C0005:
	RET  	
; END OF clock_update

; 
; /* 时钟设置函数 */
; void clock_set ( unsigned long sethsec)	 {

	RSEG  ?PR?_clock_set?CLOCK
_clock_set:
	USING	0
			; SOURCE LINE # 50
;---- Variable 'sethsec?241' assigned to Register 'R4/R5/R6/R7' ----
; 	dayhsecs = sethsec;
			; SOURCE LINE # 51
	MOV  	DPTR,#dayhsecs
	LCALL	?C?LSTXDATA
; 	last_tick = timer0_count ();
			; SOURCE LINE # 52
	LCALL	timer0_count
	MOV  	DPTR,#last_tick
	MOV  	A,R6
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
; 	clock_update ();
			; SOURCE LINE # 53
	LJMP 	clock_update
; END OF _clock_set

; }
; 
; /* 时钟扫描函数 */
; void clock_scan (unsigned char flag)  {

	RSEG  ?PR?_clock_scan?CLOCK
_clock_scan:
			; SOURCE LINE # 57
;---- Variable 'flag?342' assigned to Register 'R7' ----
; 	scan_flag = flag;
			; SOURCE LINE # 58
	MOV  	DPTR,#scan_flag
	MOV  	A,R7
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 59
	RET  	
; END OF _clock_scan

; 
; /* 时间输出函数 */
; void clock_out_time (void)  {

	RSEG  ?PR?clock_out_time?CLOCK
clock_out_time:
	USING	0
			; SOURCE LINE # 62
; 	xdata char buf [21];
; 	unsigned hsecs,  secs,  mins,  hours;
; 	unsigned long t;
; 
; 	t = dayhsecs;
			; SOURCE LINE # 67
	MOV  	DPTR,#dayhsecs
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	t?448+03H,A
	MOV  	t?448+02H,R6
	MOV  	t?448+01H,R5
	MOV  	t?448,R4
; 	hsecs = t % 100;
			; SOURCE LINE # 68
	CLR  	A
	MOV  	R3,#064H
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	MOV  	R7,t?448+03H
	MOV  	R6,t?448+02H
	MOV  	R5,t?448+01H
	MOV  	R4,t?448
	LCALL	?C?ULDIV
	MOV  	R6,AR2
	MOV  	R7,AR3
	MOV  	hsecs?444,R6
	MOV  	hsecs?444+01H,R7
; 	t /= 100;
			; SOURCE LINE # 69
	MOV  	R7,t?448+03H
	MOV  	R6,t?448+02H
	MOV  	R5,t?448+01H
	MOV  	R4,t?448
	CLR  	A
	MOV  	R3,#064H
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	LCALL	?C?ULDIV
	MOV  	t?448+03H,R7
	MOV  	t?448+02H,R6
	MOV  	t?448+01H,R5
	MOV  	t?448,R4
; 	secs  = t % 60;
			; SOURCE LINE # 70
	CLR  	A
	MOV  	R3,#03CH
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	LCALL	?C?ULDIV
	MOV  	R6,AR2
	MOV  	R7,AR3
	MOV  	secs?445,R6
	MOV  	secs?445+01H,R7
; 	t /= 60;
			; SOURCE LINE # 71
	MOV  	R7,t?448+03H
	MOV  	R6,t?448+02H
	MOV  	R5,t?448+01H
	MOV  	R4,t?448
	CLR  	A
	MOV  	R3,#03CH
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	LCALL	?C?ULDIV
	MOV  	t?448+03H,R7
	MOV  	t?448+02H,R6
	MOV  	t?448+01H,R5
	MOV  	t?448,R4
; 	mins  = t % 60;
			; SOURCE LINE # 72
	CLR  	A
	MOV  	R3,#03CH
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	LCALL	?C?ULDIV
	MOV  	R6,AR2
	MOV  	R7,AR3
	MOV  	mins?446,R6
	MOV  	mins?446+01H,R7
; 	t /= 60;
			; SOURCE LINE # 73
	MOV  	R7,t?448+03H
	MOV  	R6,t?448+02H
	MOV  	R5,t?448+01H
	MOV  	R4,t?448
	CLR  	A
	MOV  	R3,#03CH
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	LCALL	?C?ULDIV
	MOV  	t?448+03H,R7
	MOV  	t?448+02H,R6
	MOV  	t?448+01H,R5
	MOV  	t?448,R4
; 	hours = t % 24;
			; SOURCE LINE # 74
	CLR  	A
	MOV  	R3,#018H
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R0,A
	LCALL	?C?ULDIV
;---- Variable 'hours?447' assigned to Register 'R2/R3' ----
; 
; 	buf [0]  = (hours / 10) + '0';
			; SOURCE LINE # 76
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
	MOV  	A,R7
	ADD  	A,#030H
	MOV  	DPTR,#buf?443
	MOVX 	@DPTR,A
; 	buf [1]  = (hours % 10) + '0';
			; SOURCE LINE # 77
	MOV  	R6,AR2
	MOV  	R7,AR3
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	A,R5

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -