📄 10uart.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E0 CPI R30,0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E008B CALL _main
_exit:
0066 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0067 940E00F7 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\010-UART-232\main.c
(0001) /*
(0002) 实验十:
(0003)
(0004) UART接口实险。
(0005) 1、UART0和UART1两个串口综合实验,串口以查询方式接收数据和发送数据。
(0006) UART0:任务A,每秒向串口0发送一个字节变化的数据,不接收数据。
(0007) UART1:任务B,从串口1接收数据,将收到的数据原样返回并显示在PB口。
(0008) 两个串口这间各自独立运行。
(0009) 可以将COM0和COM1口交叉对接,这样就可以在两个之间做实验了。
(0010) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0011) 3、进行此实验请SW1两组跳针插上到232一边,插上LED短路块。
(0012) 4、实验中使用了两路串口,通过此实验,可以对两组串口通信有个初步认识。
(0013)
(0014) AVR mega128学习板
(0015) www.iccavr.com 阿发
(0016) 11:47 2007-10-13
(0017) */
(0018)
(0019) #include "iom128v.h"
(0020) #include "uart.h"
(0021)
(0022) /*延时函数*/
(0023) void delay_ms(unsigned char i) {
(0024)
(0025) unsigned char a, b;
(0026) for (a = 0; a < i; a++) {
0069 2744 CLR R20
006A C006 RJMP 0x0071
(0027) for (b = 1; b; b++);
006B E061 LDI R22,1
006C C001 RJMP 0x006E
006D 9563 INC R22
006E 2366 TST R22
006F F7E9 BNE 0x006D
0070 9543 INC R20
0071 1740 CP R20,R16
0072 F3C0 BCS 0x006B
0073 940E00EE CALL pop_gset2
0075 9508 RET
(0028) }
(0029) }
(0030)
(0031) /*IO口初始化函数*/
(0032) void io_init(void) {
(0033)
(0034) DDRA = 0x00; /*方向输入*/
_io_init:
0076 2422 CLR R2
0077 BA2A OUT 0x1A,R2
(0035) PORTA = 0xFF; /*打开上拉*/
0078 EF8F LDI R24,0xFF
0079 BB8B OUT 0x1B,R24
(0036) DDRB = 0xFF; /*方向输出*/
007A BB87 OUT 0x17,R24
(0037) PORTB = 0xFF; /*输出高电平*/
007B BB88 OUT 0x18,R24
(0038) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
007C BA24 OUT 0x14,R2
(0039) PORTC = 0xFF;
007D BB85 OUT 0x15,R24
(0040) DDRD = 0x00;
007E BA21 OUT 0x11,R2
(0041) PORTD = 0xFF;
007F BB82 OUT 0x12,R24
(0042) DDRE = 0x00;
0080 B822 OUT 0x02,R2
(0043) PORTE = 0xFF;
0081 B983 OUT 0x03,R24
(0044) DDRF = 0x00;
0082 92200061 STS 0x61,R2
(0045) PORTF = 0xFF;
0084 93800062 STS 0x62,R24
(0046) DDRG = 0x00;
0086 92200064 STS 0x64,R2
(0047) PORTG = 0xFF;
0088 93800065 STS 0x65,R24
008A 9508 RET
(0048) }
(0049)
(0050) /*主函数*/
(0051) void main(void) {
(0052)
(0053) unsigned char j = 0;
_main:
j --> R20
i --> R22
temp --> R10
008B 2744 CLR R20
(0054) unsigned int i = 0;
008C 2766 CLR R22
008D 2777 CLR R23
(0055) unsigned int temp = 0;
008E 24AA CLR R10
008F 24BB CLR R11
(0056)
(0057) io_init();
0090 DFE5 RCALL _io_init
(0058) uart_init0();
0091 940E00B6 CALL _uart_init0
(0059) uart_init1();
0093 940E00CB CALL _uart_init1
0095 C01E RJMP 0x00B4
(0060)
(0061) while (1) {
(0062) delay_ms(1);
0096 E001 LDI R16,1
0097 DFCF RCALL _delay_ms
(0063)
(0064) /*UART0部分*/
(0065) i ++;
0098 5F6F SUBI R22,0xFF
0099 4F7F SBCI R23,0xFF
(0066) if (i > 1000) { /*1000mS执行一次*/
009A EE88 LDI R24,0xE8
009B E093 LDI R25,3
009C 1786 CP R24,R22
009D 0797 CPC R25,R23
009E F430 BCC 0x00A5
(0067) uart_transmit0(j); /*发送变量j*/
009F 2F04 MOV R16,R20
00A0 940E00C3 CALL _uart_transmit0
(0068) j ++;
00A2 9543 INC R20
(0069) i = 0;
00A3 2766 CLR R22
00A4 2777 CLR R23
(0070) }
(0071)
(0072) /*UART1部分*/
(0073) temp = uart_receive1(); /*接收数据*/
00A5 940E00E2 CALL _uart_receive1
00A7 0158 MOVW R10,R16
(0074) if (temp != 0) { /*判断是否接收到数据*/
00A8 3000 CPI R16,0
00A9 0701 CPC R16,R17
00AA F049 BEQ 0x00B4
(0075) PORTB = ~(temp & 0xFF); /*显示低电平有效*/
00AB 01C5 MOVW R24,R10
00AC 7090 ANDI R25,0
00AD 9580 COM R24
00AE 9590 COM R25
00AF BB88 OUT 0x18,R24
(0076) uart_transmit1(temp & 0xFF); /*发送收到的数据*/
00B0 2D0A MOV R16,R10
00B1 7010 ANDI R17,0
00B2 940E00DB CALL _uart_transmit1
00B4 CFE1 RJMP 0x0096
00B5 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\010-UART-232\uart.c
(0001) #include "iom128v.h"
(0002)
(0003) /*串口初始化函数*/
(0004) void uart_init0(void) {
(0005)
(0006) UCSR0A = (1 << U2X0); /*倍速*/
_uart_init0:
00B6 E082 LDI R24,2
00B7 B98B OUT 0x0B,R24
(0007) UCSR0B = (1 << TXEN0) | (1 << RXEN0); /*允许接收和发送*/
00B8 E188 LDI R24,0x18
00B9 B98A OUT 0x0A,R24
(0008) UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /*8位数据、1 位停止、异步、无校验*/
00BA E086 LDI R24,6
00BB 93800095 STS 0x95,R24
(0009) UBRR0H = 0x00;
00BD 2422 CLR R2
00BE 92200090 STS 0x90,R2
(0010) UBRR0L = 12; /*波特率9600*/
00C0 E08C LDI R24,0xC
00C1 B989 OUT 0x09,R24
00C2 9508 RET
(0011) }
(0012)
(0013) /*数据发送,查询方式*/
(0014) void uart_transmit0(unsigned char i) {
(0015)
(0016) while (!(UCSR0A & (1<<UDRE0))); /* 等待发送缓冲器为空*/
_uart_transmit0:
i --> R16
00C3 9B5D SBIS 0x0B,5
00C4 CFFE RJMP _uart_transmit0
(0017) UDR0 = i; /* 发送数据*/
00C5 B90C OUT 0x0C,R16
00C6 9508 RET
(0018) }
(0019)
(0020) /*数据接收,等待查询方式*/
(0021) unsigned char uart_receive0(void) {
(0022)
(0023) while (!(UCSR0A & (1<<RXC0))); /* 等待接收数据*/
_uart_receive0:
00C7 9B5F SBIS 0x0B,7
00C8 CFFE RJMP _uart_receive0
(0024) return UDR0; /* 获取并返回数据*/
00C9 B10C IN R16,0x0C
00CA 9508 RET
(0025) }
(0026)
(0027) /*串口初始化函数*/
(0028) void uart_init1(void) {
(0029)
(0030) UCSR1A = (1 << U2X1); /*倍速*/
_uart_init1:
00CB E082 LDI R24,2
00CC 9380009B STS 0x9B,R24
(0031) UCSR1B = (1 << TXEN1) | (1 << RXEN1); /*允许接收和发送*/
00CE E188 LDI R24,0x18
00CF 9380009A STS 0x9A,R24
(0032) UCSR1C = (1 << UCSZ11) | (1 << UCSZ10); /*8位数据、1 位停止、异步、无校验*/
00D1 E086 LDI R24,6
00D2 9380009D STS 0x9D,R24
(0033) UBRR1H = 0x00;
00D4 2422 CLR R2
00D5 92200098 STS 0x98,R2
(0034) UBRR1L = 12; /*波特率9600*/
00D7 E08C LDI R24,0xC
00D8 93800099 STS 0x99,R24
00DA 9508 RET
(0035) }
(0036)
(0037) /*数据发送,查询方式*/
(0038) void uart_transmit1(unsigned char i) {
(0039)
(0040) while (!(UCSR1A & (1<<UDRE1))); /* 等待发送缓冲器为空*/
_uart_transmit1:
i --> R16
00DB 9020009B LDS R2,0x9B
00DD FE25 SBRS R2,5
00DE CFFC RJMP _uart_transmit1
(0041) UDR1 = i; /* 发送数据*/
00DF 9300009C STS 0x9C,R16
00E1 9508 RET
(0042) }
(0043)
(0044) /*数据接收,周期查询方式*/
(0045) unsigned int uart_receive1(void) {
(0046)
(0047) if ((UCSR1A & (1<<RXC1)) != 0) { /* 判断接收是否完成*/
_uart_receive1:
00E2 9020009B LDS R2,0x9B
00E4 FE27 SBRS R2,7
00E5 C005 RJMP 0x00EB
(0048) return (UDR1 | 0x0100); /* 返回数据和标志*/
00E6 9100009C LDS R16,0x9C
00E8 2711 CLR R17
00E9 6011 ORI R17,1
00EA C002 RJMP 0x00ED
(0049) }
(0050) else {
(0051) return 0; /*返回无效标志*/
FILE: <library>
00EB 2700 CLR R16
00EC 2711 CLR R17
00ED 9508 RET
pop_gset2:
00EE E0E2 LDI R30,2
00EF 940C00FD JMP pop
push_gset5:
00F1 92FA ST R15,-Y
00F2 92EA ST R14,-Y
push_gset4:
00F3 92DA ST R13,-Y
00F4 92CA ST R12,-Y
push_gset3:
00F5 92BA ST R11,-Y
00F6 92AA ST R10,-Y
push_gset2:
00F7 937A ST R23,-Y
00F8 936A ST R22,-Y
push_gset1:
00F9 935A ST R21,-Y
00FA 934A ST R20,-Y
00FB 9508 RET
pop_gset1:
00FC E0E1 LDI R30,1
pop:
00FD 9149 LD R20,Y+
00FE 9159 LD R21,Y+
00FF FDE0 SBRC R30,0
0100 9508 RET
0101 9169 LD R22,Y+
0102 9179 LD R23,Y+
0103 FDE1 SBRC R30,1
0104 9508 RET
0105 90A9 LD R10,Y+
0106 90B9 LD R11,Y+
0107 FDE2 SBRC R30,2
0108 9508 RET
0109 90C9 LD R12,Y+
010A 90D9 LD R13,Y+
010B FDE3 SBRC R30,3
010C 9508 RET
010D 90E9 LD R14,Y+
010E 90F9 LD R15,Y+
010F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -