📄 24c01.lst
字号:
(0242) /*********************************************************************************************************
(0243) ** 函数名称: Rbuf_empty
(0244) ** 功能描述: 接收缓冲区判空
(0245) ** 输 入:
(0246) ** 输出 : TRUE 空 FALSE 非空
(0247) ** 全局变量: 无
(0248) ** 调用模块:
(0249) ** 说明:
(0250) ** 注意:
(0251) ********************************************************************************************************/
(0252) unsigned char Rbuf_empty(siocirqueue *RTbuf){
(0253) return RTbuf->R_count==0;
02D8 01F8 MOVW R30,R16
02D9 8022 LDD R2,Z+2
02DA 2022 TST R2
02DB F419 BNE 0x02DF
02DC E041 LDI R20,1
02DD E050 LDI R21,0
02DE C002 RJMP 0x02E1
02DF 2744 CLR R20
02E0 2755 CLR R21
02E1 2F04 MOV R16,R20
02E2 940E04B3 CALL pop_gset1
02E4 9508 RET
_Tbuf_full:
RTbuf --> R16
02E5 940E04B0 CALL push_gset1
(0254) }
(0255) /*********************************************************************************************************
(0256) ** 函数名称: Tbuf_empty
(0257) ** 功能描述: 发送缓冲区判空
(0258) ** 输 入:
(0259) ** 输出 : TRUE 空 FALSE 非空
(0260) ** 全局变量: 无
(0261) ** 调用模块:
(0262) ** 说明:
(0263) ** 注意:
(0264) ********************************************************************************************************
(0265) unsigned char Tbuf_empty(void){
(0266) return RTbuf->T_count==0;
(0267) }
(0268) /*********************************************************************************************************
(0269) ** 函数名称: Rbuf_full
(0270) ** 功能描述: 接收缓冲区判满
(0271) ** 输 入:
(0272) ** 输出 : TRUE 满 FALSE 非满
(0273) ** 全局变量: 无
(0274) ** 调用模块:
(0275) ** 说明:
(0276) ** 注意:
(0277) ********************************************************************************************************
(0278) unsigned char Rbuf_full (void){
(0279) return RTbuf->R_count==RBUF_SIZE;
(0280) }
(0281) /*********************************************************************************************************
(0282) ** 函数名称: Tbuf_full
(0283) ** 功能描述: 发送缓冲区判满
(0284) ** 输 入:
(0285) ** 输出 : TRUE 满 FALSE 非满
(0286) ** 全局变量: 无
(0287) ** 调用模块:
(0288) ** 说明:
(0289) ** 注意:
(0290) ********************************************************************************************************/
(0291) unsigned char Tbuf_full(siocirqueue *RTbuf){
(0292) return RTbuf->T_count==TBUF_SIZE;
02E7 01F8 MOVW R30,R16
02E8 59E6 SUBI R30,0x96
02E9 4FFF SBCI R31,0xFF
02EA 8180 LDD R24,Z+0
02EB 3684 CPI R24,0x64
02EC F419 BNE 0x02F0
02ED E041 LDI R20,1
02EE E050 LDI R21,0
02EF C002 RJMP 0x02F2
02F0 2744 CLR R20
02F1 2755 CLR R21
02F2 2F04 MOV R16,R20
02F3 940E04B3 CALL pop_gset1
02F5 9508 RET
_Tbuf_putchar:
RTbuf --> R20
x --> R22
02F6 940E04AE CALL push_gset2
02F8 01A9 MOVW R20,R18
02F9 2F60 MOV R22,R16
(0293) }
(0294) /*********************************************************************************************************
(0295) ** 函数名称: Rbuf_putchar
(0296) ** 功能描述: 把一个字符放入接收缓冲区
(0297) ** 输 入:
(0298) ** 输出 :
(0299) ** 全局变量: 无
(0300) ** 调用模块:
(0301) ** 说明:
(0302) ** 注意:
(0303) ********************************************************************************************************
(0304) void Rbuf_putchar (unsigned char x){
(0305) if(!Rbuf_full()){
(0306) REV_DIS();
(0307) RTbuf->R_count++;
(0308) RTbuf->R_buf[RTbuf->R_rear]=x;
(0309) RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
(0310) REV_EN();
(0311) }
(0312) }
(0313) /*********************************************************************************************************
(0314) ** 函数名称: Tbuf_putchar
(0315) ** 功能描述: 把一个字符放入发送缓冲区
(0316) ** 输 入:
(0317) ** 输出 :
(0318) ** 全局变量: 无
(0319) ** 调用模块:
(0320) ** 说明:
(0321) ** 注意:
(0322) ********************************************************************************************************/
(0323) void Tbuf_putchar(unsigned char x,siocirqueue *RTbuf){
(0324) if(!Tbuf_full(RTbuf)){
02FA 018A MOVW R16,R20
02FB DFE9 RCALL _Tbuf_full
02FC 2300 TST R16
02FD F009 BEQ 0x02FF
02FE C02D RJMP 0x032C
(0325) TXC_DIS();
02FF 9856 CBI 0x0A,6
(0326) if (RTbuf->T_disabled)
0300 01FA MOVW R30,R20
0301 53E1 SUBI R30,0x31
0302 4FFF SBCI R31,0xFF
0303 8020 LDD R2,Z+0
0304 2022 TST R2
0305 F039 BEQ 0x030D
(0327) {
(0328) UDR0=x;
0306 B96C OUT 0x0C,R22
(0329) RTbuf->T_disabled=0;
0307 2422 CLR R2
0308 01FA MOVW R30,R20
0309 53E1 SUBI R30,0x31
030A 4FFF SBCI R31,0xFF
030B 8220 STD Z+0,R2
(0330) }
030C C01E RJMP 0x032B
(0331) else
(0332) {
(0333) RTbuf->T_count++;
030D 01CA MOVW R24,R20
030E 5986 SUBI R24,0x96
030F 4F9F SBCI R25,0xFF
0310 01FC MOVW R30,R24
0311 8180 LDD R24,Z+0
0312 5F8F SUBI R24,0xFF
0313 8380 STD Z+0,R24
(0334) RTbuf->T_buf[RTbuf->T_rear]=x;
0314 01CA MOVW R24,R20
0315 5985 SUBI R24,0x95
0316 4F9F SBCI R25,0xFF
0317 01FA MOVW R30,R20
0318 59E7 SUBI R30,0x97
0319 4FFF SBCI R31,0xFF
031A 81E0 LDD R30,Z+0
031B 27FF CLR R31
031C 0FE8 ADD R30,R24
031D 1FF9 ADC R31,R25
031E 8360 STD Z+0,R22
(0335) RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
031F 01CA MOVW R24,R20
0320 5987 SUBI R24,0x97
0321 4F9F SBCI R25,0xFF
0322 011C MOVW R2,R24
0323 E614 LDI R17,0x64
0324 01FC MOVW R30,R24
0325 8100 LDD R16,Z+0
0326 5F0F SUBI R16,0xFF
0327 940E0454 CALL mod8u
0329 01F1 MOVW R30,R2
032A 8300 STD Z+0,R16
(0336) }
(0337) TXC_EN();
032B 9A56 SBI 0x0A,6
(0338) }
032C 940E049C CALL pop_gset2
032E 9508 RET
_Rbuf_getchar:
Btemp --> R20
RTbuf --> R22
032F 940E04AE CALL push_gset2
0331 01B8 MOVW R22,R16
(0339) }
(0340) /*********************************************************************************************************
(0341) ** 函数名称: Rbuf_getstring
(0342) ** 功能描述: 从接收缓冲区返回当前子串指针
(0343) ** 输 入:
(0344) ** 输出 : 当前子串指针
(0345) ** 全局变量: 无
(0346) ** 调用模块:
(0347) ** 说明:
(0348) ** 注意:
(0349) ********************************************************************************************************
(0350) unsigned char * Rbuf_getstring(void){
(0351) return (RTbuf->R_buf[RTbuf->R_front]);
(0352) }
(0353) /*********************************************************************************************************
(0354) ** 函数名称: Tbuf_getstring
(0355) ** 功能描述: 从发送缓冲区返回当前子串指针
(0356) ** 输 入:
(0357) ** 输出 : 当前子串指针
(0358) ** 全局变量: 无
(0359) ** 调用模块:
(0360) ** 说明:
(0361) ** 注意:
(0362) ********************************************************************************************************
(0363) unsigned char * Tbuf_getstring(void){
(0364) return (RTbuf->T_buf[RTbuf->T_front]);
(0365) }
(0366) /*********************************************************************************************************
(0367) ** 函数名称: Rbuf_putchar
(0368) ** 功能描述: 从接收缓冲区读一个字符
(0369) ** 输 入:
(0370) ** 输出 : 读字符
(0371) ** 全局变量: 无
(0372) ** 调用模块:
(0373) ** 说明:
(0374) ** 注意:
(0375) ********************************************************************************************************/
(0376) unsigned char Rbuf_getchar(siocirqueue *RTbuf){
(0377) unsigned char Btemp=0;
0332 2744 CLR R20
(0378) if (!Rbuf_empty(RTbuf)){
0333 018B MOVW R16,R22
0334 DFA1 RCALL _Rbuf_empty
0335 2300 TST R16
0336 F4C1 BNE 0x034F
(0379) Btemp=RTbuf->R_buf[RTbuf->R_front];
0337 01CB MOVW R24,R22
0338 9604 ADIW R24,4
0339 01FB MOVW R30,R22
033A 81E0 LDD R30,Z+0
033B 27FF CLR R31
033C 0FE8 ADD R30,R24
033D 1FF9 ADC R31,R25
033E 8140 LDD R20,Z+0
(0380) REV_DIS();
033F 9857 CBI 0x0A,7
(0381) RTbuf->R_count--;
0340 01CB MOVW R24,R22
0341 9602 ADIW R24,2
0342 01FC MOVW R30,R24
0343 8180 LDD R24,Z+0
0344 5081 SUBI R24,1
0345 8380 STD Z+0,R24
(0382) RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
0346 E614 LDI R17,0x64
0347 01FB MOVW R30,R22
0348 8100 LDD R16,Z+0
0349 5F0F SUBI R16,0xFF
034A 940E0454 CALL mod8u
034C 01FB MOVW R30,R22
034D 8300 STD Z+0,R16
(0383) REV_EN();
034E 9A57 SBI 0x0A,7
(0384) }
(0385) return (Btemp);
034F 2F04 MOV R16,R20
0350 940E049C CALL pop_gset2
0352 9508 RET
_uart0_rx_isr:
data --> R22
status --> R10
RTbuf --> R20
0353 922A ST R2,-Y
0354 923A ST R3,-Y
0355 930A ST R16,-Y
0356 931A ST R17,-Y
0357 938A ST R24,-Y
0358 939A ST R25,-Y
0359 93EA ST R30,-Y
035A 93FA ST R31,-Y
035B B62F IN R2,0x3F
035C 922A ST R2,-Y
035D 940E04AC CALL push_gset3
(0386)
(0387) }
(0388) /*********************************************************************************************************
(0389) ** 函数名称: Tbuf_getchar
(0390) ** 功能描述: 从发送缓冲区读一个字符
(0391) ** 输 入:
(0392) ** 输出 : 读字符
(0393) ** 全局变量: 无
(0394) ** 调用模块:
(0395) ** 说明:
(0396) ** 注意:
(0397) ********************************************************************************************************
(0398) unsigned char Tbuf_getchar(void){
(0399) unsigned char Btemp;
(0400) if (!Tbuf_empty()){
(0401) Btemp=RTbuf->T_buf[RTbuf->T_front];
(0402) TXC_DIS();
(0403) RTbuf->T_count--;
(0404) RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
(0405) TXC_EN();
(0406) return (Btemp);
(0407) }
(0408) }
(0409) */
(0410)
(0411) /******************************* 中断处理函数 ***************************
(0412) * 功能:完成数据得的接收和发送
(0413) ***********************************************************************/
(0414) #if USEUART0
(0415) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0416) void uart0_rx_isr(void)
(0417) {
(0418) unsigned char status,data;
(0419) siocirqueue *RTbuf;
(0420) RTbuf=&RTbuf_UART0;
035F E34E LDI R20,0x3E
0360 E051 LDI R21,1
(0421) // CLI();
(0422) status=UCSR0A;
0361 B0AB IN R10,0x0B
(0423) data=UDR0;
0362 B16C IN R22,0x0C
(0424) //WDR(); //喂狗
(0425) if((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
0363 2D8A MOV R24,R10
0364 7188 ANDI R24,0x18
0365 F009 BEQ 0x0367
0366 C022 RJMP 0x0389
(0426) {
(0427) if(RTbuf->R_count<RBUF_SIZE){
0367 01FA MOVW R30,R20
0368 8182 LDD R24,Z+2
0369 3684 CPI R24,0x64
036A F008 BCS 0x036C
036B C01A RJMP 0x0386
(0428) RTbuf->R_count++;
036C 01CA MOVW R24,R20
036D 9602 ADIW R24,2
036E 01FC MOVW R30,R24
036F 8180 LDD R24,Z+0
0370 5F8F SUBI R24,0xFF
0371 8380 STD Z+0,R24
(0429) RTbuf->R_buf[RTbuf->R_rear]=data;
0372 01CA MOVW R24,R20
0373 9604 ADIW R24,4
0374 01FA MOVW R30,R20
0375 81E1 LDD R30,Z+1
0376 27FF CLR R31
0377 0FE8 ADD R30,R24
0378 1FF9 ADC R31,R25
0379 8360 STD Z+0,R22
(0430) RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
037A 01CA MOVW R24,R20
037B 9601 ADIW R24,1
037C 011C MOVW R2,R24
037D E614 LDI R17,0x64
037E 01FC MOVW R30,R24
037F 8100 LDD R16,Z+0
0380 5F0F SUBI R16,0xFF
0381 940E0454 CALL mod8u
0383 01F1 MOVW R30,R2
0384 8300 STD Z+0,R16
(0431) }
0385 C003 RJMP 0x0389
(0432) else
(0433) {
(0434) RTbuf->R_overflow=1;
0386 E081 LDI R24,1
0387 01FA MOVW R30,R20
0388 8383 STD Z+3,R24
(0435) }
(0436) }
0389 940E049F CALL pop_gset3
038B 9029 LD R2,Y+
038C BE2F OUT 0x3F,R2
038D 91F9 LD R31,Y+
038E 91E9 LD R30,Y+
038F 9199 LD R25,Y+
0390 9189 LD R24,Y+
0391 9119 LD R17,Y+
0392 9109 LD R16,Y+
0393 9039 LD R3,Y+
0394 9029 LD R2,Y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -