📄 uart_mega128.lst
字号:
__start:
__text_start:
004E EFCF LDI R28,0xFF
004F E1D0 LDI R29,0x10
0050 BFCD OUT P3D,R28
0051 BFDE OUT P3E,R29
0052 51C0 SUBI R28,0x10
0053 40D0 SBCI R29,0
0054 EA0A LDI R16,0xAA
0055 8308 STD R16,0+Y
0056 2400 CLR R0
0057 E1E0 LDI R30,0x10
0058 E0F1 LDI R31,1
0059 E011 LDI R17,1
005A 31E0 CPI R30,0x10
005B 07F1 CPC R31,R17
005C F011 BEQ 0x005F
005D 9201 ST R0,Z+
005E CFFB RJMP 0x005A
005F 8300 STD R16,0+Z
0060 E8EC LDI R30,0x8C
0061 E0F0 LDI R31,0
0062 E0A0 LDI R26,0
0063 E0B1 LDI R27,1
0064 E010 LDI R17,0
0065 39EC CPI R30,0x9C
0066 07F1 CPC R31,R17
0067 F021 BEQ 0x006C
0068 95C8 LPM
0069 9631 ADIW R30,1
006A 920D ST R0,X+
006B CFF9 RJMP 0x0065
006C 940E00CB CALL _main
_exit:
006E CFFF RJMP _exit
FILE: C:\work\UART_MEGA128\uart1.c
(0001) #include<iom128v.h>
(0002) #include<macros.h>
(0003) #define fosc 4000000 //晶振4MHZ
(0004) #define baud 2400 //波特率
(0005) #define com0
(0006) void uart0_init(void)
(0007) {
(0008) UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
006F 2422 CLR R2
0070 B82A OUT P0A,R2
(0009) UCSR0A = 0x00;
0071 B82B OUT P0B,R2
(0010) UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8bit+1bit stop
0072 E086 LDI R24,6
0073 93800095 STS R24,0x95
(0011) UBRR0L=(fosc/16/(baud+1))%256;
0075 E688 LDI R24,0x68
0076 B989 OUT P09,R24
(0012) UBRR0H=(fosc/16/(baud+1))/256;
0077 92200090 STS R2,0x90
(0013) UCSR0B =(1<<RXEN0)|(1<<TXEN0);//RXCEN TXCEN
0079 E188 LDI R24,0x18
007A B98A OUT P0A,R24
(0014) }
007B 9508 RET
(0015) void uart1_init(void)
(0016) {
(0017) UCSR1B = 0x00; //disable while setting baud rate
_uart1_init:
007C 2422 CLR R2
007D 9220009A STS R2,0x9A
(0018) UCSR1A = 0x00;
007F 9220009B STS R2,0x9B
(0019) UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);//8bit+1bit stop
0081 E086 LDI R24,6
0082 9380009D STS R24,__idata_end+1
(0020) UBRR1L=(fosc/16/(baud+1))%256;
0084 E688 LDI R24,0x68
0085 93800099 STS R24,0x99
(0021) UBRR1H=(fosc/16/(baud+1))/256;
0087 92200098 STS R2,0x98
(0022) UCSR1B =(1<<RXEN1)|(1<<TXEN1);//RXCEN TXCEN
0089 E188 LDI R24,0x18
008A 9380009A STS R24,0x9A
(0023) }
008C 9508 RET
(0024) void putchar0(unsigned char c)
(0025) {
(0026) while (!(UCSR0A&(1<<UDRE0)));
_putchar0:
c --> R16
008D 9B5D SBIS P0B,5
008E CFFE RJMP _putchar0
(0027) UDR0=c;
008F B90C OUT P0C,R16
(0028) }
0090 9508 RET
(0029) void putchar1(unsigned char c)
(0030) {
(0031) while (!(UCSR1A&(1<<UDRE1)));
_putchar1:
c --> R16
0091 9020009B LDS R2,0x9B
0093 FE25 SBRS R2,5
0094 CFFC RJMP _putchar1
(0032) UDR1=c;
0095 9300009C STS R16,__idata_end
(0033) }
0097 9508 RET
(0034) unsigned char getchar0(void)
(0035) {
(0036) while(!(UCSR0A& (1<<RXC0)));
_getchar0:
0098 9B5F SBIS P0B,7
0099 CFFE RJMP _getchar0
(0037) return UDR0;
009A B10C IN R16,P0C
009B 9508 RET
(0038) }
(0039) unsigned char getchar1(void)
(0040) {
(0041) while(!(UCSR1A& (1<<RXC1)));
_getchar1:
009C 9020009B LDS R2,0x9B
009E FE27 SBRS R2,7
009F CFFC RJMP _getchar1
(0042) return UDR1;
00A0 9100009C LDS R16,__idata_end
00A2 9508 RET
_puts0:
s --> R20
00A3 940E00E4 CALL push_gset1
00A5 01A8 MOVW R20,R16
(0043) }
(0044) void puts0(char *s)
(0045) {
00A6 C005 RJMP 0x00AC
(0046) while (*s)
(0047) {
(0048) putchar0(*s);
00A7 01FA MOVW R30,R20
00A8 8100 LDD R16,0+Z
00A9 DFE3 RCALL _putchar0
(0049) s++;
00AA 5F4F SUBI R20,0xFF
00AB 4F5F SBCI R21,0xFF
00AC 01FA MOVW R30,R20
00AD 8020 LDD R2,0+Z
00AE 2022 TST R2
00AF F7B9 BNE 0x00A7
(0050) }
(0051) putchar0(0x0a);
00B0 E00A LDI R16,0xA
00B1 DFDB RCALL _putchar0
(0052) putchar0(0x0d);
00B2 E00D LDI R16,0xD
00B3 DFD9 RCALL _putchar0
(0053) }
00B4 940E00E7 CALL pop_gset1
00B6 9508 RET
_puts1:
s --> R20
00B7 940E00E4 CALL push_gset1
00B9 01A8 MOVW R20,R16
(0054) void puts1(char *s)
(0055) {
00BA C005 RJMP 0x00C0
(0056) while (*s)
(0057) {
(0058) putchar1(*s);
00BB 01FA MOVW R30,R20
00BC 8100 LDD R16,0+Z
00BD DFD3 RCALL _putchar1
(0059) s++;
00BE 5F4F SUBI R20,0xFF
00BF 4F5F SBCI R21,0xFF
00C0 01FA MOVW R30,R20
00C1 8020 LDD R2,0+Z
00C2 2022 TST R2
00C3 F7B9 BNE 0x00BB
(0060) }
(0061) putchar1(0x0a);
00C4 E00A LDI R16,0xA
00C5 DFCB RCALL _putchar1
(0062) putchar1(0x0d);
00C6 E00D LDI R16,0xD
00C7 DFC9 RCALL _putchar1
(0063) }
00C8 940E00E7 CALL pop_gset1
00CA 9508 RET
(0064) void main(void)
(0065) {
(0066) unsigned char i;
(0067) #ifdef com0
(0068) uart0_init();
_main:
i --> R20
00CB DFA3 RCALL _uart0_init
(0069) puts0("HELLO!");
00CC E009 LDI R16,0x9
00CD E011 LDI R17,1
00CE DFD4 RCALL _puts0
00CF C012 RJMP 0x00E2
(0070) #else
(0071) uart1_init();
(0072) puts1("HELLO!");
(0073) #endif
(0074) while(1)
(0075) {
(0076) #ifdef com0
(0077) if (getchar0()=='t')//按键盘t键开始测试
00D0 DFC7 RCALL _getchar0
00D1 3704 CPI R16,0x74
00D2 F479 BNE 0x00E2
(0078) {
(0079) puts0("test ok!");
00D3 E000 LDI R16,0
00D4 E011 LDI R17,1
00D5 DFCD RCALL _puts0
(0080) for (i=0;i<10;i++)
00D6 2744 CLR R20
00D7 C004 RJMP 0x00DC
(0081) {
(0082) putchar0(0x30+i);
00D8 2F04 MOV R16,R20
00D9 5D00 SUBI R16,0xD0
00DA DFB2 RCALL _putchar0
00DB 9543 INC R20
00DC 304A CPI R20,0xA
00DD F3D0 BCS 0x00D8
(0083) }
(0084) putchar0(0x0a);
00DE E00A LDI R16,0xA
00DF DFAD RCALL _putchar0
(0085) putchar0(0x0d);
00E0 E00D LDI R16,0xD
00E1 DFAB RCALL _putchar0
00E2 CFED RJMP 0x00D0
(0086) }
(0087) #else
(0088) if (getchar1()=='t')//按键盘t键开始测试
(0089) {
(0090) puts1("test ok!");
(0091) for (i=0;i<10;i++)
(0092) {
(0093) putchar1(0x30+i);
(0094) }
(0095) putchar1(0x0a);
(0096) putchar1(0x0d);
(0097) }
(0098) #endif
(0099) }
(0100) }
FILE: <library>
00E3 9508 RET
push_gset1:
00E4 935A ST R21,-Y
00E5 934A ST R20,-Y
00E6 9508 RET
pop_gset1:
00E7 E0E1 LDI R30,1
pop:
00E8 9149 LD R20,Y+
00E9 9159 LD R21,Y+
00EA FDE0 SBRC R30,0
00EB 9508 RET
00EC 9169 LD R22,Y+
00ED 9179 LD R23,Y+
00EE FDE1 SBRC R30,1
00EF 9508 RET
00F0 90A9 LD R10,Y+
00F1 90B9 LD R11,Y+
00F2 FDE2 SBRC R30,2
00F3 9508 RET
00F4 90C9 LD R12,Y+
00F5 90D9 LD R13,Y+
00F6 FDE3 SBRC R30,3
00F7 9508 RET
00F8 90E9 LD R14,Y+
00F9 90F9 LD R15,Y+
00FA 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -