📄 rtc.lst
字号:
__start:
__text_start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E3 CPI R30,0x63
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D09B RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: E:\icc\iccavr\mega8\mega8\RTC\rtc.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* 实时时钟演示程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月12日 */
(0007) /* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
(0008) /******************************************/
(0009) //说明:ATMEGA8只有在使用内部RC振荡器,T2使用异步时钟的
(0010) // 情况下,外接的32.768KHZ的晶振才起作用。
(0011) #include<iom8v.h>
(0012) #include<macros.h>
(0013) #include"uart.h"
(0014) unsigned char hour;
(0015) unsigned char minute;
(0016) unsigned char second;
(0017) /* 调整时间 */
(0018) void time(void)
(0019) {
(0020) if (second<60)
_time:
0033 91800060 LDS R24,_second
0035 338C CPI R24,0x3C
0036 F408 BCC 0x0038
(0021) return;
0037 C01B RJMP 0x0053
(0022) else
(0023) {
(0024) second-=60;
0038 91800060 LDS R24,_second
003A 538C SUBI R24,0x3C
003B 93800060 STS _second,R24
(0025) if (minute<59)
003D 91800061 LDS R24,_minute
003F 338B CPI R24,0x3B
0040 F420 BCC 0x0045
(0026) minute++;
0041 5F8F SUBI R24,0xFF
0042 93800061 STS _minute,R24
0044 C00E RJMP 0x0053
(0027) else
(0028) {
(0029) minute=0;
0045 2422 CLR R2
0046 92200061 STS _minute,R2
(0030) if (hour<23)
0048 91800062 LDS R24,_hour
004A 3187 CPI R24,0x17
004B F420 BCC 0x0050
(0031) hour++;
004C 5F8F SUBI R24,0xFF
004D 93800062 STS _hour,R24
004F C003 RJMP 0x0053
(0032) else
(0033) hour=0;
0050 2422 CLR R2
0051 92200062 STS _hour,R2
(0034) }
(0035) }
(0036) }
0053 9508 RET
(0037) //初始化
(0038) void timer2_init(void)
(0039) {
(0040) TCCR2 = 0x00;
_timer2_init:
0054 2422 CLR R2
0055 BC25 OUT 0x25,R2
(0041) ASSR = 1<<AS2; //异步时钟
0056 E088 LDI R24,0x8
0057 BD82 OUT 0x22,R24
(0042) TCNT2 = 0xE0; //定时时间1秒
0058 EE80 LDI R24,0xE0
0059 BD84 OUT 0x24,R24
(0043) TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
005A E087 LDI R24,7
005B BD85 OUT 0x25,R24
(0044) }
005C 9508 RET
_timer2_ovf_isr:
005D 938A ST R24,-Y
005E 939A ST R25,-Y
005F B78F IN R24,0x3F
0060 938A ST R24,-Y
(0045) #pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
(0046) void timer2_ovf_isr(void)
(0047) {
(0048) TCNT2 = 0xE0;
0061 EE80 LDI R24,0xE0
0062 BD84 OUT 0x24,R24
(0049) second++;
0063 91800060 LDS R24,_second
0065 5F8F SUBI R24,0xFF
0066 93800060 STS _second,R24
(0050) }
0068 9189 LD R24,Y+
0069 BF8F OUT 0x3F,R24
006A 9199 LD R25,Y+
006B 9189 LD R24,Y+
006C 9518 RETI
(0051) void put_time(void)
(0052) {
(0053) putchar(hour/10+0x30);
_put_time:
006D E01A LDI R17,0xA
006E 91000062 LDS R16,_hour
0070 D09A RCALL div8u
0071 5D00 SUBI R16,0xD0
0072 D06A RCALL _putchar
(0054) putchar(hour%10+0x30);
0073 E01A LDI R17,0xA
0074 91000062 LDS R16,_hour
0076 D092 RCALL mod8u
0077 5D00 SUBI R16,0xD0
0078 D064 RCALL _putchar
(0055) putchar(':');
0079 E30A LDI R16,0x3A
007A D062 RCALL _putchar
(0056) putchar(minute/10+0x30);
007B E01A LDI R17,0xA
007C 91000061 LDS R16,_minute
007E D08C RCALL div8u
007F 5D00 SUBI R16,0xD0
0080 D05C RCALL _putchar
(0057) putchar(minute%10+0x30);
0081 E01A LDI R17,0xA
0082 91000061 LDS R16,_minute
0084 D084 RCALL mod8u
0085 5D00 SUBI R16,0xD0
0086 D056 RCALL _putchar
(0058) putchar(':');
0087 E30A LDI R16,0x3A
0088 D054 RCALL _putchar
(0059) putchar(second/10+0x30);
0089 E01A LDI R17,0xA
008A 91000060 LDS R16,_second
008C D07E RCALL div8u
008D 5D00 SUBI R16,0xD0
008E D04E RCALL _putchar
(0060) putchar(second%10+0x30);
008F E01A LDI R17,0xA
0090 91000060 LDS R16,_second
0092 D076 RCALL mod8u
0093 5D00 SUBI R16,0xD0
(0061) }
0094 C048 RJMP _putchar
_uart0_rx_isr:
i --> R20
0095 D09E RCALL push_lset
0096 D086 RCALL push_gset1
(0062) //UART接收中断
(0063) #pragma interrupt_handler uart0_rx_isr:iv_USART_RXC
(0064) void uart0_rx_isr(void)
(0065) {
(0066) unsigned i;
(0067) i=UDR;
0097 B14C IN R20,0x0C
0098 2755 CLR R21
(0068) if (i=='t')
0099 3744 CPI R20,0x74
009A E0E0 LDI R30,0
009B 075E CPC R21,R30
009C F569 BNE 0x00CA
(0069) {
(0070) hour=(getchar()-0x30)*10;
009D D043 RCALL _getchar
009E E08A LDI R24,0xA
009F 9F80 MUL R24,R16
00A0 2D80 MOV R24,R0
00A1 5E80 SUBI R24,0xE0
00A2 93800062 STS _hour,R24
(0071) hour=hour+(getchar()-0x30);
00A4 D03C RCALL _getchar
00A5 2F80 MOV R24,R16
00A6 5380 SUBI R24,0x30
00A7 90200062 LDS R2,_hour
00A9 0E28 ADD R2,R24
00AA 92200062 STS _hour,R2
(0072) minute=(getchar()-0x30)*10;
00AC D034 RCALL _getchar
00AD E08A LDI R24,0xA
00AE 9F80 MUL R24,R16
00AF 2D80 MOV R24,R0
00B0 5E80 SUBI R24,0xE0
00B1 93800061 STS _minute,R24
(0073) minute=minute+(getchar()-0x30);
00B3 D02D RCALL _getchar
00B4 2F80 MOV R24,R16
00B5 5380 SUBI R24,0x30
00B6 90200061 LDS R2,_minute
00B8 0E28 ADD R2,R24
00B9 92200061 STS _minute,R2
(0074) second=(getchar()-0x30)*10;
00BB D025 RCALL _getchar
00BC E08A LDI R24,0xA
00BD 9F80 MUL R24,R16
00BE 2D80 MOV R24,R0
00BF 5E80 SUBI R24,0xE0
00C0 93800060 STS _second,R24
(0075) second=second+(getchar()-0x30);
00C2 D01E RCALL _getchar
00C3 2F80 MOV R24,R16
00C4 5380 SUBI R24,0x30
00C5 90200060 LDS R2,_second
00C7 0E28 ADD R2,R24
00C8 92200060 STS _second,R2
(0076) }
(0077) }
00CA D055 RCALL pop_gset1
00CB D07F RCALL pop_lset
00CC 9518 RETI
(0078) //main程序
(0079) void main(void)
(0080) {
(0081) unsigned char second_old;
(0082) uart_init();
_main:
second_old --> R20
00CD D029 RCALL _uart_init
(0083) timer2_init();
00CE DF85 RCALL _timer2_init
(0084) TIMSK =1<<TOIE2;
00CF E480 LDI R24,0x40
00D0 BF89 OUT 0x39,R24
(0085) SEI();
00D1 9478 BSET 7
00D2 C008 RJMP 0x00DB
(0086) while(1)
(0087) {
(0088) if (second!=second_old)
00D3 90200060 LDS R2,_second
00D5 1624 CP R2,R20
00D6 F021 BEQ 0x00DB
(0089) {
(0090) time();
00D7 DF5B RCALL _time
(0091) second_old=second;
00D8 91400060 LDS R20,_second
(0092) put_time();
00DA DF92 RCALL _put_time
00DB CFF7 RJMP 0x00D3
(0093) }
(0094) }
(0095) }
00DC 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\RTC\uart.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* RS232通信驱动程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月11日 */
(0007) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0008) /******************************************/
(0009) // 1、使用ICCAVR的终端调试窗口(Terminal),进行通信调试。
(0010) // 2、对ICCAVR的终端调试窗口进行设置,设置串口为com1或com2,
(0011) // 通信波特率为19200(Tools->Environment Options...)。
(0012) // 3、将PC屏幕光标定位于调试窗口中。
(0013) #include <iom8v.h>
(0014) #define fosc 8000000 //晶振8MHZ
(0015) #define baud 19200 //波特率
(0016) #define osc_address 0x1ff0
(0017) extern unsigned char read_flash(unsigned int add);
(0018) /* 字符输出函数 */
(0019) void putchar(unsigned char c)
(0020) {
(0021) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
00DD 9B5D SBIS 0x0B,5
00DE CFFE RJMP _putchar
(0022) UDR=c;
00DF B90C OUT 0x0C,R16
(0023) }
00E0 9508 RET
(0024) /* 字符输入函数 */
(0025) unsigned char getchar(void)
(0026) {
(0027) while(!(UCSRA& (1<<RXC)));
_getchar:
00E1 9B5F SBIS 0x0B,7
00E2 CFFE RJMP _getchar
(0028) return UDR;
00E3 B10C IN R16,0x0C
00E4 9508 RET
_puts:
s --> R20
00E5 D037 RCALL push_gset1
00E6 01A8 MOVW R20,R16
(0029) }
(0030) /* 字符串输出函数 */
(0031) void puts(char *s)
(0032) {
00E7 C005 RJMP 0x00ED
(0033) while (*s)
(0034) {
(0035) putchar(*s);
00E8 01FA MOVW R30,R20
00E9 8100 LDD R16,Z+0
00EA DFF2 RCALL _putchar
(0036) s++;
00EB 5F4F SUBI R20,0xFF
00EC 4F5F SBCI R21,0xFF
00ED 01FA MOVW R30,R20
00EE 8020 LDD R2,Z+0
00EF 2022 TST R2
00F0 F7B9 BNE 0x00E8
(0037) }
(0038) putchar(0x0a);//回车换行
00F1 E00A LDI R16,0xA
00F2 DFEA RCALL _putchar
(0039) putchar(0x0d);
00F3 E00D LDI R16,0xD
00F4 DFE8 RCALL _putchar
(0040) }
00F5 D02A RCALL pop_gset1
00F6 9508 RET
(0041) /* UART初始化 */
(0042) void uart_init(void)
(0043) {
(0044) OSCCAL=read_flash(osc_address);
_uart_init:
00F7 EF00 LDI R16,0xF0
00F8 E11F LDI R17,0x1F
00F9 D00A RCALL _read_flash
00FA BF01 OUT 0x31,R16
(0045) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许发送和接收
00FB E988 LDI R24,0x98
00FC B98A OUT 0x0A,R24
(0046) UBRRL=(fosc/16/(baud+1))%256;
00FD E18A LDI R24,0x1A
00FE B989 OUT 0x09,R24
(0047) UBRRH=(fosc/16/(baud+1))/256;
00FF 2422 CLR R2
0100 BC20 OUT 0x20,R2
(0048) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0101 E886 LDI R24,0x86
0102 BD80 OUT 0x20,R24
(0049) }
0103 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\DAC\read_flash.s
(0001) ;unsigned char read_flash(unsigned int add);
(0002) _read_flash::
(0003) mov r31,r17
_read_flash:
0104 2FF1 MOV R31,R17
(0004) mov r30,r16
0105 2FE0 MOV R30,R16
(0005) lpm r16,z
0106 9104 LPM R16,0(Z)
(0006) clr r17
0107 2711 CLR R17
(0007) ret
FILE: <library>
0108 9508 RET
mod8u:
0109 9468 BSET 6
010A C001 RJMP xdiv8u
div8u:
010B 94E8 BCLR 6
xdiv8u:
010C 932A ST R18,-Y
010D 92FA ST R15,-Y
010E 24FF CLR R15
010F E028 LDI R18,0x8
0110 0F00 LSL R16
0111 1CFF ROL R15
0112 16F1 CP R15,R17
0113 F010 BCS 0x0116
0114 1AF1 SUB R15,R17
0115 9503 INC R16
0116 952A DEC R18
0117 F7C1 BNE 0x0110
0118 F40E BRTC 0x011A
0119 2D0F MOV R16,R15
011A 90F9 LD R15,Y+
011B 9129 LD R18,Y+
011C 9508 RET
push_gset1:
011D 935A ST R21,-Y
011E 934A ST R20,-Y
011F 9508 RET
pop_gset1:
0120 E0E1 LDI R30,1
pop:
0121 9149 LD R20,Y+
0122 9159 LD R21,Y+
0123 FDE0 SBRC R30,0
0124 9508 RET
0125 9169 LD R22,Y+
0126 9179 LD R23,Y+
0127 FDE1 SBRC R30,1
0128 9508 RET
0129 90A9 LD R10,Y+
012A 90B9 LD R11,Y+
012B FDE2 SBRC R30,2
012C 9508 RET
012D 90C9 LD R12,Y+
012E 90D9 LD R13,Y+
012F FDE3 SBRC R30,3
0130 9508 RET
0131 90E9 LD R14,Y+
0132 90F9 LD R15,Y+
0133 9508 RET
push_lset:
0134 93FA ST R31,-Y
0135 93EA ST R30,-Y
0136 93BA ST R27,-Y
0137 93AA ST R26,-Y
0138 939A ST R25,-Y
0139 938A ST R24,-Y
013A 933A ST R19,-Y
013B 932A ST R18,-Y
013C 931A ST R17,-Y
013D 930A ST R16,-Y
013E 929A ST R9,-Y
013F 928A ST R8,-Y
0140 927A ST R7,-Y
0141 926A ST R6,-Y
0142 925A ST R5,-Y
0143 924A ST R4,-Y
0144 923A ST R3,-Y
0145 922A ST R2,-Y
0146 921A ST R1,-Y
0147 920A ST R0,-Y
0148 B60F IN R0,0x3F
0149 920A ST R0,-Y
014A 9508 RET
pop_lset:
014B 9009 LD R0,Y+
014C BE0F OUT 0x3F,R0
014D 9009 LD R0,Y+
014E 9019 LD R1,Y+
014F 9029 LD R2,Y+
0150 9039 LD R3,Y+
0151 9049 LD R4,Y+
0152 9059 LD R5,Y+
0153 9069 LD R6,Y+
0154 9079 LD R7,Y+
0155 9089 LD R8,Y+
0156 9099 LD R9,Y+
0157 9109 LD R16,Y+
0158 9119 LD R17,Y+
0159 9129 LD R18,Y+
015A 9139 LD R19,Y+
015B 9189 LD R24,Y+
015C 9199 LD R25,Y+
015D 91A9 LD R26,Y+
015E 91B9 LD R27,Y+
015F 91E9 LD R30,Y+
0160 91F9 LD R31,Y+
0161 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -