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

📄 uart.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 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 + -