?? rtc.lst
字號:
__text_start:
__start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT 0x3D,R28
0033 BFDE OUT 0x3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD Y+0,R16
0038 2400 CLR R0
0039 E6EC LDI R30,0x6C
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 37E3 CPI R30,0x73
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD Z+0,R16
0042 E5E4 LDI R30,0x54
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 36E0 CPI R30,0x60
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E0227 CALL _main
_exit:
0050 CFFF RJMP _exit
FILE: G:\AVR系列\RTC\rtc.c
(0001) /******************************************/
(0002)
(0003) /* 目標MCU:MEGA8 晶振:內部RC(INT) 8MHZ */
(0004) /******************************************/
(0005) //說明:ATMEGA8只有在使用內部RC振蕩器,T2使用異步時鐘的
(0006) // 情況下,外接的32.768KHZ的晶振才起作用。
(0007) #include<iom8v.h>
(0008) #include<macros.h>
(0009) #define fosc 8000000
(0010) #define baud 19200
(0011) unsigned char hour;
(0012) unsigned char minute;
(0013) unsigned char second;
(0014) unsigned char day;
(0015) unsigned char month;
(0016) unsigned int year;
(0017) unsigned char mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
(0018)
(0019) /* 調整時間 */
(0020) void putchar(unsigned char c)
(0021) {
(0022) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
0051 9B5D SBIS 0x0B,5
0052 CFFE RJMP _putchar
(0023) UDR=c;
0053 B90C OUT 0x0C,R16
0054 9508 RET
(0024) }
(0025) /* 字符輸入函數 */
(0026) unsigned char getchar(void)
(0027) {
(0028) while(!(UCSRA& (1<<RXC)));
_getchar:
0055 9B5F SBIS 0x0B,7
0056 CFFE RJMP _getchar
(0029) return UDR;
0057 B10C IN R16,0x0C
0058 9508 RET
_puts:
s --> R20
0059 940E0283 CALL push_gset1
005B 01A8 MOVW R20,R16
(0030) }
(0031) /* 字符串輸出函數 */
(0032) void puts(char *s)
(0033) {
005C C005 RJMP 0x0062
(0034) while (*s)
(0035) {
(0036) putchar(*s);
005D 01FA MOVW R30,R20
005E 8100 LDD R16,Z+0
005F DFF1 RCALL _putchar
(0037) s++;
0060 5F4F SUBI R20,0xFF
0061 4F5F SBCI R21,0xFF
0062 01FA MOVW R30,R20
0063 8020 LDD R2,Z+0
0064 2022 TST R2
0065 F7B9 BNE 0x005D
(0038) }
(0039) putchar(0x0a);//回車換行
0066 E00A LDI R16,0xA
0067 DFE9 RCALL _putchar
(0040) putchar(0x0d);
0068 E00D LDI R16,0xD
0069 DFE7 RCALL _putchar
006A 940E0286 CALL pop_gset1
006C 9508 RET
(0041) }
(0042) /* UART初始化 */
(0043) void uart_init(void)
(0044) {
(0045) // OSCCAL=read_flash(osc_address);
(0046) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允許發送和接收
_uart_init:
006D E988 LDI R24,0x98
006E B98A OUT 0x0A,R24
(0047) UBRRL=(fosc/16/(baud+1))%256;
006F E18A LDI R24,0x1A
0070 B989 OUT 0x09,R24
(0048) UBRRH=(fosc/16/(baud+1))/256;
0071 2422 CLR R2
0072 BC20 OUT 0x20,R2
(0049) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位數據+1位STOP位
0073 E886 LDI R24,0x86
0074 BD80 OUT 0x20,R24
0075 9508 RET
(0050) }
(0051)
(0052) void time(void)
(0053) {
(0054) if (second<60)
_time:
0076 91800070 LDS R24,second
0078 338C CPI R24,0x3C
0079 F408 BCC 0x007B
(0055) return;
007A C08A RJMP 0x0105
(0056) else
(0057) {
(0058) second-=60;
007B 91800070 LDS R24,second
007D 538C SUBI R24,0x3C
007E 93800070 STS second,R24
(0059) if (minute<59)
0080 91800071 LDS R24,minute
0082 338B CPI R24,0x3B
0083 F420 BCC 0x0088
(0060) minute++;
0084 5F8F SUBI R24,0xFF
0085 93800071 STS minute,R24
0087 C07D RJMP 0x0105
(0061) else
(0062) {
(0063) minute=0;
0088 2422 CLR R2
0089 92200071 STS minute,R2
(0064) if (hour<23)
008B 91800072 LDS R24,hour
008D 3187 CPI R24,0x17
008E F420 BCC 0x0093
(0065) hour++;
008F 5F8F SUBI R24,0xFF
0090 93800072 STS hour,R24
0092 C072 RJMP 0x0105
(0066) else
(0067) { hour=0;
0093 2422 CLR R2
0094 92200072 STS hour,R2
(0068) if(day<=mon[month-1])
0096 E58F LDI R24,0x5F
0097 E090 LDI R25,0
0098 91E0006E LDS R30,month
009A 27FF CLR R31
009B 0FE8 ADD R30,R24
009C 1FF9 ADC R31,R25
009D 8020 LDD R2,Z+0
009E 9030006F LDS R3,day
00A0 1423 CP R2,R3
00A1 F168 BCS 0x00CF
(0069) { day++;
00A2 2D83 MOV R24,R3
00A3 5F8F SUBI R24,0xFF
00A4 9380006F STS day,R24
(0070) if(((((year%4)==0)&&((year%100)!=0))||((year%400)==0))&&(month==4))
00A6 9180006C LDS R24,year
00A8 9190006D LDS R25,year+1
00AA 7083 ANDI R24,3
00AB 7090 ANDI R25,0
00AC 3080 CPI R24,0
00AD 0789 CPC R24,R25
00AE F459 BNE 0x00BA
00AF E624 LDI R18,0x64
00B0 E030 LDI R19,0
00B1 9100006C LDS R16,year
00B3 9110006D LDS R17,year+1
00B5 940E0237 CALL mod16u
00B7 3000 CPI R16,0
00B8 0701 CPC R16,R17
00B9 F461 BNE 0x00C6
00BA E920 LDI R18,0x90
00BB E031 LDI R19,1
00BC 9100006C LDS R16,year
00BE 9110006D LDS R17,year+1
00C0 940E0237 CALL mod16u
00C2 3000 CPI R16,0
00C3 0701 CPC R16,R17
00C4 F009 BEQ 0x00C6
00C5 C03F RJMP 0x0105
00C6 9180006E LDS R24,month
00C8 3084 CPI R24,4
00C9 F009 BEQ 0x00CB
00CA C03A RJMP 0x0105
(0071) mon[1]=28; }
00CB E18C LDI R24,0x1C
00CC 93800061 STS mon+1,R24
00CE C036 RJMP 0x0105
(0072) else
(0073) {
(0074) day=0;
00CF 2422 CLR R2
00D0 9220006F STS day,R2
(0075) if(month<13)
00D2 9180006E LDS R24,month
00D4 308D CPI R24,0xD
00D5 F420 BCC 0x00DA
(0076) month++;
00D6 5F8F SUBI R24,0xFF
00D7 9380006E STS month,R24
00D9 C009 RJMP 0x00E3
(0077) else
(0078) year++;
00DA 9180006C LDS R24,year
00DC 9190006D LDS R25,year+1
00DE 9601 ADIW R24,1
00DF 9390006D STS year+1,R25
00E1 9380006C STS year,R24
(0079) if((((year%4)==0)&&((year%100)!=0))||((year%400)==0))
00E3 9180006C LDS R24,year
00E5 9190006D LDS R25,year+1
00E7 7083 ANDI R24,3
00E8 7090 ANDI R25,0
00E9 3080 CPI R24,0
00EA 0789 CPC R24,R25
00EB F459 BNE 0x00F7
00EC E624 LDI R18,0x64
00ED E030 LDI R19,0
00EE 9100006C LDS R16,year
00F0 9110006D LDS R17,year+1
00F2 940E0237 CALL mod16u
00F4 3000 CPI R16,0
00F5 0701 CPC R16,R17
00F6 F459 BNE 0x0102
00F7 E920 LDI R18,0x90
00F8 E031 LDI R19,1
00F9 9100006C LDS R16,year
00FB 9110006D LDS R17,year+1
00FD 940E0237 CALL mod16u
00FF 3000 CPI R16,0
0100 0701 CPC R16,R17
0101 F419 BNE 0x0105
(0080) mon[1]=29;
0102 E18D LDI R24,0x1D
0103 93800061 STS mon+1,R24
(0081) }
(0082) }
(0083) }
(0084) }
0105 9508 RET
(0085) }
(0086)
(0087) //初始化
(0088) void timer2_init(void)
(0089) {
(0090) TCCR2 = 0x00;
_timer2_init:
0106 2422 CLR R2
0107 BC25 OUT 0x25,R2
(0091) ASSR = 1<<AS2; //異步時鐘
0108 E088 LDI R24,0x8
0109 BD82 OUT 0x22,R24
(0092) TCNT2 = 0xE0; //定時時間1秒
010A EE80 LDI R24,0xE0
010B BD84 OUT 0x24,R24
(0093) TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分頻比1024,0x07
010C E087 LDI R24,7
010D BD85 OUT 0x25,R24
010E 9508 RET
_timer2_ovf_isr:
010F 938A ST R24,-Y
0110 939A ST R25,-Y
0111 B78F IN R24,0x3F
0112 938A ST R24,-Y
(0094) }
(0095) #pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
(0096) void timer2_ovf_isr(void)
(0097) {
(0098) TCNT2 = 0xE0;
0113 EE80 LDI R24,0xE0
0114 BD84 OUT 0x24,R24
(0099) second++;
0115 91800070 LDS R24,second
0117 5F8F SUBI R24,0xFF
0118 93800070 STS second,R24
011A 9189 LD R24,Y+
011B BF8F OUT 0x3F,R24
011C 9199 LD R25,Y+
011D 9189 LD R24,Y+
011E 9518 RETI
(0100) }
(0101) void put_time(void)
(0102) {
(0103) putchar(year/1000+0x30);
_put_time:
011F EE28 LDI R18,0xE8
0120 E033 LDI R19,3
0121 9100006C LDS R16,year
0123 9110006D LDS R17,year+1
0125 940E0239 CALL div16u
0127 5D00 SUBI R16,0xD0
0128 4F1F SBCI R17,0xFF
0129 DF27 RCALL _putchar
(0104) putchar(year/100+0x30);
012A E624 LDI R18,0x64
012B E030 LDI R19,0
012C 9100006C LDS R16,year
012E 9110006D LDS R17,year+1
0130 940E0239 CALL div16u
0132 5D00 SUBI R16,0xD0
0133 4F1F SBCI R17,0xFF
0134 DF1C RCALL _putchar
(0105) putchar(year/10+0x30);
0135 E02A LDI R18,0xA
0136 E030 LDI R19,0
0137 9100006C LDS R16,year
0139 9110006D LDS R17,year+1
013B 940E0239 CALL div16u
013D 5D00 SUBI R16,0xD0
013E 4F1F SBCI R17,0xFF
013F DF11 RCALL _putchar
(0106) putchar(year%10+0x30);
0140 E02A LDI R18,0xA
0141 E030 LDI R19,0
0142 9100006C LDS R16,year
0144 9110006D LDS R17,year+1
0146 940E0237 CALL mod16u
0148 5D00 SUBI R16,0xD0
0149 4F1F SBCI R17,0xFF
014A DF06 RCALL _putchar
(0107) putchar(':');
014B E30A LDI R16,0x3A
014C DF04 RCALL _putchar
(0108) putchar(month/10+0x30);
014D E01A LDI R17,0xA
014E 9100006E LDS R16,month
0150 940E0255 CALL div8u
0152 5D00 SUBI R16,0xD0
0153 DEFD RCALL _putchar
(0109) putchar(month%10+0x30);
0154 E01A LDI R17,0xA
0155 9100006E LDS R16,month
0157 940E0253 CALL mod8u
0159 5D00 SUBI R16,0xD0
015A DEF6 RCALL _putchar
(0110) putchar(':');
015B E30A LDI R16,0x3A
015C DEF4 RCALL _putchar
(0111) putchar(day/10+0x30);
015D E01A LDI R17,0xA
015E 9100006F LDS R16,day
0160 940E0255 CALL div8u
0162 5D00 SUBI R16,0xD0
0163 DEED RCALL _putchar
(0112) putchar(day%10+0x30);
0164 E01A LDI R17,0xA
0165 9100006F LDS R16,day
0167 940E0253 CALL mod8u
0169 5D00 SUBI R16,0xD0
016A DEE6 RCALL _putchar
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -