📄 sio.s
字号:
.module sio.c
.area text(rom, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\sio.c
.dbfunc e Com_init _Com_init fV
.even
_Com_init::
.dbline -1
.dbline 43
; /************************************************
; 文件:sio.c
; 用途:结构化串口通信程序
; 注意:
; 创建:2008.1.26
; 修改:2008.1.26
; Copy Right (c) www.avrvi.com AVR与虚拟仪器
; ************************************************/
; #include "..\config.h"
;
; #if USEUART0
; siocirqueue RTbuf_UART0;
; #endif
; #if USEUART1
; siocirqueue RTbuf_UART1;
; #endif
;
; #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
; #define USEUART0 TRUE
; #define USEUART1 FALSE
; #define iv_USART0_RXC iv_USART_RXC
; #define iv_USART0_TXC iv_USART_TXC
; #define UDR0 UDR
; #define UCSR0A UCSRA
; #define UCSR0B UCSRB
; #define UCSR0C UCSRC
; #define UBRR0H UBRRH
; #define UBRR0L UBRRL
; #define RXCIE0 RXCIE
; #define TXCIE0 TXCIE
; #endif
;
;
; /*********************************************************************************************************
; ** 函数名称: Com_init
; ** 功能描述: 初始化串行口
; ** 输 入:
; ** 全局变量: 无
; ** 调用模块: Com_baudrate
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_init (void) {
.dbline 47
; //WDR(); //喂狗
; //CLI(); // 关中断
; #if USEUART0
; Tbuf_init(&RTbuf_UART0); //初始化接收缓冲
ldi R16,<_RTbuf_UART0
ldi R17,>_RTbuf_UART0
xcall _Tbuf_init
.dbline 48
; Rbuf_init(&RTbuf_UART0);
ldi R16,<_RTbuf_UART0
ldi R17,>_RTbuf_UART0
xcall _Rbuf_init
.dbline 49
; UCSR0B = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 50
; UCSR0A=0x00;
out 0xb,R2
.dbline 56
;
; #if CPU_TYPE <= M32
; UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
; UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
; #else
; UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY
ldi R24,6
sts 149,R24
.dbline 57
; UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
ldi R24,216
out 0xa,R24
.dbline 71
; #endif
;
; #endif
;
;
; #if USEUART1
; Tbuf_init(&RTbuf_B); //初始化接收缓冲
; Rbuf_init(&RTbuf_B);
; UCSR1B = 0x00; //disable while setting baud rate
; UCSR1A = 0x00;
; UCSR1C = 0x06;
; UCSR1B = 0xD8;
; #endif
; Com_baudrate (9600); //
ldi R16,9600
ldi R17,37
xcall _Com_baudrate
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Com_baudrate _Com_baudrate fV
; tmp -> R10,R11
; baudrate -> R10,R11
.even
_Com_baudrate::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 84
;
; //SEI(); // 开中断
; }
; /*********************************************************************************************************
; ** 函数名称: Com_baudrate
; ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
; ** 输 入: baudrate指定的波特率
; ** 全局变量: 无
; ** 调用模块: 无
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_baudrate (unsigned int baudrate) {
.dbline 86
; unsigned int tmp;
; tmp= F_CPU/baudrate/16-1;
movw R2,R10
clr R4
clr R5
ldi R20,0
ldi R21,18
ldi R22,122
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall div32s
ldi R20,16
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R23
st -y,R22
st -y,R21
st -y,R20
xcall div32s
movw R2,R16
movw R4,R18
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R10,R2
.dbline 88
; #if USEUART0
; UBRR0H=(unsigned char)(tmp>>8);
mov R2,R3
clr R3
sts 144,R2
.dbline 89
; UBRR0L=(unsigned char)tmp;
out 0x9,R10
.dbline -2
L3:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r tmp 10 i
.dbsym r baudrate 10 i
.dbend
.dbfunc e Com_putchar _Com_putchar fc
.dbstruct 0 208 .1
.dbfield 0 R_front c
.dbfield 1 R_rear c
.dbfield 2 R_count c
.dbfield 3 R_overflow c
.dbfield 4 R_buf A[100:100]c
.dbfield 104 T_front c
.dbfield 105 T_rear c
.dbfield 106 T_count c
.dbfield 107 T_buf A[100:100]c
.dbfield 207 T_disabled c
.dbend
; RTbuf -> R22,R23
; c -> R20
.even
_Com_putchar::
xcall push_gset2
movw R22,R18
mov R20,R16
.dbline -1
.dbline 106
; #endif
; #if USEUART1
; UBRR1H=(unsigned char)(tmp>>8);
; UBRR1L=(unsigned char)tmp;
; #endif
; }
; /*********************************************************************************************************
; ** 函数名称: Com_putchar
; ** 功能描述: 从串行口输出一个字符c
; ** 输 入: c:输出字符
; ** 输出 : 0:失败 1:成功
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
.dbline 108
; //WDR(); //喂狗
; if (Tbuf_full(RTbuf))
movw R16,R22
xcall _Tbuf_full
tst R16
breq L5
.dbline 109
; return(0);
clr R16
xjmp L4
L5:
.dbline 110
; else{
.dbline 111
; Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
movw R18,R22
mov R16,R20
xcall _Tbuf_putchar
.dbline 112
; return(1);
ldi R16,1
.dbline -2
L4:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r RTbuf 22 pS[.1]
.dbsym r c 20 c
.dbend
.dbfunc e Com_putstring _Com_putstring fV
; i -> R12
; RTbuf -> R22,R23
; len -> R10
; p -> R20,R21
.even
_Com_putstring::
xcall push_gset4
mov R10,R18
movw R20,R16
ldd R22,y+8
ldd R23,y+9
.dbline -1
.dbline 125
; }
; }
; /*********************************************************************************************************
; ** 函数名称: Com_putstring
; ** 功能描述: 从串行口输出一个字符串
; ** 输 入: p:指向输出字符串 len:输出长度
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
.dbline 128
; unsigned char i;
; //WDR(); //喂狗
; if (len!=0 ){
tst R10
breq L21
.dbline 128
.dbline 129
; for(i=0;i<len;i++)
clr R12
xjmp L13
L14:
.dbline 130
L15:
.dbline 130
movw R18,R22
mov R30,R12
clr R31
add R30,R20
adc R31,R21
ldd R16,z+0
xcall _Com_putchar
tst R16
breq L14
L11:
.dbline 129
inc R12
L13:
.dbline 129
cp R12,R10
brlo L15
.dbline 131
; while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
; }
xjmp L9
X0:
.dbline 132
; else {
.dbline 133
; do{
L20:
.dbline 134
L21:
.dbline 134
; while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
movw R18,R22
movw R30,R20
ldd R16,z+0
xcall _Com_putchar
tst R16
breq L20
.dbline 135
L18:
.dbline 135
movw R30,R20
ld R24,Z+
movw R20,R30
cpi R24,10
brne L21
.dbline 136
L9:
.dbline -2
L7:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 12 c
.dbsym r RTbuf 22 pS[.1]
.dbsym r len 10 c
.dbsym r p 20 pc
.dbend
.dbfunc e Com_getchar _Com_getchar fc
; RTbuf -> R20,R21
; mode -> R22
.even
_Com_getchar::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 151
; }while(*p++!='\n');
; }
;
; }
; /*********************************************************************************************************
; ** 函数名称: Com_getchar
; ** 功能描述: 从串行口输入一个字符
; ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
; ** 1 等待数据到来
; ** 输出 : 读入的字符
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
;
; unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) {
L24:
.dbline 159
L25:
.dbline 159
; //WDR(); //喂狗
; // Delay(Delay_Comget,MaxLimit_Comget_Delay);
; // if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
; // if (DelayOvf(Delay_Comget))
; // return 0; //时间超时
; // else
;
; while(!Com_R_count(RTbuf));
movw R16,R20
xcall _Com_R_count
tst R16
breq L24
.dbline 160
; return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
movw R16,R20
xcall _Rbuf_getchar
.dbline -2
L23:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r RTbuf 20 pS[.1]
.dbsym r mode 22 c
.dbend
.dbfunc e Com_Rbuf_Clear _Com_Rbuf_Clear fV
; RTbuf -> R20,R21
.even
_Com_Rbuf_Clear::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 165
; }
;
;
;
; void Com_Rbuf_Clear(siocirqueue *RTbuf){
.dbline 166
; Rbuf_init(RTbuf);
movw R16,R20
xcall _Rbuf_init
.dbline -2
L27:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r RTbuf 20 pS[.1]
.dbend
.dbfunc e Com_getstring _Com_getstring fc
; i -> R20
; RTbuf -> R22,R23
; len -> R12
; p -> R10,R11
.even
_Com_getstring::
xcall push_gset4
mov R12,R18
movw R10,R16
ldd R22,y+8
ldd R23,y+9
.dbline -1
.dbline 171
; }
;
;
;
; unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
.dbline 172
; unsigned char i=0;
clr R20
.dbline 174
; //WDR(); //喂狗
; if (len>0 ){
clr R2
cp R2,R12
brsh L29
.dbline 174
.dbline 175
xjmp L34
L31:
.dbline 175
.dbline 177
movw R18,R22
ldi R16,1
xcall _Com_getchar
movw R30,R10
st Z+,R16
movw R10,R30
.dbline 178
L32:
.dbline 175
inc R20
L34:
.dbline 175
; for(i=0;i<len;i++){
cp R20,R12
brlo L31
.dbline 179
; //WDR(); //喂狗
; *p++=Com_getchar(1,RTbuf);
; }
; return(len);
mov R16,R12
xjmp L28
L29:
.dbline 181
; }
; else{
L35:
.dbline 184
;
;
; do{
.dbline 185
; *p++=Com_getchar(1,RTbuf);
movw R18,R22
ldi R16,1
xcall _Com_getchar
movw R30,R10
st Z+,R16
movw R10,R30
.dbline 186
; i++;
inc R20
.dbline 188
L36:
.dbline 188
; //WDR(); //喂狗
; }while(*(p-1)!='\n');
movw R30,R10
sbiw R30,1
ldd R24,z+0
cpi R24,10
brne L35
.dbline 191
; // *p++=Com_getchar(1,RTbuf);
; // *(p)=0;
; return(i);
mov R16,R20
.dbline -2
L28:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r RTbuf 22 pS[.1]
.dbsym r len 12 c
.dbsym r p 10 pc
.dbend
.dbfunc e Com_R_count _Com_R_count fc
; RTbuf -> R16,R17
.even
_Com_R_count::
.dbline -1
.dbline 207
; }
;
; }
;
;
; /*********************************************************************************************************
; ** 函数名称: Com_R_count
; ** 功能描述: 返回接收缓冲区字符个数函数
; ** 输 入:
; ** 输出 : 字符个数
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Com_R_count(siocirqueue *RTbuf){
.dbline 208
; return RTbuf->R_count;
movw R30,R16
ldd R16,z+2
.dbline -2
L38:
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Rbuf_init _Rbuf_init fV
; RTbuf -> R16,R17
.even
_Rbuf_init::
.dbline -1
.dbline 220
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_init
; ** 功能描述: 接收缓冲区初始化
; ** 输 入:
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Rbuf_init(siocirqueue *RTbuf){
.dbline 221
; RTbuf->R_front=0;
clr R2
movw R30,R16
std z+0,R2
.dbline 222
; RTbuf->R_rear=0;
std z+1,R2
.dbline 223
; RTbuf->R_count=0;
movw R30,R16
std z+2,R2
.dbline 224
; RTbuf->R_overflow=0;
movw R30,R16
std z+3,R2
.dbline -2
L39:
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Tbuf_init _Tbuf_init fV
; RTbuf -> R16,R17
.even
_Tbuf_init::
.dbline -1
.dbline 236
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_init
; ** 功能描述: 发送缓冲区初始化
; ** 输 入:
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Tbuf_init(siocirqueue *RTbuf){
.dbline 237
; RTbuf->T_front=0;
clr R2
movw R30,R16
subi R30,152 ; addi 104
sbci R31,255
std z+0,R2
.dbline 238
; RTbuf->T_rear=0;
movw R30,R16
subi R30,151 ; addi 105
sbci R31,255
std z+0,R2
.dbline 239
; RTbuf->T_count=0;
movw R30,R16
subi R30,150 ; addi 106
sbci R31,255
std z+0,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -