📄 test.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 + -