📄 time.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 + -