📄 uart.lis
字号:
.module uart.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\011-UART-485\uart.c
0000 .dbfunc e uart_init0 _uart_init0 fV
.even
0000 _uart_init0::
0000 .dbline -1
0000 .dbline 13
0000 ; /*
0000 ; RS485网络驱动函数。
0000 ;
0000 ; RS485网络和普通的RS232网络从程序上来讲,维一的区别是就是有方向控制。
0000 ; 数据发送时芯片需要工作在输出方式,这样数据才能被有效发出。
0000 ; 不发送数据时一定要把RS485芯片设置为输入状态,否则会影响网络上其它设备。
0000 ; */
0000 ;
0000 ; #include "iom128v.h"
0000 ; #include <macros.h>
0000 ;
0000 ; /*串口初始化函数*/
0000 ; void uart_init0(void) {
0000 .dbline 15
0000 ;
0000 ; UCSR0A = (1 << U2X0); /*倍速*/
0000 82E0 ldi R24,2
0002 8BB9 out 0xb,R24
0004 .dbline 16
0004 ; UCSR0B = (1 << TXEN0) | (1 << RXEN0); /*允许接收和发送*/
0004 88E1 ldi R24,24
0006 8AB9 out 0xa,R24
0008 .dbline 17
0008 ; UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /*8位数据、1 位停止、异步、无校验*/
0008 86E0 ldi R24,6
000A 80939500 sts 149,R24
000E .dbline 18
000E ; UBRR0H = 0x00;
000E 2224 clr R2
0010 20929000 sts 144,R2
0014 .dbline 19
0014 ; UBRR0L = 12; /*波特率9600*/
0014 8CE0 ldi R24,12
0016 89B9 out 0x9,R24
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbend
001A .dbfunc e uart_transmit0 _uart_transmit0 fV
001A ; i -> R16
.even
001A _uart_transmit0::
001A .dbline -1
001A .dbline 23
001A ; }
001A ;
001A ; /*数据发送,查询方式*/
001A ; void uart_transmit0(unsigned char i) {
001A .dbline 25
001A ;
001A ; PORTG |= (1 << PG3); /*设置RS485为输出状态*/
001A 80916500 lds R24,101
001E 8860 ori R24,8
0020 80936500 sts 101,R24
0024 .dbline 26
0024 ; UDR0 = i; /*发送数据*/
0024 0CB9 out 0xc,R16
0026 L3:
0026 .dbline 27
0026 L4:
0026 .dbline 27
0026 ; while (!(UCSR0A & (1<<TXC0))); /*等待发送完成*/
0026 5E9B sbis 0xb,6
0028 FECF rjmp L3
002A .dbline 28
002A ; UCSR0A |= (1 << TXC0); /*清除发送标志*/
002A 5E9A sbi 0xb,6
002C .dbline 29
002C ; PORTG &= ~(1 << PG3); /*设置RS485为输入状态*/
002C 80916500 lds R24,101
0030 877F andi R24,247
0032 80936500 sts 101,R24
0036 .dbline -2
0036 L2:
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbsym r i 16 c
0038 .dbend
0038 .dbfunc e uart_receive0 _uart_receive0 fc
.even
0038 _uart_receive0::
0038 .dbline -1
0038 .dbline 33
0038 ; }
0038 ;
0038 ; /*数据接收,等待查询方式*/
0038 ; unsigned char uart_receive0(void) {
0038 L7:
0038 .dbline 35
0038 L8:
0038 .dbline 35
0038 ;
0038 ; while (!(UCSR0A & (1<<RXC0))); /* 等待接收数据*/
0038 5F9B sbis 0xb,7
003A FECF rjmp L7
003C .dbline 36
003C ; return UDR0; /* 获取并返回数据*/
003C 0CB1 in R16,0xc
003E .dbline -2
003E L6:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbend
0040 .dbfunc e uart_init1 _uart_init1 fV
.even
0040 _uart_init1::
0040 .dbline -1
0040 .dbline 40
0040 ; }
0040 ;
0040 ; /*串口初始化函数*/
0040 ; void uart_init1(void) {
0040 .dbline 42
0040 ;
0040 ; UCSR1A = (1 << U2X1); /*倍速*/
0040 82E0 ldi R24,2
0042 80939B00 sts 155,R24
0046 .dbline 43
0046 ; UCSR1B = (1 << TXEN1) | (1 << RXEN1); /*允许接收和发送*/
0046 88E1 ldi R24,24
0048 80939A00 sts 154,R24
004C .dbline 44
004C ; UCSR1C = (1 << UCSZ11) | (1 << UCSZ10); /*8位数据、1 位停止、异步、无校验*/
004C 86E0 ldi R24,6
004E 80939D00 sts 157,R24
0052 .dbline 45
0052 ; UBRR1H = 0x00;
0052 2224 clr R2
0054 20929800 sts 152,R2
0058 .dbline 46
0058 ; UBRR1L = 12; /*波特率9600*/
0058 8CE0 ldi R24,12
005A 80939900 sts 153,R24
005E .dbline -2
005E L10:
005E .dbline 0 ; func end
005E 0895 ret
0060 .dbend
0060 .dbfunc e uart_transmit1 _uart_transmit1 fV
0060 ; i -> R16
.even
0060 _uart_transmit1::
0060 .dbline -1
0060 .dbline 50
0060 ; }
0060 ;
0060 ; /*数据发送,查询方式*/
0060 ; void uart_transmit1(unsigned char i) {
0060 .dbline 52
0060 ;
0060 ; PORTG |= (1 << PG4); /*设置RS485为输出状态*/
0060 80916500 lds R24,101
0064 8061 ori R24,16
0066 80936500 sts 101,R24
006A .dbline 53
006A ; UDR1 = i; /* 发送数据*/
006A 00939C00 sts 156,R16
006E L12:
006E .dbline 54
006E L13:
006E .dbline 54
006E ; while (!(UCSR1A & (1<<TXC1))); /* 等待发送完成*/
006E 20909B00 lds R2,155
0072 26FE sbrs R2,6
0074 FCCF rjmp L12
0076 .dbline 55
0076 ; UCSR1A |= (1 << TXC1); /*清除发送标志*/
0076 80919B00 lds R24,155
007A 8064 ori R24,64
007C 80939B00 sts 155,R24
0080 .dbline 56
0080 ; PORTG &= ~(1 << PG4); /*设置RS485为输入状态*/
0080 80916500 lds R24,101
0084 8F7E andi R24,239
0086 80936500 sts 101,R24
008A .dbline -2
008A L11:
008A .dbline 0 ; func end
008A 0895 ret
008C .dbsym r i 16 c
008C .dbend
008C .dbfunc e uart_receive1 _uart_receive1 fi
.even
008C _uart_receive1::
008C .dbline -1
008C .dbline 60
008C ; }
008C ;
008C ; /*数据接收,周期查询方式*/
008C ; unsigned int uart_receive1(void) {
008C .dbline 62
008C ;
008C ; if ((UCSR1A & (1<<RXC1)) != 0) { /* 判断接收是否完成*/
008C 20909B00 lds R2,155
0090 27FE sbrs R2,7
0092 05C0 rjmp L16
0094 .dbline 62
0094 .dbline 63
0094 ; return (UDR1 | 0x0100); /* 返回数据和标志*/
0094 00919C00 lds R16,156
0098 1127 clr R17
009A 1160 ori R17,1
009C 02C0 xjmp L15
009E L16:
009E .dbline 65
009E ; }
009E ; else {
009E .dbline 66
009E ; return 0; /*返回无效标志*/
009E 0027 clr R16
00A0 1127 clr R17
00A2 .dbline -2
00A2 L15:
00A2 .dbline 0 ; func end
00A2 0895 ret
00A4 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -