📄 sio.lis
字号:
.module sio.c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\avr程序设计\串口通讯范例\sio.c
0000 .dbfunc e Com_init _Com_init fV
.even
0000 _Com_init::
0000 .dbline -1
0000 .dbline 39
0000 ;
0000 ;
0000 ; #include "config.h"
0000 ;
0000 ; #if USEUART0
0000 ; siocirqueue RTbuf_UART0;
0000 ; #endif
0000 ; #if USEUART1
0000 ; siocirqueue RTbuf_UART1;
0000 ; #endif
0000 ;
0000 ;
0000 ;
0000 ; #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
0000 ; #define USEUART0 TRUE
0000 ; #define USEUART1 FALSE
0000 ; #define iv_USART0_RXC iv_USART_RXC
0000 ; #define iv_USART0_TXC iv_USART_TXC
0000 ; #define UDR0 UDR
0000 ; #define UCSR0A UCSRA
0000 ; #define UCSR0B UCSRB
0000 ; #define UCSR0C UCSRC
0000 ; #define UBRR0H UBRRH
0000 ; #define UBRR0L UBRRL
0000 ; #define RXCIE0 RXCIE
0000 ; #define TXCIE0 TXCIE
0000 ; #endif
0000 ;
0000 ;
0000 ; /*********************************************************************************************************
0000 ; ** 函数名称: Com_init
0000 ; ** 功能描述: 初始化串行口
0000 ; ** 输 入:
0000 ; ** 全局变量: 无
0000 ; ** 调用模块: Com_baudrate
0000 ; ** 说明:
0000 ; ** 注意:
0000 ; ********************************************************************************************************/
0000 ; void Com_init (void) {
0000 .dbline 43
0000 ; //WDR(); //喂狗
0000 ; //CLI(); // 关中断
0000 ; #if USEUART0
0000 ; Tbuf_init(&RTbuf_UART0); //初始化接收缓冲
0000 00E0 ldi R16,<_RTbuf_UART0
0002 10E0 ldi R17,>_RTbuf_UART0
0004 B9D0 xcall _Tbuf_init
0006 .dbline 44
0006 ; Rbuf_init(&RTbuf_UART0);
0006 00E0 ldi R16,<_RTbuf_UART0
0008 10E0 ldi R17,>_RTbuf_UART0
000A ADD0 xcall _Rbuf_init
000C .dbline 45
000C ; UCSR0B = 0x00; //disable while setting baud rate
000C 2224 clr R2
000E 2AB8 out 0xa,R2
0010 .dbline 46
0010 ; UCSR0A=0x00;
0010 2BB8 out 0xb,R2
0012 .dbline 49
0012 ;
0012 ; #if CPU_TYPE <= M32
0012 ; UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
0012 86E8 ldi R24,134
0014 80BD out 0x20,R24
0016 .dbline 50
0016 ; UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
0016 88ED ldi R24,216
0018 8AB9 out 0xa,R24
001A .dbline 67
001A ; #else
001A ; UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY
001A ; UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
001A ; #endif
001A ;
001A ; #endif
001A ;
001A ;
001A ; #if USEUART1
001A ; Tbuf_init(&RTbuf_B); //初始化接收缓冲
001A ; Rbuf_init(&RTbuf_B);
001A ; UCSR1B = 0x00; //disable while setting baud rate
001A ; UCSR1A = 0x00;
001A ; UCSR1C = 0x06;
001A ; UCSR1B = 0xD8;
001A ; #endif
001A ; Com_baudrate (9600); //
001A 00E8 ldi R16,9600
001C 15E2 ldi R17,37
001E 01D0 xcall _Com_baudrate
0020 .dbline -2
0020 L2:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbend
0022 .dbfunc e Com_baudrate _Com_baudrate fV
0022 ; tmp -> R10,R11
0022 ; baudrate -> R10,R11
.even
0022 _Com_baudrate::
0022 0E940000 xcall push_gset3
0026 5801 movw R10,R16
0028 .dbline -1
0028 .dbline 80
0028 ;
0028 ; //SEI(); // 开中断
0028 ; }
0028 ; /*********************************************************************************************************
0028 ; ** 函数名称: Com_baudrate
0028 ; ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
0028 ; ** 输 入: baudrate指定的波特率
0028 ; ** 全局变量: 无
0028 ; ** 调用模块: 无
0028 ; ** 说明:
0028 ; ** 注意:
0028 ; ********************************************************************************************************/
0028 ; void Com_baudrate (uint16 baudrate) {
0028 .dbline 82
0028 ; uint16 tmp;
0028 ; tmp= F_CPU/baudrate/16-1;
0028 1501 movw R2,R10
002A 4424 clr R4
002C 5524 clr R5
002E 40E0 ldi R20,0
0030 50E8 ldi R21,128
0032 60E7 ldi R22,112
0034 70E0 ldi R23,0
0036 5A92 st -y,R5
0038 4A92 st -y,R4
003A 3A92 st -y,R3
003C 2A92 st -y,R2
003E 8A01 movw R16,R20
0040 9B01 movw R18,R22
0042 0E940000 xcall div32s
0046 40E1 ldi R20,16
0048 50E0 ldi R21,0
004A 60E0 ldi R22,0
004C 70E0 ldi R23,0
004E 7A93 st -y,R23
0050 6A93 st -y,R22
0052 5A93 st -y,R21
0054 4A93 st -y,R20
0056 0E940000 xcall div32s
005A 1801 movw R2,R16
005C 2901 movw R4,R18
005E 41E0 ldi R20,1
0060 50E0 ldi R21,0
0062 60E0 ldi R22,0
0064 70E0 ldi R23,0
0066 241A sub R2,R20
0068 350A sbc R3,R21
006A 460A sbc R4,R22
006C 570A sbc R5,R23
006E 5101 movw R10,R2
0070 .dbline 84
0070 ; #if USEUART0
0070 ; UBRR0H=(uint8)(tmp>>8);
0070 232C mov R2,R3
0072 3324 clr R3
0074 20BC out 0x20,R2
0076 .dbline 85
0076 ; UBRR0L=(uint8)tmp;
0076 A9B8 out 0x9,R10
0078 .dbline -2
0078 L3:
0078 0E940000 xcall pop_gset3
007C .dbline 0 ; func end
007C 0895 ret
007E .dbsym r tmp 10 i
007E .dbsym r baudrate 10 i
007E .dbend
007E .dbfunc e Com_putchar _Com_putchar fc
007E .dbstruct 0 28 .1
007E .dbfield 0 R_front c
007E .dbfield 1 R_rear c
007E .dbfield 2 R_count c
007E .dbfield 3 R_overflow c
007E .dbfield 4 R_buf A[10:10]c
007E .dbfield 14 T_front c
007E .dbfield 15 T_rear c
007E .dbfield 16 T_count c
007E .dbfield 17 T_buf A[10:10]c
007E .dbfield 27 T_disabled c
007E .dbend
007E ; RTbuf -> R22,R23
007E ; c -> R20
.even
007E _Com_putchar::
007E 0E940000 xcall push_gset2
0082 B901 movw R22,R18
0084 402F mov R20,R16
0086 .dbline -1
0086 .dbline 102
0086 ; #endif
0086 ; #if USEUART1
0086 ; UBRR1H=(uint8)(tmp>>8);
0086 ; UBRR1L=(uint8)tmp;
0086 ; #endif
0086 ; }
0086 ; /*********************************************************************************************************
0086 ; ** 函数名称: Com_putchar
0086 ; ** 功能描述: 从串行口输出一个字符c
0086 ; ** 输 入: c:输出字符
0086 ; ** 输出 : 0:失败 1:成功
0086 ; ** 全局变量: 无
0086 ; ** 调用模块:
0086 ; ** 说明:
0086 ; ** 注意:
0086 ; ********************************************************************************************************/
0086 ; uint8 Com_putchar (uint8 c,siocirqueue *RTbuf) {
0086 .dbline 104
0086 ; //WDR(); //喂狗
0086 ; if (Tbuf_full(RTbuf))
0086 8B01 movw R16,R22
0088 91D0 xcall _Tbuf_full
008A 0023 tst R16
008C 11F0 breq L5
008E .dbline 105
008E ; return(0);
008E 0027 clr R16
0090 04C0 xjmp L4
0092 L5:
0092 .dbline 106
0092 ; else{
0092 .dbline 107
0092 ; Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
0092 9B01 movw R18,R22
0094 042F mov R16,R20
0096 99D0 xcall _Tbuf_putchar
0098 .dbline 108
0098 ; return(1);
0098 01E0 ldi R16,1
009A .dbline -2
009A L4:
009A 0E940000 xcall pop_gset2
009E .dbline 0 ; func end
009E 0895 ret
00A0 .dbsym r RTbuf 22 pS[.1]
00A0 .dbsym r c 20 c
00A0 .dbend
00A0 .dbfunc e Com_putstring _Com_putstring fV
00A0 ; i -> R12
00A0 ; RTbuf -> R22,R23
00A0 ; len -> R10
00A0 ; p -> R20,R21
.even
00A0 _Com_putstring::
00A0 0E940000 xcall push_gset4
00A4 A22E mov R10,R18
00A6 A801 movw R20,R16
00A8 6885 ldd R22,y+8
00AA 7985 ldd R23,y+9
00AC .dbline -1
00AC .dbline 121
00AC ; }
00AC ; }
00AC ; /*********************************************************************************************************
00AC ; ** 函数名称: Com_putstring
00AC ; ** 功能描述: 从串行口输出一个字符串
00AC ; ** 输 入: p:指向输出字符串 len:输出长度
00AC ; ** 输出 :
00AC ; ** 全局变量: 无
00AC ; ** 调用模块:
00AC ; ** 说明:
00AC ; ** 注意:
00AC ; ********************************************************************************************************/
00AC ; void Com_putstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {
00AC .dbline 124
00AC ; uint8 i;
00AC ; //WDR(); //喂狗
00AC ; if (len!=0 ){
00AC AA20 tst R10
00AE 79F0 breq L21
00B0 .dbline 124
00B0 .dbline 125
00B0 ; for(i=0;i<len;i++)
00B0 CC24 clr R12
00B2 0AC0 xjmp L13
00B4 L14:
00B4 .dbline 126
00B4 L15:
00B4 .dbline 126
00B4 9B01 movw R18,R22
00B6 EC2D mov R30,R12
00B8 FF27 clr R31
00BA E40F add R30,R20
00BC F51F adc R31,R21
00BE 0081 ldd R16,z+0
00C0 DEDF xcall _Com_putchar
00C2 0023 tst R16
00C4 B9F3 breq L14
00C6 L11:
00C6 .dbline 125
00C6 C394 inc R12
00C8 L13:
00C8 .dbline 125
00C8 CA14 cp R12,R10
00CA A0F3 brlo L15
00CC .dbline 127
00CC ; while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
00CC ; }
00CC 0BC0 xjmp L9
00CE X0:
00CE .dbline 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -