📄 sio.s
字号:
movw R30,R16
std z+15,R2
.dbline 235
; RTbuf->T_count=0;
movw R30,R16
std z+16,R2
.dbline 236
; RTbuf->T_disabled=1;
ldi R24,1
movw R30,R16
std z+27,R24
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Rbuf_empty _Rbuf_empty fc
; RTbuf -> R16,R17
.even
_Rbuf_empty::
xcall push_gset1
.dbline -1
.dbline 248
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_empty
; ** 功能描述: 接收缓冲区判空
; ** 输 入:
; ** 输出 : TRUE 空 FALSE 非空
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; uint8 Rbuf_empty(siocirqueue *RTbuf){
.dbline 249
; return RTbuf->R_count==0;
movw R30,R16
ldd R2,z+2
tst R2
brne L42
ldi R20,1
ldi R21,0
xjmp L43
L42:
clr R20
clr R21
L43:
mov R16,R20
.dbline -2
L41:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Tbuf_full _Tbuf_full fc
; RTbuf -> R16,R17
.even
_Tbuf_full::
xcall push_gset1
.dbline -1
.dbline 287
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_empty
; ** 功能描述: 发送缓冲区判空
; ** 输 入:
; ** 输出 : TRUE 空 FALSE 非空
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; uint8 Tbuf_empty(void){
; return RTbuf->T_count==0;
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_full
; ** 功能描述: 接收缓冲区判满
; ** 输 入:
; ** 输出 : TRUE 满 FALSE 非满
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; uint8 Rbuf_full (void){
; return RTbuf->R_count==RBUF_SIZE;
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_full
; ** 功能描述: 发送缓冲区判满
; ** 输 入:
; ** 输出 : TRUE 满 FALSE 非满
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; uint8 Tbuf_full(siocirqueue *RTbuf){
.dbline 288
; return RTbuf->T_count==TBUF_SIZE;
movw R30,R16
ldd R24,z+16
cpi R24,10
brne L45
ldi R20,1
ldi R21,0
xjmp L46
L45:
clr R20
clr R21
L46:
mov R16,R20
.dbline -2
L44:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Tbuf_putchar _Tbuf_putchar fV
; RTbuf -> R20,R21
; x -> R22
.even
_Tbuf_putchar::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 319
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_putchar
; ** 功能描述: 把一个字符放入接收缓冲区
; ** 输 入:
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; void Rbuf_putchar (uint8 x){
; if(!Rbuf_full()){
; REV_DIS();
; RTbuf->R_count++;
; RTbuf->R_buf[RTbuf->R_rear]=x;
; RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
; REV_EN();
; }
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_putchar
; ** 功能描述: 把一个字符放入发送缓冲区
; ** 输 入:
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Tbuf_putchar(uint8 x,siocirqueue *RTbuf){
.dbline 320
; if(!Tbuf_full(RTbuf)){
movw R16,R20
xcall _Tbuf_full
tst R16
breq X1
xjmp L48
X1:
.dbline 320
.dbline 321
; TXC_DIS();
.dbline 321
cbi 0xa,6
.dbline 321
.dbline 321
.dbline 322
; if (RTbuf->T_disabled)
movw R30,R20
ldd R2,z+27
tst R2
breq L50
.dbline 323
; {
.dbline 324
; UDR0=x;
out 0xc,R22
.dbline 325
; RTbuf->T_disabled=0;
clr R2
movw R30,R20
std z+27,R2
.dbline 326
; }
xjmp L51
L50:
.dbline 328
; else
; {
.dbline 329
; RTbuf->T_count++;
movw R24,R20
adiw R24,16
movw R30,R24
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 330
; RTbuf->T_buf[RTbuf->T_rear]=x;
movw R24,R20
adiw R24,17
movw R30,R20
ldd R30,z+15
clr R31
add R30,R24
adc R31,R25
std z+0,R22
.dbline 331
; RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
movw R24,R20
adiw R24,15
movw R2,R24
ldi R17,10
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 332
; }
L51:
.dbline 333
.dbline 333
sbi 0xa,6
.dbline 333
.dbline 333
.dbline 334
L48:
.dbline -2
L47:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r RTbuf 20 pS[.1]
.dbsym r x 22 c
.dbend
.dbfunc e Rbuf_getchar _Rbuf_getchar fc
; Btemp -> R20
; RTbuf -> R22,R23
.even
_Rbuf_getchar::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 372
; TXC_EN();
; }
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_getstring
; ** 功能描述: 从接收缓冲区返回当前子串指针
; ** 输 入:
; ** 输出 : 当前子串指针
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; uint8 * Rbuf_getstring(void){
; return (RTbuf->R_buf[RTbuf->R_front]);
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_getstring
; ** 功能描述: 从发送缓冲区返回当前子串指针
; ** 输 入:
; ** 输出 : 当前子串指针
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; uint8 * Tbuf_getstring(void){
; return (RTbuf->T_buf[RTbuf->T_front]);
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_putchar
; ** 功能描述: 从接收缓冲区读一个字符
; ** 输 入:
; ** 输出 : 读字符
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; uint8 Rbuf_getchar(siocirqueue *RTbuf){
.dbline 373
; uint8 Btemp=0;
clr R20
.dbline 374
; if (!Rbuf_empty(RTbuf)){
movw R16,R22
xcall _Rbuf_empty
tst R16
brne L53
.dbline 374
.dbline 375
; Btemp=RTbuf->R_buf[RTbuf->R_front];
movw R24,R22
adiw R24,4
movw R30,R22
ldd R30,z+0
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
.dbline 376
; REV_DIS();
.dbline 376
cbi 0xa,7
.dbline 376
.dbline 376
.dbline 377
; RTbuf->R_count--;
movw R24,R22
adiw R24,2
movw R30,R24
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 378
; RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
ldi R17,10
movw R30,R22
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R22
std z+0,R16
.dbline 379
; REV_EN();
sbi 0xa,7
.dbline 380
; }
L53:
.dbline 381
; return (Btemp);
mov R16,R20
.dbline -2
L52:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Btemp 20 c
.dbsym r RTbuf 22 pS[.1]
.dbend
.area vector(rom, abs)
.org 44
jmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile D:\桌面\avr程序设计\串口通讯范例\sio.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
; data -> R22
; status -> R10
; RTbuf -> R20,R21
.even
_uart0_rx_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
xcall push_gset3
.dbline -1
.dbline 413
;
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_getchar
; ** 功能描述: 从发送缓冲区读一个字符
; ** 输 入:
; ** 输出 : 读字符
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; uint8 Tbuf_getchar(void){
; uint8 Btemp;
; if (!Tbuf_empty()){
; Btemp=RTbuf->T_buf[RTbuf->T_front];
; TXC_DIS();
; RTbuf->T_count--;
; RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
; TXC_EN();
; return (Btemp);
; }
; }
; */
;
; /******************************* 中断处理函数 ***************************
; * 功能:完成数据得的接收和发送
; ***********************************************************************/
; #if USEUART0
; #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
; void uart0_rx_isr(void)
; {
.dbline 416
; uint8 status,data;
; siocirqueue *RTbuf;
; RTbuf=&RTbuf_UART0;
ldi R20,<_RTbuf_UART0
ldi R21,>_RTbuf_UART0
.dbline 418
; // CLI();
; status=UCSR0A;
in R10,0xb
.dbline 419
; data=UDR0;
in R22,0xc
.dbline 421
; //WDR(); //喂狗
; if((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
mov R24,R10
andi R24,24
breq X2
xjmp L56
X2:
.dbline 422
; {
.dbline 423
; if(RTbuf->R_count<RBUF_SIZE){
movw R30,R20
ldd R24,z+2
cpi R24,10
brlo X3
xjmp L58
X3:
.dbline 423
.dbline 424
; RTbuf->R_count++;
movw R24,R20
adiw R24,2
movw R30,R24
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 425
; RTbuf->R_buf[RTbuf->R_rear]=data;
movw R24,R20
adiw R24,4
movw R30,R20
ldd R30,z+1
clr R31
add R30,R24
adc R31,R25
std z+0,R22
.dbline 426
; RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
movw R24,R20
adiw R24,1
movw R2,R24
ldi R17,10
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 427
; }
xjmp L59
L58:
.dbline 429
; else
; {
.dbline 430
; RTbuf->R_overflow=1;
ldi R24,1
movw R30,R20
std z+3,R24
.dbline 431
; }
L59:
.dbline 432
L56:
.dbline -2
L55:
xcall pop_gset3
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r data 22 c
.dbsym r status 10 c
.dbsym r RTbuf 20 pS[.1]
.dbend
.area vector(rom, abs)
.org 52
jmp _uart0_tx_isr
.area text(rom, con, rel)
.dbfile D:\桌面\avr程序设计\串口通讯范例\sio.c
.dbfunc e uart0_tx_isr _uart0_tx_isr fV
; RTbuf -> R20,R21
.even
_uart0_tx_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
xcall push_gset1
.dbline -1
.dbline 438
; }
; //SEI();
; }
;
; #pragma interrupt_handler uart0_tx_isr: iv_USART0_TXC
; void uart0_tx_isr(void)
; {
.dbline 442
; //CLI();
; siocirqueue *RTbuf;
; //WDR(); //喂狗
; RTbuf=&RTbuf_UART0;
ldi R20,<_RTbuf_UART0
ldi R21,>_RTbuf_UART0
.dbline 443
; if (RTbuf->T_count>0){
clr R2
movw R30,R20
ldd R3,z+16
cp R2,R3
brlo X4
xjmp L61
X4:
.dbline 443
.dbline 444
; UDR0=RTbuf->T_buf[RTbuf->T_front];
movw R24,R20
adiw R24,17
movw R30,R20
ldd R30,z+14
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 445
; RTbuf->T_count--;
movw R24,R20
adiw R24,16
movw R30,R24
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 446
; RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
movw R24,R20
adiw R24,14
movw R2,R24
ldi R17,10
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 447
; }
xjmp L62
L61:
.dbline 448
ldi R24,1
movw R30,R20
std z+27,R24
L62:
.dbline -2
L60:
xcall pop_gset1
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r RTbuf 20 pS[.1]
.dbend
.area bss(ram, con, rel)
.dbfile D:\桌面\avr程序设计\串口通讯范例\sio.c
_RTbuf_UART0::
.blkb 28
.dbsym e RTbuf_UART0 _RTbuf_UART0 S[.1]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -