📄 time.lis
字号:
.module time.c
.area data(ram, con, rel)
0000 _Hour::
0000 .blkb 1
.area idata
0000 0C .byte 12
.area data(ram, con, rel)
0001 _Minute::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 _Second::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 _Count2::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
.area text(rom, con, rel)
; time -> R16,R17
; buffer -> y+0
.even
0000 _timer2_init::
0000 2697 sbiw R28,6
0002 ; /*****************************************************************************/
0002 ; #include "time.h"
0002 ; #include "GUI.h"
0002 ; /*****************************************************************************/
0002 ;
0002 ; INT8U Hour=12;
0002 ; INT8U Minute=0;
0002 ; INT8U Second=0;
0002 ;
0002 ; INT8U Count2=0;
0002 ;
0002 ; // Target : M64
0002 ; // Crystal: 16.000Mhz
0002 ; //TIMER2 initialize - prescale:1024
0002 ; // WGM: Normal
0002 ; // desired value: 10mSec
0002 ; // actual value: 9.984mSec (0.2%)
0002 ; void timer2_init(void)
0002 ; {
0002 ; #if DATE_TIME_EN==1
0002 ; INT8U *time=__TIME__;
0002 00E0 ldi R16,<L2
0004 10E0 ldi R17,>L2
0006 ; INT8U buffer[6];
0006 ; #endif
0006 ; TCCR2 = 0x00; //stop
0006 2224 clr R2
0008 25BC out 0x25,R2
000A ; TCNT2 = 0x64; //setup
000A 84E6 ldi R24,100
000C 84BD out 0x24,R24
000E ; OCR2 = 0x9C;
000E 8CE9 ldi R24,156
0010 83BD out 0x23,R24
0012 ; TCCR2 = 0x05; //start
0012 85E0 ldi R24,5
0014 85BD out 0x25,R24
0016 ;
0016 ; #if DATE_TIME_EN==1
0016 ; buffer[0]=time[0]-'0';
0016 F801 movw R30,R16
0018 8081 ldd R24,z+0
001A 8053 subi R24,48
001C 8883 std y+0,R24
001E ; buffer[1]=time[1]-'0';
001E 8181 ldd R24,z+1
0020 8053 subi R24,48
0022 8983 std y+1,R24
0024 ;
0024 ; buffer[2]=time[3]-'0';
0024 F801 movw R30,R16
0026 8381 ldd R24,z+3
0028 8053 subi R24,48
002A 8A83 std y+2,R24
002C ; buffer[3]=time[4]-'0';
002C F801 movw R30,R16
002E 8481 ldd R24,z+4
0030 8053 subi R24,48
0032 8B83 std y+3,R24
0034 ;
0034 ; buffer[4]=time[6]-'0';
0034 F801 movw R30,R16
0036 8681 ldd R24,z+6
0038 8053 subi R24,48
003A 8C83 std y+4,R24
003C ; buffer[5]=time[7]-'0';
003C F801 movw R30,R16
003E 8781 ldd R24,z+7
0040 8053 subi R24,48
0042 8D83 std y+5,R24
0044 ;
0044 ; Hour =buffer[0]*10+buffer[1];
0044 2880 ldd R2,y+0
0046 8AE0 ldi R24,10
0048 829D mul R24,R2
004A 2980 ldd R2,y+1
004C 302C mov R3,R0
004E 320C add R3,R2
0050 30920000 sts _Hour,R3
0054 ; Minute=buffer[2]*10+buffer[3];
0054 2A80 ldd R2,y+2
0056 829D mul R24,R2
0058 2B80 ldd R2,y+3
005A 302C mov R3,R0
005C 320C add R3,R2
005E 30920100 sts _Minute,R3
0062 ; Second=buffer[4]*10+buffer[5];
0062 2C80 ldd R2,y+4
0064 829D mul R24,R2
0066 2D80 ldd R2,y+5
0068 302C mov R3,R0
006A 320C add R3,R2
006C 30920200 sts _Second,R3
0070 ; #endif
0070 ; TIMSK |= 0x40; //timer interrupt sources
0070 87B7 in R24,0x37
0072 8064 ori R24,64
0074 87BF out 0x37,R24
0076 L1:
0076 2696 adiw R28,6
0078 .dbline 0 ; func end
0078 0895 ret
.area vector(rom, abs)
.org 40
0028 0C943D00 jmp _timer2_ovf_isr
.area text(rom, con, rel)
.even
007A _timer2_ovf_isr::
007A 2A92 st -y,R2
007C 8A93 st -y,R24
007E 9A93 st -y,R25
0080 2FB6 in R2,0x3f
0082 2A92 st -y,R2
0084 ; }
0084 ;
0084 ; #pragma interrupt_handler timer2_ovf_isr:11
0084 ; void timer2_ovf_isr(void)
0084 ; {
0084 ; TCNT2 = 0x64; //reload counter value
0084 84E6 ldi R24,100
0086 84BD out 0x24,R24
0088 ; Count2++;
0088 80910300 lds R24,_Count2
008C 8F5F subi R24,255 ; addi 1
008E 80930300 sts _Count2,R24
0092 ; if(Count2>99)
0092 83E6 ldi R24,99
0094 20900300 lds R2,_Count2
0098 8215 cp R24,R2
009A 40F4 brsh L14
009C ; {
009C ; Count2=0;
009C 2224 clr R2
009E 20920300 sts _Count2,R2
00A2 ; Second++;
00A2 80910200 lds R24,_Second
00A6 8F5F subi R24,255 ; addi 1
00A8 80930200 sts _Second,R24
00AC ; }
00AC L14:
00AC ; if(Second>59)
00AC 8BE3 ldi R24,59
00AE 20900200 lds R2,_Second
00B2 8215 cp R24,R2
00B4 40F4 brsh L16
00B6 ; {
00B6 ; Second=0;
00B6 2224 clr R2
00B8 20920200 sts _Second,R2
00BC ; Minute++;
00BC 80910100 lds R24,_Minute
00C0 8F5F subi R24,255 ; addi 1
00C2 80930100 sts _Minute,R24
00C6 ; }
00C6 L16:
00C6 ; if(Minute>59)
00C6 8BE3 ldi R24,59
00C8 20900100 lds R2,_Minute
00CC 8215 cp R24,R2
00CE 40F4 brsh L18
00D0 ; {
00D0 ; Minute=0;
00D0 2224 clr R2
00D2 20920100 sts _Minute,R2
00D6 ; Hour++;
00D6 80910000 lds R24,_Hour
00DA 8F5F subi R24,255 ; addi 1
00DC 80930000 sts _Hour,R24
00E0 ; }
00E0 L18:
00E0 ; if(Hour>23)
00E0 87E1 ldi R24,23
00E2 20900000 lds R2,_Hour
00E6 8215 cp R24,R2
00E8 18F4 brsh L20
00EA ; Hour=0;
00EA 2224 clr R2
00EC 20920000 sts _Hour,R2
00F0 L20:
00F0 L13:
00F0 2990 ld R2,y+
00F2 2FBE out 0x3f,R2
00F4 9991 ld R25,y+
00F6 8991 ld R24,y+
00F8 2990 ld R2,y+
00FA .dbline 0 ; func end
00FA 1895 reti
00FC ; res2 -> R22,R23
00FC ; year -> R20,R21
00FC ; res1 -> R10,R11
00FC ; date -> R22
00FC ; month -> R10
00FC ; res -> R20,R21
.even
00FC _fs_getDate::
00FC 0E940000 xcall push_gset4
0100 ; }
0100 ;
0100 ;
0100 ; INT16U fs_getDate(void)
0100 ; {
0100 ; #if DATE_TIME_EN==0
0100 ; return(0);
0100 ; #else
0100 ; INT8U month,date ;
0100 ; INT16U year ;
0100 ; INT16U res,res1,res2;
0100 ;
0100 ; year=time_getYear()-1980 ;
0100 94D0 xcall _fs_getYear
0102 A801 movw R20,R16
0104 4C5B subi R20,188
0106 5740 sbci R21,7
0108 ; month=time_getMonth();
0108 93D0 xcall _fs_getMonth
010A A02E mov R10,R16
010C ; date=time_getDay();
010C 93D0 xcall _fs_getDay
010E 602F mov R22,R16
0110 ;
0110 ; res=( (year>127)?127:(year&0x3F) );
0110 8FE7 ldi R24,127
0112 90E0 ldi R25,0
0114 8417 cp R24,R20
0116 9507 cpc R25,R21
0118 10F4 brsh L23
011A 6C01 movw R12,R24
011C 04C0 xjmp L24
011E L23:
011E CA01 movw R24,R20
0120 8F73 andi R24,63
0122 9070 andi R25,0
0124 6C01 movw R12,R24
0126 L24:
0126 A601 movw R20,R12
0128 ; res=res<<9;
0128 29E0 ldi R18,9
012A 30E0 ldi R19,0
012C 8A01 movw R16,R20
012E 0E940000 xcall lsl16
0132 A801 movw R20,R16
0134 ;
0134 ; res1=( (month==0||month>12)?1:(month&0xF) );
0134 AA20 tst R10
0136 19F0 breq L27
0138 8CE0 ldi R24,12
013A 8A15 cp R24,R10
013C 20F4 brsh L25
013E L27:
013E 81E0 ldi R24,1
0140 90E0 ldi R25,0
0142 6C01 movw R12,R24
0144 05C0 xjmp L26
0146 L25:
0146 8A2D mov R24,R10
0148 9927 clr R25
014A 8F70 andi R24,15
014C 9070 andi R25,0
014E 6C01 movw R12,R24
0150 L26:
0150 5601 movw R10,R12
0152 ; res1=res1<<5;
0152 25E0 ldi R18,5
0154 30E0 ldi R19,0
0156 8501 movw R16,R10
0158 0E940000 xcall lsl16
015C 5801 movw R10,R16
015E ;
015E ; res2=( (date==0||date>31)?1:(date&0x1F) );
015E 6623 tst R22
0160 19F0 breq L30
0162 8FE1 ldi R24,31
0164 8617 cp R24,R22
0166 20F4 brsh L28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -