📄 sio.lis
字号:
.module sio.c
.area text(rom, con, rel)
0000 .dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\sio.c
0000 .dbfunc e Com_init _Com_init fV
.even
0000 _Com_init::
0000 .dbline -1
0000 .dbline 43
0000 ; /************************************************
0000 ; 文件:sio.c
0000 ; 用途:结构化串口通信程序
0000 ; 注意:
0000 ; 创建:2008.1.26
0000 ; 修改:2008.1.26
0000 ; Copy Right (c) www.avrvi.com AVR与虚拟仪器
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 ; #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 47
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 BBD0 xcall _Tbuf_init
0006 .dbline 48
0006 ; Rbuf_init(&RTbuf_UART0);
0006 00E0 ldi R16,<_RTbuf_UART0
0008 10E0 ldi R17,>_RTbuf_UART0
000A AFD0 xcall _Rbuf_init
000C .dbline 49
000C ; UCSR0B = 0x00; //disable while setting baud rate
000C 2224 clr R2
000E 2AB8 out 0xa,R2
0010 .dbline 50
0010 ; UCSR0A=0x00;
0010 2BB8 out 0xb,R2
0012 .dbline 56
0012 ;
0012 ; #if CPU_TYPE <= M32
0012 ; UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
0012 ; UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
0012 ; #else
0012 ; UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY
0012 86E0 ldi R24,6
0014 80939500 sts 149,R24
0018 .dbline 57
0018 ; UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
0018 88ED ldi R24,216
001A 8AB9 out 0xa,R24
001C .dbline 71
001C ; #endif
001C ;
001C ; #endif
001C ;
001C ;
001C ; #if USEUART1
001C ; Tbuf_init(&RTbuf_B); //初始化接收缓冲
001C ; Rbuf_init(&RTbuf_B);
001C ; UCSR1B = 0x00; //disable while setting baud rate
001C ; UCSR1A = 0x00;
001C ; UCSR1C = 0x06;
001C ; UCSR1B = 0xD8;
001C ; #endif
001C ; Com_baudrate (9600); //
001C 00E8 ldi R16,9600
001E 15E2 ldi R17,37
0020 01D0 xcall _Com_baudrate
0022 .dbline -2
0022 L2:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbend
0024 .dbfunc e Com_baudrate _Com_baudrate fV
0024 ; tmp -> R10,R11
0024 ; baudrate -> R10,R11
.even
0024 _Com_baudrate::
0024 0E940000 xcall push_gset3
0028 5801 movw R10,R16
002A .dbline -1
002A .dbline 84
002A ;
002A ; //SEI(); // 开中断
002A ; }
002A ; /*********************************************************************************************************
002A ; ** 函数名称: Com_baudrate
002A ; ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
002A ; ** 输 入: baudrate指定的波特率
002A ; ** 全局变量: 无
002A ; ** 调用模块: 无
002A ; ** 说明:
002A ; ** 注意:
002A ; ********************************************************************************************************/
002A ; void Com_baudrate (unsigned int baudrate) {
002A .dbline 86
002A ; unsigned int tmp;
002A ; tmp= F_CPU/baudrate/16-1;
002A 1501 movw R2,R10
002C 4424 clr R4
002E 5524 clr R5
0030 40E0 ldi R20,0
0032 52E1 ldi R21,18
0034 6AE7 ldi R22,122
0036 70E0 ldi R23,0
0038 5A92 st -y,R5
003A 4A92 st -y,R4
003C 3A92 st -y,R3
003E 2A92 st -y,R2
0040 8A01 movw R16,R20
0042 9B01 movw R18,R22
0044 0E940000 xcall div32s
0048 40E1 ldi R20,16
004A 50E0 ldi R21,0
004C 60E0 ldi R22,0
004E 70E0 ldi R23,0
0050 7A93 st -y,R23
0052 6A93 st -y,R22
0054 5A93 st -y,R21
0056 4A93 st -y,R20
0058 0E940000 xcall div32s
005C 1801 movw R2,R16
005E 2901 movw R4,R18
0060 41E0 ldi R20,1
0062 50E0 ldi R21,0
0064 60E0 ldi R22,0
0066 70E0 ldi R23,0
0068 241A sub R2,R20
006A 350A sbc R3,R21
006C 460A sbc R4,R22
006E 570A sbc R5,R23
0070 5101 movw R10,R2
0072 .dbline 88
0072 ; #if USEUART0
0072 ; UBRR0H=(unsigned char)(tmp>>8);
0072 232C mov R2,R3
0074 3324 clr R3
0076 20929000 sts 144,R2
007A .dbline 89
007A ; UBRR0L=(unsigned char)tmp;
007A A9B8 out 0x9,R10
007C .dbline -2
007C L3:
007C 0E940000 xcall pop_gset3
0080 .dbline 0 ; func end
0080 0895 ret
0082 .dbsym r tmp 10 i
0082 .dbsym r baudrate 10 i
0082 .dbend
0082 .dbfunc e Com_putchar _Com_putchar fc
0082 .dbstruct 0 208 .1
0082 .dbfield 0 R_front c
0082 .dbfield 1 R_rear c
0082 .dbfield 2 R_count c
0082 .dbfield 3 R_overflow c
0082 .dbfield 4 R_buf A[100:100]c
0082 .dbfield 104 T_front c
0082 .dbfield 105 T_rear c
0082 .dbfield 106 T_count c
0082 .dbfield 107 T_buf A[100:100]c
0082 .dbfield 207 T_disabled c
0082 .dbend
0082 ; RTbuf -> R22,R23
0082 ; c -> R20
.even
0082 _Com_putchar::
0082 0E940000 xcall push_gset2
0086 B901 movw R22,R18
0088 402F mov R20,R16
008A .dbline -1
008A .dbline 106
008A ; #endif
008A ; #if USEUART1
008A ; UBRR1H=(unsigned char)(tmp>>8);
008A ; UBRR1L=(unsigned char)tmp;
008A ; #endif
008A ; }
008A ; /*********************************************************************************************************
008A ; ** 函数名称: Com_putchar
008A ; ** 功能描述: 从串行口输出一个字符c
008A ; ** 输 入: c:输出字符
008A ; ** 输出 : 0:失败 1:成功
008A ; ** 全局变量: 无
008A ; ** 调用模块:
008A ; ** 说明:
008A ; ** 注意:
008A ; ********************************************************************************************************/
008A ; unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
008A .dbline 108
008A ; //WDR(); //喂狗
008A ; if (Tbuf_full(RTbuf))
008A 8B01 movw R16,R22
008C 99D0 xcall _Tbuf_full
008E 0023 tst R16
0090 11F0 breq L5
0092 .dbline 109
0092 ; return(0);
0092 0027 clr R16
0094 04C0 xjmp L4
0096 L5:
0096 .dbline 110
0096 ; else{
0096 .dbline 111
0096 ; Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
0096 9B01 movw R18,R22
0098 042F mov R16,R20
009A A3D0 xcall _Tbuf_putchar
009C .dbline 112
009C ; return(1);
009C 01E0 ldi R16,1
009E .dbline -2
009E L4:
009E 0E940000 xcall pop_gset2
00A2 .dbline 0 ; func end
00A2 0895 ret
00A4 .dbsym r RTbuf 22 pS[.1]
00A4 .dbsym r c 20 c
00A4 .dbend
00A4 .dbfunc e Com_putstring _Com_putstring fV
00A4 ; i -> R12
00A4 ; RTbuf -> R22,R23
00A4 ; len -> R10
00A4 ; p -> R20,R21
.even
00A4 _Com_putstring::
00A4 0E940000 xcall push_gset4
00A8 A22E mov R10,R18
00AA A801 movw R20,R16
00AC 6885 ldd R22,y+8
00AE 7985 ldd R23,y+9
00B0 .dbline -1
00B0 .dbline 125
00B0 ; }
00B0 ; }
00B0 ; /*********************************************************************************************************
00B0 ; ** 函数名称: Com_putstring
00B0 ; ** 功能描述: 从串行口输出一个字符串
00B0 ; ** 输 入: p:指向输出字符串 len:输出长度
00B0 ; ** 输出 :
00B0 ; ** 全局变量: 无
00B0 ; ** 调用模块:
00B0 ; ** 说明:
00B0 ; ** 注意:
00B0 ; ********************************************************************************************************/
00B0 ; void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
00B0 .dbline 128
00B0 ; unsigned char i;
00B0 ; //WDR(); //喂狗
00B0 ; if (len!=0 ){
00B0 AA20 tst R10
00B2 79F0 breq L21
00B4 .dbline 128
00B4 .dbline 129
00B4 ; for(i=0;i<len;i++)
00B4 CC24 clr R12
00B6 0AC0 xjmp L13
00B8 L14:
00B8 .dbline 130
00B8 L15:
00B8 .dbline 130
00B8 9B01 movw R18,R22
00BA EC2D mov R30,R12
00BC FF27 clr R31
00BE E40F add R30,R20
00C0 F51F adc R31,R21
00C2 0081 ldd R16,z+0
00C4 DEDF xcall _Com_putchar
00C6 0023 tst R16
00C8 B9F3 breq L14
00CA L11:
00CA .dbline 129
00CA C394 inc R12
00CC L13:
00CC .dbline 129
00CC CA14 cp R12,R10
00CE A0F3 brlo L15
00D0 .dbline 131
00D0 ; while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
00D0 ; }
00D0 0BC0 xjmp L9
00D2 X0:
00D2 .dbline 132
00D2 ; else {
00D2 .dbline 133
00D2 ; do{
00D2 L20:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -