📄 rtc.lis
字号:
.module rtc.c
.area text(rom, con, rel)
0000 .dbfile E:\icc\iccavr\mega8\mega8\RTC\rtc.c
0000 .dbfunc e time _time fV
.even
0000 _time::
0000 .dbline -1
0000 .dbline 19
0000 ; /******************************************/
0000 ; /* 广州天河双龙电子公司 */
0000 ; /* http://www.sl.com.cn */
0000 ; /* 实时时钟演示程序 */
0000 ; /* 作者:ntzwq@wx88.net */
0000 ; /* 2002年5月12日 */
0000 ; /* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
0000 ; /******************************************/
0000 ; //说明:ATMEGA8只有在使用内部RC振荡器,T2使用异步时钟的
0000 ; // 情况下,外接的32.768KHZ的晶振才起作用。
0000 ; #include<iom8v.h>
0000 ; #include<macros.h>
0000 ; #include"uart.h"
0000 ; unsigned char hour;
0000 ; unsigned char minute;
0000 ; unsigned char second;
0000 ; /* 调整时间 */
0000 ; void time(void)
0000 ; {
0000 .dbline 20
0000 ; if (second<60)
0000 80910000 lds R24,_second
0004 8C33 cpi R24,60
0006 08F4 brsh L2
0008 .dbline 21
0008 ; return;
0008 1BC0 rjmp L1
000A L2:
000A .dbline 23
000A ; else
000A ; {
000A .dbline 24
000A ; second-=60;
000A 80910000 lds R24,_second
000E 8C53 subi R24,60
0010 80930000 sts _second,R24
0014 .dbline 25
0014 ; if (minute<59)
0014 80910100 lds R24,_minute
0018 8B33 cpi R24,59
001A 20F4 brsh L4
001C .dbline 26
001C ; minute++;
001C 8F5F subi R24,255 ; addi 1
001E 80930100 sts _minute,R24
0022 0EC0 rjmp L5
0024 L4:
0024 .dbline 28
0024 ; else
0024 ; {
0024 .dbline 29
0024 ; minute=0;
0024 2224 clr R2
0026 20920100 sts _minute,R2
002A .dbline 30
002A ; if (hour<23)
002A 80910200 lds R24,_hour
002E 8731 cpi R24,23
0030 20F4 brsh L6
0032 .dbline 31
0032 ; hour++;
0032 8F5F subi R24,255 ; addi 1
0034 80930200 sts _hour,R24
0038 03C0 rjmp L7
003A L6:
003A .dbline 33
003A ; else
003A ; hour=0;
003A 2224 clr R2
003C 20920200 sts _hour,R2
0040 L7:
0040 .dbline 34
0040 ; }
0040 L5:
0040 .dbline 35
0040 ; }
0040 .dbline -2
0040 .dbline 36
0040 ; }
0040 L1:
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbend
0042 .dbfunc e timer2_init _timer2_init fV
.even
0042 _timer2_init::
0042 .dbline -1
0042 .dbline 39
0042 ; //初始化
0042 ; void timer2_init(void)
0042 ; {
0042 .dbline 40
0042 ; TCCR2 = 0x00;
0042 2224 clr R2
0044 25BC out 0x25,R2
0046 .dbline 41
0046 ; ASSR = 1<<AS2; //异步时钟
0046 88E0 ldi R24,8
0048 82BD out 0x22,R24
004A .dbline 42
004A ; TCNT2 = 0xE0; //定时时间1秒
004A 80EE ldi R24,224
004C 84BD out 0x24,R24
004E .dbline 43
004E ; TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
004E 87E0 ldi R24,7
0050 85BD out 0x25,R24
0052 .dbline -2
0052 .dbline 44
0052 ; }
0052 L8:
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbend
.area vector(rom, abs)
.org 8
0008 2AC0 rjmp _timer2_ovf_isr
.area text(rom, con, rel)
0054 .dbfile E:\icc\iccavr\mega8\mega8\RTC\rtc.c
0054 .dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
.even
0054 _timer2_ovf_isr::
0054 8A93 st -y,R24
0056 9A93 st -y,R25
0058 8FB7 in R24,0x3f
005A 8A93 st -y,R24
005C .dbline -1
005C .dbline 47
005C ; #pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
005C ; void timer2_ovf_isr(void)
005C ; {
005C .dbline 48
005C ; TCNT2 = 0xE0;
005C 80EE ldi R24,224
005E 84BD out 0x24,R24
0060 .dbline 49
0060 ; second++;
0060 80910000 lds R24,_second
0064 8F5F subi R24,255 ; addi 1
0066 80930000 sts _second,R24
006A .dbline -2
006A .dbline 50
006A ; }
006A L9:
006A 8991 ld R24,y+
006C 8FBF out 0x3f,R24
006E 9991 ld R25,y+
0070 8991 ld R24,y+
0072 .dbline 0 ; func end
0072 1895 reti
0074 .dbend
0074 .dbfunc e put_time _put_time fV
.even
0074 _put_time::
0074 .dbline -1
0074 .dbline 52
0074 ; void put_time(void)
0074 ; {
0074 .dbline 53
0074 ; putchar(hour/10+0x30);
0074 1AE0 ldi R17,10
0076 00910200 lds R16,_hour
007A 00D0 rcall div8u
007C 005D subi R16,208 ; addi 48
007E 00D0 rcall _putchar
0080 .dbline 54
0080 ; putchar(hour%10+0x30);
0080 1AE0 ldi R17,10
0082 00910200 lds R16,_hour
0086 00D0 rcall mod8u
0088 005D subi R16,208 ; addi 48
008A 00D0 rcall _putchar
008C .dbline 55
008C ; putchar(':');
008C 0AE3 ldi R16,58
008E 00D0 rcall _putchar
0090 .dbline 56
0090 ; putchar(minute/10+0x30);
0090 1AE0 ldi R17,10
0092 00910100 lds R16,_minute
0096 00D0 rcall div8u
0098 005D subi R16,208 ; addi 48
009A 00D0 rcall _putchar
009C .dbline 57
009C ; putchar(minute%10+0x30);
009C 1AE0 ldi R17,10
009E 00910100 lds R16,_minute
00A2 00D0 rcall mod8u
00A4 005D subi R16,208 ; addi 48
00A6 00D0 rcall _putchar
00A8 .dbline 58
00A8 ; putchar(':');
00A8 0AE3 ldi R16,58
00AA 00D0 rcall _putchar
00AC .dbline 59
00AC ; putchar(second/10+0x30);
00AC 1AE0 ldi R17,10
00AE 00910000 lds R16,_second
00B2 00D0 rcall div8u
00B4 005D subi R16,208 ; addi 48
00B6 00D0 rcall _putchar
00B8 .dbline 60
00B8 ; putchar(second%10+0x30);
00B8 1AE0 ldi R17,10
00BA 00910000 lds R16,_second
00BE 00D0 rcall mod8u
00C0 005D subi R16,208 ; addi 48
00C2 .dbline -2
00C2 .dbline 61
00C2 ; }
00C2 L10:
00C2 .dbline 0 ; func end
00C2 00C0 rjmp _putchar
00C4 .dbend
.area vector(rom, abs)
.org 22
0016 62C0 rjmp _uart0_rx_isr
.area text(rom, con, rel)
00C4 .dbfile E:\icc\iccavr\mega8\mega8\RTC\rtc.c
00C4 .dbfunc e uart0_rx_isr _uart0_rx_isr fV
00C4 ; i -> R20,R21
.even
00C4 _uart0_rx_isr::
00C4 00D0 rcall push_lset
00C6 00D0 rcall push_gset1
00C8 .dbline -1
00C8 .dbline 65
00C8 .dbline 67
00C8 4CB1 in R20,0xc
00CA 5527 clr R21
00CC .dbline 68
00CC 4437 cpi R20,116
00CE E0E0 ldi R30,0
00D0 5E07 cpc R21,R30
00D2 69F5 brne L12
00D4 .dbline 69
00D4 .dbline 70
00D4 00D0 rcall _getchar
00D6 8AE0 ldi R24,10
00D8 809F mul R24,R16
00DA 802D mov R24,R0
00DC 805E subi R24,224
00DE 80930200 sts _hour,R24
00E2 .dbline 71
00E2 00D0 rcall _getchar
00E4 802F mov R24,R16
00E6 8053 subi R24,48
00E8 20900200 lds R2,_hour
00EC 280E add R2,R24
00EE 20920200 sts _hour,R2
00F2 .dbline 72
00F2 00D0 rcall _getchar
00F4 8AE0 ldi R24,10
00F6 809F mul R24,R16
00F8 802D mov R24,R0
00FA 805E subi R24,224
00FC 80930100 sts _minute,R24
0100 .dbline 73
0100 00D0 rcall _getchar
0102 802F mov R24,R16
0104 8053 subi R24,48
0106 20900100 lds R2,_minute
010A 280E add R2,R24
010C 20920100 sts _minute,R2
0110 .dbline 74
0110 00D0 rcall _getchar
0112 8AE0 ldi R24,10
0114 809F mul R24,R16
0116 802D mov R24,R0
0118 805E subi R24,224
011A 80930000 sts _second,R24
011E .dbline 75
011E 00D0 rcall _getchar
0120 802F mov R24,R16
0122 8053 subi R24,48
0124 20900000 lds R2,_second
0128 280E add R2,R24
012A 20920000 sts _second,R2
012E .dbline 76
012E L12:
012E .dbline -2
012E .dbline 77
012E ; //UART接收中断
012E ; #pragma interrupt_handler uart0_rx_isr:iv_USART_RXC
012E ; void uart0_rx_isr(void)
012E ; {
012E ; unsigned i;
012E ; i=UDR;
012E ; if (i=='t')
012E ; {
012E ; hour=(getchar()-0x30)*10;
012E ; hour=hour+(getchar()-0x30);
012E ; minute=(getchar()-0x30)*10;
012E ; minute=minute+(getchar()-0x30);
012E ; second=(getchar()-0x30)*10;
012E ; second=second+(getchar()-0x30);
012E ; }
012E ; }
012E L11:
012E 00D0 rcall pop_gset1
0130 00D0 rcall pop_lset
0132 .dbline 0 ; func end
0132 1895 reti
0134 .dbsym r i 20 i
0134 .dbend
0134 .dbfunc e main _main fV
0134 ; second_old -> R20
.even
0134 _main::
0134 .dbline -1
0134 .dbline 80
0134 ; //main程序
0134 ; void main(void)
0134 ; {
0134 .dbline 82
0134 ; unsigned char second_old;
0134 ; uart_init();
0134 00D0 rcall _uart_init
0136 .dbline 83
0136 ; timer2_init();
0136 85DF rcall _timer2_init
0138 .dbline 84
0138 ; TIMSK =1<<TOIE2;
0138 80E4 ldi R24,64
013A 89BF out 0x39,R24
013C .dbline 85
013C ; SEI();
013C 7894 sei
013E 08C0 rjmp L16
0140 L15:
0140 .dbline 87
0140 ; while(1)
0140 ; {
0140 .dbline 88
0140 ; if (second!=second_old)
0140 20900000 lds R2,_second
0144 2416 cp R2,R20
0146 21F0 breq L18
0148 .dbline 89
0148 ; {
0148 .dbline 90
0148 ; time();
0148 5BDF rcall _time
014A .dbline 91
014A ; second_old=second;
014A 40910000 lds R20,_second
014E .dbline 92
014E ; put_time();
014E 92DF rcall _put_time
0150 .dbline 93
0150 ; }
0150 L18:
0150 .dbline 94
0150 L16:
0150 .dbline 86
0150 F7CF rjmp L15
0152 X0:
0152 .dbline -2
0152 .dbline 95
0152 ; }
0152 ; }
0152 L14:
0152 .dbline 0 ; func end
0152 0895 ret
0154 .dbsym r second_old 20 c
0154 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\icc\iccavr\mega8\mega8\RTC\rtc.c
0000 _second::
0000 .blkb 1
0001 .dbsym e second _second c
0001 _minute::
0001 .blkb 1
0002 .dbsym e minute _minute c
0002 _hour::
0002 .blkb 1
0003 .dbsym e hour _hour c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -