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

📄 rtc.lst

📁 基于MEGA8的电子钟源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -