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

📄 time.s

📁 Atmega64单片机程序(完整工程)
💻 S
字号:
	.module time.c
	.area data(ram, con, rel)
_Hour::
	.blkb 1
	.area idata
	.byte 12
	.area data(ram, con, rel)
_Minute::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
_Second::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
_Count2::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.area text(rom, con, rel)
;           time -> R16,R17
;         buffer -> y+0
	.even
_timer2_init::
	sbiw R28,6
; /*****************************************************************************/
; #include "time.h"
; #include "GUI.h"
; /*****************************************************************************/
; 
; INT8U Hour=12;
; INT8U Minute=0;
; INT8U Second=0;
; 
; INT8U Count2=0;
; 
; // Target : M64
; // Crystal: 16.000Mhz
; //TIMER2 initialize - prescale:1024
; // WGM: Normal
; // desired value: 10mSec
; // actual value:  9.984mSec (0.2%)
; void timer2_init(void)
; {
; #if DATE_TIME_EN==1  
;     INT8U *time=__TIME__;
	ldi R16,<L2
	ldi R17,>L2
; 	INT8U buffer[6];
; #endif	
;     TCCR2 = 0x00; //stop
	clr R2
	out 0x25,R2
;     TCNT2 = 0x64; //setup
	ldi R24,100
	out 0x24,R24
;     OCR2  = 0x9C;
	ldi R24,156
	out 0x23,R24
;     TCCR2 = 0x05; //start
	ldi R24,5
	out 0x25,R24
; 	
; #if DATE_TIME_EN==1  
;     buffer[0]=time[0]-'0';
	movw R30,R16
	ldd R24,z+0
	subi R24,48
	std y+0,R24
; 	buffer[1]=time[1]-'0';
	ldd R24,z+1
	subi R24,48
	std y+1,R24
; 	
; 	buffer[2]=time[3]-'0';
	movw R30,R16
	ldd R24,z+3
	subi R24,48
	std y+2,R24
; 	buffer[3]=time[4]-'0';
	movw R30,R16
	ldd R24,z+4
	subi R24,48
	std y+3,R24
; 	
; 	buffer[4]=time[6]-'0';
	movw R30,R16
	ldd R24,z+6
	subi R24,48
	std y+4,R24
; 	buffer[5]=time[7]-'0';
	movw R30,R16
	ldd R24,z+7
	subi R24,48
	std y+5,R24
;     
; 	Hour  =buffer[0]*10+buffer[1];
	ldd R2,y+0
	ldi R24,10
	mul R24,R2
	ldd R2,y+1
	mov R3,R0
	add R3,R2
	sts _Hour,R3
; 	Minute=buffer[2]*10+buffer[3];
	ldd R2,y+2
	mul R24,R2
	ldd R2,y+3
	mov R3,R0
	add R3,R2
	sts _Minute,R3
; 	Second=buffer[4]*10+buffer[5];
	ldd R2,y+4
	mul R24,R2
	ldd R2,y+5
	mov R3,R0
	add R3,R2
	sts _Second,R3
; #endif		
;     TIMSK |= 0x40; //timer interrupt sources
	in R24,0x37
	ori R24,64
	out 0x37,R24
L1:
	adiw R28,6
	.dbline 0 ; func end
	ret
	.area vector(rom, abs)
	.org 40
	jmp _timer2_ovf_isr
	.area text(rom, con, rel)
	.even
_timer2_ovf_isr::
	st -y,R2
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
; }
; 
; #pragma interrupt_handler timer2_ovf_isr:11
; void timer2_ovf_isr(void)
; {
;     TCNT2 = 0x64; //reload counter value
	ldi R24,100
	out 0x24,R24
; 	Count2++;
	lds R24,_Count2
	subi R24,255    ; addi 1
	sts _Count2,R24
; 	if(Count2>99)
	ldi R24,99
	lds R2,_Count2
	cp R24,R2
	brsh L14
; 	{
; 	    Count2=0;
	clr R2
	sts _Count2,R2
; 		Second++;
	lds R24,_Second
	subi R24,255    ; addi 1
	sts _Second,R24
; 	}
L14:
; 	if(Second>59)
	ldi R24,59
	lds R2,_Second
	cp R24,R2
	brsh L16
; 	{
; 		Second=0;
	clr R2
	sts _Second,R2
; 	    Minute++;
	lds R24,_Minute
	subi R24,255    ; addi 1
	sts _Minute,R24
; 	}
L16:
; 	if(Minute>59)
	ldi R24,59
	lds R2,_Minute
	cp R24,R2
	brsh L18
; 	{
; 		Minute=0;
	clr R2
	sts _Minute,R2
; 		Hour++;
	lds R24,_Hour
	subi R24,255    ; addi 1
	sts _Hour,R24
; 	}
L18:
; 	if(Hour>23)
	ldi R24,23
	lds R2,_Hour
	cp R24,R2
	brsh L20
; 		Hour=0;
	clr R2
	sts _Hour,R2
L20:
L13:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
;           res2 -> R22,R23
;           year -> R20,R21
;           res1 -> R10,R11
;           date -> R22
;          month -> R10
;            res -> R20,R21
	.even
_fs_getDate::
	xcall push_gset4
; }
; 
; 
; INT16U fs_getDate(void)
; {
;     #if DATE_TIME_EN==0
;         return(0);
;     #else
;         INT8U month,date ;
;         INT16U year ;
; 		INT16U res,res1,res2;
; 		
;         year=time_getYear()-1980 ;
	xcall _fs_getYear
	movw R20,R16
	subi R20,188
	sbci R21,7
;         month=time_getMonth();
	xcall _fs_getMonth
	mov R10,R16
;         date=time_getDay();
	xcall _fs_getDay
	mov R22,R16
; 
; 		res=( (year>127)?127:(year&0x3F) );
	ldi R24,127
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brsh L23
	movw R12,R24
	xjmp L24
L23:
	movw R24,R20
	andi R24,63
	andi R25,0
	movw R12,R24
L24:
	movw R20,R12
; 		res=res<<9;
	ldi R18,9
	ldi R19,0
	movw R16,R20
	xcall lsl16
	movw R20,R16
; 		
; 		res1=( (month==0||month>12)?1:(month&0xF) );
	tst R10
	breq L27
	ldi R24,12
	cp R24,R10
	brsh L25
L27:
	ldi R24,1
	ldi R25,0
	movw R12,R24
	xjmp L26
L25:
	mov R24,R10
	clr R25
	andi R24,15
	andi R25,0
	movw R12,R24
L26:
	movw R10,R12
; 		res1=res1<<5;
	ldi R18,5
	ldi R19,0
	movw R16,R10
	xcall lsl16
	movw R10,R16
; 		
; 		res2=( (date==0||date>31)?1:(date&0x1F) );
	tst R22
	breq L30
	ldi R24,31
	cp R24,R22
	brsh L28
L30:
	ldi R24,1
	ldi R25,0
	movw R12,R24
	xjmp L29
L28:
	mov R24,R22
	clr R25
	andi R24,31
	andi R25,0
	movw R12,R24
L29:
	movw R22,R12
; 		
; 		res=res+res1+res2;
	movw R2,R20
	add R2,R10
	adc R3,R11
	add R2,R12
	adc R3,R13
	movw R20,R2
;         return res;
	movw R16,R2
L22:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
;           res2 -> R22,R23
;           hour -> R20
;         minute -> R10
;           res1 -> R10,R11
;         second -> R22
;            res -> R20,R21
	.even
_fs_getTime::
	xcall push_gset4
;     #endif
; }
; /*****************************************************************************/
; 
; INT16U fs_getTime(void)
; {
;     #if DATE_TIME_EN==0
;         return(0);
;     #else
;         INT8U second,minute,hour ;
; 		INT16U res,res1,res2;
; 
;         second=time_getSecond();
	xcall _fs_getSecond
	mov R22,R16
;         minute=time_getMinute();
	xcall _fs_getMinute
	mov R10,R16
;         hour=time_getHour();
	xcall _fs_getHour
	mov R20,R16
; 
; 		res=( (hour>23)?0:(hour&0x1F) );
	ldi R24,23
	cp R24,R16
	brsh L32
	clr R12
	clr R13
	xjmp L33
L32:
	mov R24,R20
	clr R25
	andi R24,31
	andi R25,0
	movw R12,R24
L33:
	movw R20,R12
; 		res=res<<11;
	ldi R18,11
	ldi R19,0
	movw R16,R20
	xcall lsl16
	movw R20,R16
; 		
; 		res1=( (minute>59)?0:(minute&0x3F) );
	ldi R24,59
	cp R24,R10
	brsh L34
	clr R12
	clr R13
	xjmp L35
L34:
	mov R24,R10
	clr R25
	andi R24,63
	andi R25,0
	movw R12,R24
L35:
	movw R10,R12
; 		res1=res1<<5;
	ldi R18,5
	ldi R19,0
	movw R16,R10
	xcall lsl16
	movw R10,R16
; 		
; 		res2=( (second>59)?0:(second-second%2)/2 );
	ldi R24,59
	cp R24,R22
	brsh L36
	clr R12
	clr R13
	xjmp L37
L36:
	ldi R18,2
	ldi R19,0
	mov R16,R22
	clr R17
	xcall mod16s
	movw R2,R16
	mov R16,R22
	clr R17
	sub R16,R2
	sbc R17,R3
	ldi R18,2
	ldi R19,0
	xcall div16s
	movw R12,R16
L37:
	movw R22,R12
; 		
; 		res=res+res1+res2;
	movw R2,R20
	add R2,R10
	adc R3,R11
	add R2,R12
	adc R3,R13
	movw R20,R2
;         return res;
	movw R16,R2
L31:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.even
_fs_getYear::
;     #endif
; }
; 
; 
; #if DATE_TIME_EN==1
; 
; INT16U fs_getYear(void)
; {
;    return 2008;
	ldi R16,2008
	ldi R17,7
L38:
	.dbline 0 ; func end
	ret
	.even
_fs_getMonth::
; }
; INT8U  fs_getMonth(void)
; {
;    return 5;
	ldi R16,5
L39:
	.dbline 0 ; func end
	ret
	.even
_fs_getDay::
; }
; INT8U  fs_getDay(void)
; {
;    return 20;
	ldi R16,20
L40:
	.dbline 0 ; func end
	ret
	.even
_fs_getHour::
; }
; 
; INT8U  fs_getHour(void)
; {
;    return Hour;
	lds R16,_Hour
L41:
	.dbline 0 ; func end
	ret
	.even
_fs_getMinute::
; }
; INT8U  fs_getMinute(void)
; {
;    return Minute;
	lds R16,_Minute
L42:
	.dbline 0 ; func end
	ret
	.even
_fs_getSecond::
; }
; INT8U  fs_getSecond(void)
; {
;    return Second;
	lds R16,_Second
L43:
	.dbline 0 ; func end
	ret
;           time -> y+1
;             y0 -> R22
;             x0 -> R20
	.even
_GUI_Display_Time::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,10
; }
; 
; 
; extern INT8U LCD_PenColor;
; 
; //液晶显示日期、时间
; void GUI_Display_Time(INT8U x0,INT8U y0)
; {
;     INT8U time[9];
; 	
; 	time[0]=fs_getHour()/10+'0';
	xcall _fs_getHour
	ldi R17,10
	xcall div8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+1,R24
; 	time[1]=fs_getHour()%10+'0';    
	xcall _fs_getHour
	ldi R17,10
	xcall mod8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+2,R24
; 	time[2]=':';  
	ldi R24,58
	std y+3,R24
; 	time[3]=fs_getMinute()/10+'0';
	xcall _fs_getMinute
	ldi R17,10
	xcall div8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+4,R24
; 	time[4]=fs_getMinute()%10+'0'; 
	xcall _fs_getMinute
	ldi R17,10
	xcall mod8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+5,R24
; 	time[5]=':';
	ldi R24,58
	std y+6,R24
; 	time[6]=fs_getSecond()/10+'0';
	xcall _fs_getSecond
	ldi R17,10
	xcall div8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+7,R24
; 	time[7]=fs_getSecond()%10+'0'; 
	xcall _fs_getSecond
	ldi R17,10
	xcall mod8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+8,R24
; 	time[8]='\0';
	clr R2
	std y+9,R2
; 	
; 	LCD_PenColor = 0b11111100;	//blue
	ldi R24,252
	sts _LCD_PenColor,R24
; 	//GUI_DispStringAt(__DATE__,20,16);
;     GUI_DispStringAt(&time[0],x0,y0); 
	std y+0,R22
	mov R18,R20
	movw R16,R28
	subi R16,255  ; offset = 1
	sbci R17,255
	xcall _GUI_DispStringAt
L44:
	adiw R28,10
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.area data(ram, con, rel)
L2:
	.blkb 9
	.area idata
	.byte 50,49,58,53,48,58,48,57,0
	.area data(ram, con, rel)

⌨️ 快捷键说明

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