📄 uart.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 + -