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

📄 test.lst

📁 avr单片机串口先进先出实例程序
💻 LST
字号:
__text_start:
__start:
    002B E5CF      LDI	R28,0x5F
    002C E0D4      LDI	R29,4
    002D BFCD      OUT	0x3D,R28
    002E BFDE      OUT	0x3E,R29
    002F 51CE      SUBI	R28,0x1E
    0030 40D0      SBCI	R29,0
    0031 EA0A      LDI	R16,0xAA
    0032 8308      STD	Y+0,R16
    0033 2400      CLR	R0
    0034 E6E1      LDI	R30,0x61
    0035 E0F0      LDI	R31,0
    0036 E010      LDI	R17,0
    0037 38E9      CPI	R30,0x89
    0038 07F1      CPC	R31,R17
    0039 F011      BEQ	0x003C
    003A 9201      ST	R0,Z+
    003B CFFB      RJMP	0x0037
    003C 8300      STD	Z+0,R16
    003D E5E4      LDI	R30,0x54
    003E E0F0      LDI	R31,0
    003F E6A0      LDI	R26,0x60
    0040 E0B0      LDI	R27,0
    0041 E010      LDI	R17,0
    0042 35E5      CPI	R30,0x55
    0043 07F1      CPC	R31,R17
    0044 F021      BEQ	0x0049
    0045 95C8      LPM
    0046 9631      ADIW	R30,1
    0047 920D      ST	R0,X+
    0048 CFF9      RJMP	0x0042
    0049 940E00B4  CALL	_main
_exit:
    004B CFFF      RJMP	_exit
FILE: D:\iccavr\mega16\uart\test.c
(0001) //ICC-AVR application builder : 2009-4-2 9:23:34
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) unsigned char count,uart_inter_flag=0,uart_buf[37];
(0009) 
(0010) void port_init(void)
(0011) {
(0012)  PORTA = 0x00;
_port_init:
    004C 2422      CLR	R2
    004D BA2B      OUT	0x1B,R2
(0013)  DDRA  = 0x00;
    004E BA2A      OUT	0x1A,R2
(0014)  PORTB = 0x08;
    004F E088      LDI	R24,0x8
    0050 BB88      OUT	0x18,R24
(0015)  DDRB  = 0x08;
    0051 BB87      OUT	0x17,R24
(0016)  PORTC = 0x00; //m103 output only
    0052 BA25      OUT	0x15,R2
(0017)  DDRC  = 0x00;
    0053 BA24      OUT	0x14,R2
(0018)  PORTD = 0x00;
    0054 BA22      OUT	0x12,R2
(0019)  DDRD  = 0x00;
    0055 BA21      OUT	0x11,R2
    0056 9508      RET
(0020) }
(0021) 
(0022) //TIMER0 initialize - prescale:1024
(0023) // WGM: Normal
(0024) // desired value: 10mSec
(0025) // actual value: 10.000mSec (0.0%)
(0026) void timer0_init(void)
(0027) {
(0028)  TCCR0 = 0x00; //stop
_timer0_init:
    0057 2422      CLR	R2
    0058 BE23      OUT	0x33,R2
(0029)  TCNT0 = 0xB8; //set count
    0059 EB88      LDI	R24,0xB8
    005A BF82      OUT	0x32,R24
(0030)  OCR0  = 0x48;  //set compare
    005B E488      LDI	R24,0x48
    005C BF8C      OUT	0x3C,R24
(0031)  TCCR0 = 0x05; //start timer
    005D E085      LDI	R24,5
    005E BF83      OUT	0x33,R24
    005F 9508      RET
_timer0_ovf_isr:
    0060 938A      ST	R24,-Y
    0061 939A      ST	R25,-Y
    0062 B78F      IN	R24,0x3F
    0063 938A      ST	R24,-Y
(0032) }
(0033) 
(0034) #pragma interrupt_handler timer0_ovf_isr:10
(0035) void timer0_ovf_isr(void)
(0036) {
(0037)  TCNT0 = 0xB8; //reload counter value
    0064 EB88      LDI	R24,0xB8
    0065 BF82      OUT	0x32,R24
(0038)  count++;
    0066 91800086  LDS	R24,count
    0068 5F8F      SUBI	R24,0xFF
    0069 93800086  STS	count,R24
    006B 9189      LD	R24,Y+
    006C BF8F      OUT	0x3F,R24
    006D 9199      LD	R25,Y+
    006E 9189      LD	R24,Y+
    006F 9518      RETI
(0039) }
(0040) 
(0041) //UART0 initialize
(0042) // desired baud rate: 9600
(0043) // actual: baud rate:9600 (0.0%)
(0044) // char size: 8 bit
(0045) // parity: Disabled
(0046) void uart0_init(void)
(0047) {
(0048)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0070 2422      CLR	R2
    0071 B82A      OUT	0x0A,R2
(0049)  UCSRA = 0x00;
    0072 B82B      OUT	0x0B,R2
(0050)  UCSRC = BIT(URSEL) | 0x06;
    0073 E886      LDI	R24,0x86
    0074 BD80      OUT	0x20,R24
(0051)  UBRRL = 0x2F; //set baud rate lo
    0075 E28F      LDI	R24,0x2F
    0076 B989      OUT	0x09,R24
(0052)  UBRRH = 0x00; //set baud rate hi
    0077 BC20      OUT	0x20,R2
(0053)  UCSRB = 0x98;
    0078 E988      LDI	R24,0x98
    0079 B98A      OUT	0x0A,R24
    007A 9508      RET
_uart0_rx_isr:
  temp                 --> R16
  i                    --> R18
    007B 922A      ST	R2,-Y
    007C 930A      ST	R16,-Y
    007D 932A      ST	R18,-Y
    007E 938A      ST	R24,-Y
    007F 939A      ST	R25,-Y
    0080 93EA      ST	R30,-Y
    0081 93FA      ST	R31,-Y
    0082 B62F      IN	R2,0x3F
    0083 922A      ST	R2,-Y
(0054) }
(0055) 
(0056) #pragma interrupt_handler uart0_rx_isr:12
(0057) void uart0_rx_isr(void)
(0058) {
(0059)  //uart has received a character in UDR
(0060)  unsigned char i,temp; 
(0061)  while(!(UCSRA&0x80)); 
    0084 9B5F      SBIS	0x0B,7
    0085 CFFE      RJMP	0x0084
(0062)  temp = UDR; 
    0086 B10C      IN	R16,0x0C
(0063)  for(i=0;i<36;i++) 
    0087 2722      CLR	R18
    0088 C00F      RJMP	0x0098
(0064)   uart_buf[i]=uart_buf[i+1]; 
    0089 E682      LDI	R24,0x62
    008A E090      LDI	R25,0
    008B 2FE2      MOV	R30,R18
    008C 27FF      CLR	R31
    008D 0FE8      ADD	R30,R24
    008E 1FF9      ADC	R31,R25
    008F 8020      LDD	R2,Z+0
    0090 E681      LDI	R24,0x61
    0091 E090      LDI	R25,0
    0092 2FE2      MOV	R30,R18
    0093 27FF      CLR	R31
    0094 0FE8      ADD	R30,R24
    0095 1FF9      ADC	R31,R25
    0096 8220      STD	Z+0,R2
    0097 9523      INC	R18
    0098 3224      CPI	R18,0x24
    0099 F378      BCS	0x0089
(0065)  uart_buf[36]=temp; 
    009A 93000085  STS	0x85,R16
(0066)  uart_inter_flag=0x01;
    009C E081      LDI	R24,1
    009D 93800060  STS	uart_inter_flag,R24
    009F 9029      LD	R2,Y+
    00A0 BE2F      OUT	0x3F,R2
    00A1 91F9      LD	R31,Y+
    00A2 91E9      LD	R30,Y+
    00A3 9199      LD	R25,Y+
    00A4 9189      LD	R24,Y+
    00A5 9129      LD	R18,Y+
    00A6 9109      LD	R16,Y+
    00A7 9029      LD	R2,Y+
    00A8 9518      RETI
(0067) }
(0068) 
(0069) //call this routine to initialize all peripherals
(0070) void init_devices(void)
(0071) {
(0072)  //stop errant interrupts until set up
(0073)  CLI(); //disable all interrupts
_init_devices:
    00A9 94F8      BCLR	7
(0074)  port_init();
    00AA DFA1      RCALL	_port_init
(0075)  timer0_init();
    00AB DFAB      RCALL	_timer0_init
(0076)  uart0_init();
    00AC DFC3      RCALL	_uart0_init
(0077) 
(0078)  MCUCR = 0x00;
    00AD 2422      CLR	R2
    00AE BE25      OUT	0x35,R2
(0079)  GICR  = 0x00;
    00AF BE2B      OUT	0x3B,R2
(0080)  TIMSK = 0x01; //timer interrupt sources
    00B0 E081      LDI	R24,1
    00B1 BF89      OUT	0x39,R24
(0081)  SEI(); //re-enable interrupts
    00B2 9478      BSET	7
    00B3 9508      RET
(0082)  //all peripherals are now initialized
(0083) }
(0084) 
(0085) //
(0086) void main(void)
(0087) {
(0088)  unsigned char i;
(0089)  init_devices();
_main:
  i                    --> R20
    00B4 DFF4      RCALL	_init_devices
    00B5 C022      RJMP	0x00D8
(0090)  //insert your functional code here...
(0091)  while(1)
(0092)  {
(0093)   if(uart_inter_flag==1)
    00B6 91800060  LDS	R24,uart_inter_flag
    00B8 3081      CPI	R24,1
    00B9 F491      BNE	0x00CC
(0094)   {
(0095)    uart_inter_flag=0;
    00BA 2422      CLR	R2
    00BB 92200060  STS	uart_inter_flag,R2
(0096)    for(i=0;i<37;i++)
    00BD 2744      CLR	R20
    00BE C00B      RJMP	0x00CA
(0097)     putchar(uart_buf[i]);
    00BF E681      LDI	R24,0x61
    00C0 E090      LDI	R25,0
    00C1 2FE4      MOV	R30,R20
    00C2 27FF      CLR	R31
    00C3 0FE8      ADD	R30,R24
    00C4 1FF9      ADC	R31,R25
    00C5 8100      LDD	R16,Z+0
    00C6 2711      CLR	R17
    00C7 940E00F9  CALL	_putchar
    00C9 9543      INC	R20
    00CA 3245      CPI	R20,0x25
    00CB F398      BCS	0x00BF
(0098)   }
(0099)   if(count>30)
    00CC E18E      LDI	R24,0x1E
    00CD 90200086  LDS	R2,count
    00CF 1582      CP	R24,R2
    00D0 F438      BCC	0x00D8
(0100)   {
(0101)    count=0;
    00D1 2422      CLR	R2
    00D2 92200086  STS	count,R2
(0102)    PORTB^=(1<<3);
FILE: <library>
    00D4 E088      LDI	R24,0x8
    00D5 B228      IN	R2,0x18
    00D6 2628      EOR	R2,R24
    00D7 BA28      OUT	0x18,R2
    00D8 CFDD      RJMP	0x00B6
    00D9 9508      RET
push_gset5:
    00DA 92FA      ST	R15,-Y
    00DB 92EA      ST	R14,-Y
push_gset4:
    00DC 92DA      ST	R13,-Y
    00DD 92CA      ST	R12,-Y
push_gset3:
    00DE 92BA      ST	R11,-Y
    00DF 92AA      ST	R10,-Y
push_gset2:
    00E0 937A      ST	R23,-Y
    00E1 936A      ST	R22,-Y
push_gset1:
    00E2 935A      ST	R21,-Y
    00E3 934A      ST	R20,-Y
    00E4 9508      RET
pop_gset1:
    00E5 E0E1      LDI	R30,1
pop:
    00E6 9149      LD	R20,Y+
    00E7 9159      LD	R21,Y+
    00E8 FDE0      SBRC	R30,0
    00E9 9508      RET
    00EA 9169      LD	R22,Y+
    00EB 9179      LD	R23,Y+
    00EC FDE1      SBRC	R30,1
    00ED 9508      RET
    00EE 90A9      LD	R10,Y+
    00EF 90B9      LD	R11,Y+
    00F0 FDE2      SBRC	R30,2
    00F1 9508      RET
    00F2 90C9      LD	R12,Y+
    00F3 90D9      LD	R13,Y+
    00F4 FDE3      SBRC	R30,3
    00F5 9508      RET
    00F6 90E9      LD	R14,Y+
    00F7 90F9      LD	R15,Y+
    00F8 9508      RET
_putchar:
    00F9 940E00E2  CALL	push_gset1
    00FB 2F40      MOV	R20,R16
    00FC 90200087  LDS	R2,_textmode
    00FE 90300088  LDS	R3,_textmode+1
    0100 2022      TST	R2
    0101 F411      BNE	0x0104
    0102 2033      TST	R3
    0103 F021      BEQ	0x0108
    0104 304A      CPI	R20,0xA
    0105 F411      BNE	0x0108
    0106 E00D      LDI	R16,0xD
    0107 DFF1      RCALL	_putchar
    0108 9B5D      SBIS	0x0B,5
    0109 CFFE      RJMP	0x0108
    010A B94C      OUT	0x0C,R20
    010B 2F04      MOV	R16,R20
    010C 2711      CLR	R17
    010D 940E00E5  CALL	pop_gset1
    010F 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -