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

📄 uart.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
字号:
                        .module UART.c
                        .area data(ram, con, rel)
 0000           _RxIndex::
 0000                   .blkb 2
                        .area idata
 0000 0000              .word 0
                        .area data(ram, con, rel)
 0002                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\UART.c
 0002                   .dbsym e RxIndex _RxIndex i
 0002           _UartState::
 0002                   .blkb 1
                        .area idata
 0002 00                .byte 0
                        .area data(ram, con, rel)
 0003                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\UART.c
 0003                   .dbsym e UartState _UartState c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\UART.c
 0000                   .dbfunc e put_c _put_c fV
 0000           ;              c -> R16
                        .even
 0000           _put_c::
 0000                   .dbline -1
 0000                   .dbline 18
 0000           ; #include "UART.h"
 0000           ; //全局变量
 0000           ; 
 0000           ; unsigned char *UartRx;          //存放接收数据的指针
 0000           ; unsigned int RxIndex=0;                       //存放接收数据的个数
 0000           ; unsigned int *RxLength;         //数据接收长度地址指针
 0000           ; unsigned char UartState=0;        
 0000           ; 
 0000           ; #define UART_REC_COM 7
 0000           ; /*
 0000           ; BIT      7          6----------------------------------------0
 0000           ;     UART_REC_COM         RESERVE
 0000           ;     接收完成
 0000           ;  */  
 0000           ; 
 0000           ; 
 0000           ; void put_c(unsigned char c) //发送采用查询方式
 0000           ; {
 0000           L2:
 0000                   .dbline 19
 0000           L3:
 0000                   .dbline 19
 0000           ;       while( !(UCSRA & (1<<UDRE)) );
 0000 5D9B              sbis 0xb,5
 0002 FECF              rjmp L2
 0004                   .dbline 20
 0004           ;       UDR=c;
 0004 0CB9              out 0xc,R16
 0006                   .dbline -2
 0006           L1:
 0006                   .dbline 0 ; func end
 0006 0895              ret
 0008                   .dbsym r c 16 c
 0008                   .dbend
 0008                   .dbfunc e put_s _put_s fV
 0008           ;            ptr -> R20,R21
                        .even
 0008           _put_s::
 0008 0E940000          xcall push_gset1
 000C A801              movw R20,R16
 000E                   .dbline -1
 000E                   .dbline 24
 000E           ; }
 000E           ; 
 000E           ; void put_s(unsigned char *ptr)
 000E           ; {
 000E 04C0              xjmp L7
 0010           L6:
 0010                   .dbline 26
 0010                   .dbline 27
 0010 FA01              movw R30,R20
 0012 0191              ld R16,Z+
 0014 AF01              movw R20,R30
 0016 F4DF              xcall _put_c
 0018                   .dbline 28
 0018           L7:
 0018                   .dbline 25
 0018           ;       while (*ptr)
 0018 FA01              movw R30,R20
 001A 2080              ldd R2,z+0
 001C 2220              tst R2
 001E C1F7              brne L6
 0020                   .dbline -2
 0020           L5:
 0020 0E940000          xcall pop_gset1
 0024                   .dbline 0 ; func end
 0024 0895              ret
 0026                   .dbsym r ptr 20 pc
 0026                   .dbend
 0026                   .dbfunc e put_bytes _put_bytes fV
 0026           ;      SendIndex -> R20,R21
 0026           ;         length -> R22,R23
 0026           ;            ptr -> R10,R11
                        .even
 0026           _put_bytes::
 0026 0E940000          xcall push_gset3
 002A B901              movw R22,R18
 002C 5801              movw R10,R16
 002E                   .dbline -1
 002E                   .dbline 32
 002E           ;       {
 002E           ;               put_c(*ptr++);
 002E           ;       }
 002E           ; }
 002E           ; 
 002E           ; void put_bytes(unsigned char *ptr,unsigned int length)
 002E           ; {
 002E                   .dbline 34
 002E           ;     unsigned int SendIndex;
 002E           ;     for(SendIndex = 0;SendIndex < length;SendIndex++)
 002E 4427              clr R20
 0030 5527              clr R21
 0032 06C0              xjmp L13
 0034           L10:
 0034                   .dbline 35
 0034                   .dbline 36
 0034 F501              movw R30,R10
 0036 0191              ld R16,Z+
 0038 5F01              movw R10,R30
 003A E2DF              xcall _put_c
 003C                   .dbline 37
 003C           L11:
 003C                   .dbline 34
 003C 4F5F              subi R20,255  ; offset = 1
 003E 5F4F              sbci R21,255
 0040           L13:
 0040                   .dbline 34
 0040 4617              cp R20,R22
 0042 5707              cpc R21,R23
 0044 B8F3              brlo L10
 0046                   .dbline -2
 0046           L9:
 0046 0E940000          xcall pop_gset3
 004A                   .dbline 0 ; func end
 004A 0895              ret
 004C                   .dbsym r SendIndex 20 i
 004C                   .dbsym r length 22 i
 004C                   .dbsym r ptr 10 pc
 004C                   .dbend
                        .area vector(rom, abs)
                        .org 52
 0034 0C942600          jmp _usart_rx_isr
                        .area text(rom, con, rel)
 004C                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\UART.c
 004C                   .dbfunc e usart_rx_isr _usart_rx_isr fV
                        .even
 004C           _usart_rx_isr::
 004C 2A92              st -y,R2
 004E 3A92              st -y,R3
 0050 8A93              st -y,R24
 0052 9A93              st -y,R25
 0054 EA93              st -y,R30
 0056 FA93              st -y,R31
 0058 2FB6              in R2,0x3f
 005A 2A92              st -y,R2
 005C                   .dbline -1
 005C                   .dbline 44
 005C                   .dbline 46
 005C 20900200          lds R2,_UartRx
 0060 30900300          lds R3,_UartRx+1
 0064 E0910000          lds R30,_RxIndex
 0068 F0910100          lds R31,_RxIndex+1
 006C E20D              add R30,R2
 006E F31D              adc R31,R3
 0070 2CB0              in R2,0xc
 0072 2082              std z+0,R2
 0074                   .dbline 47
 0074 80910000          lds R24,_RxIndex
 0078 90910100          lds R25,_RxIndex+1
 007C 0196              adiw R24,1
 007E 90930100          sts _RxIndex+1,R25
 0082 80930000          sts _RxIndex,R24
 0086                   .dbline 48
 0086 8230              cpi R24,2
 0088 E0E0              ldi R30,0
 008A 9E07              cpc R25,R30
 008C A0F0              brlo L15
 008E E0910000          lds R30,_RxLength
 0092 F0910100          lds R31,_RxLength+1
 0096 2080              ldd R2,z+0
 0098 3180              ldd R3,z+1
 009A 8215              cp R24,R2
 009C 9305              cpc R25,R3
 009E 58F0              brlo L15
 00A0                   .dbline 50
 00A0                   .dbline 51
 00A0 2224              clr R2
 00A2 3324              clr R3
 00A4 30920100          sts _RxIndex+1,R3
 00A8 20920000          sts _RxIndex,R2
 00AC                   .dbline 52
 00AC 80910200          lds R24,_UartState
 00B0 8068              ori R24,128
 00B2 80930200          sts _UartState,R24
 00B6                   .dbline 53
 00B6           L15:
 00B6                   .dbline -2
 00B6           L14:
 00B6 2990              ld R2,y+
 00B8 2FBE              out 0x3f,R2
 00BA F991              ld R31,y+
 00BC E991              ld R30,y+
 00BE 9991              ld R25,y+
 00C0 8991              ld R24,y+
 00C2 3990              ld R3,y+
 00C4 2990              ld R2,y+
 00C6                   .dbline 0 ; func end
 00C6 1895              reti
 00C8                   .dbend
 00C8                   .dbfunc e init_USART _init_USART fV
 00C8           ;     EnInterrup -> R16
                        .even
 00C8           _init_USART::
 00C8                   .dbline -1
 00C8                   .dbline 62
 00C8           ;     {
 00C8           ;         put_c(*ptr++);
 00C8           ;     }
 00C8           ; }
 00C8           ; 
 00C8           ; 
 00C8           ; //串口接收中断服务程序
 00C8           ; #pragma interrupt_handler usart_rx_isr: iv_USART_RX
 00C8           ; void usart_rx_isr(void)
 00C8           ; {
 00C8           ;       
 00C8           ;       *(UartRx+RxIndex) = UDR;                //保存数据到数组里面
 00C8           ;     RxIndex++;
 00C8           ;       if((RxIndex>=2) &&
 00C8           ;         (RxIndex>= *RxLength))
 00C8           ;     {
 00C8           ;         RxIndex=0;
 00C8           ;         UartState|= 1<<UART_REC_COM;    //通知主函数已经接收一帧数据完成
 00C8           ;     }
 00C8           ;               
 00C8           ; }
 00C8           ; 
 00C8           ; /************************************************************************/
 00C8           ; /* EnInterrup:0,不使能接收功能,!0使能接收功能
 00C8           ;                                                                      */
 00C8           ; /************************************************************************/
 00C8           ; void init_USART(unsigned char EnInterrup)//USART 初始化
 00C8           ; {
 00C8                   .dbline 65
 00C8           ; 
 00C8           ;     //USART 9600 8, n,1  PC上位机软件(超级终端等)也要设成同样的设置才能通讯
 00C8           ;     UCSRC = (1<<URSEL) | 0x06;
 00C8 86E8              ldi R24,134
 00CA 80BD              out 0x20,R24
 00CC                   .dbline 81
 00CC           ;     //异步,8位数据,无奇偶校验,一个停止位,无倍速
 00CC           ;     /*
 00CC           ;     UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
 00CC           ;     写访问
 00CC           ;     当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
 00CC           ;     若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
 00CC           ;     
 00CC           ;     读访问
 00CC           ;     对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
 00CC           ;     
 00CC           ;     
 00CC           ;     没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
 00CC           ;     */
 00CC           ;     
 00CC           ;     //U2X=0时的公式计算
 00CC           ;     UBRRL= (F_CPU/BAUDRATE/16-1)%256;
 00CC 83E3              ldi R24,51
 00CE 89B9              out 0x9,R24
 00D0                   .dbline 82
 00D0           ;     UBRRH= (F_CPU/BAUDRATE/16-1)/256;
 00D0 2224              clr R2
 00D2 20BC              out 0x20,R2
 00D4                   .dbline 89
 00D4           ;     //U2X=1时的公式计算
 00D4           ;     //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
 00D4           ;     //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
 00D4           ;     //也可根据数据手册的[波特率设置的例子]查得
 00D4           ;     //UBRRL = 0x2F; //set baud rate lo
 00D4           ;     //UBRRH = 0x00; //set baud rate hi
 00D4           ;     UCSRA = 0x00;
 00D4 2BB8              out 0xb,R2
 00D6                   .dbline 90
 00D6           ;     if(EnInterrup)
 00D6 0023              tst R16
 00D8 19F0              breq L18
 00DA                   .dbline 91
 00DA           ;         UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
 00DA 88E9              ldi R24,152
 00DC 8AB9              out 0xa,R24
 00DE 02C0              xjmp L19
 00E0           L18:
 00E0                   .dbline 94
 00E0 88E1              ldi R24,24
 00E2 8AB9              out 0xa,R24
 00E4           L19:
 00E4                   .dbline -2
 00E4           L17:
 00E4                   .dbline 0 ; func end
 00E4 0895              ret
 00E6                   .dbsym r EnInterrup 16 c
 00E6                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\UART.c
 0000           _RxLength::
 0000                   .blkb 2
 0002                   .dbsym e RxLength _RxLength pi
 0002           _UartRx::
 0002                   .blkb 2
 0004                   .dbsym e UartRx _UartRx pc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -