⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.lst

📁 360买的双龙M8开发板里CD的程序,正在开发avr板子的学生可以参考一下 
💻 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 + -