main.lst
来自「ATMEGA128的PCF8536驱动程序」· LST 代码 · 共 1,956 行 · 第 1/5 页
LST
1,956 行
(0199) ** 功能描述: 返回接收缓冲区字符个数函数
(0200) ** 输 入:
(0201) ** 输出 : 字符个数
(0202) ** 全局变量: 无
(0203) ** 调用模块:
(0204) ** 说明:
(0205) ** 注意:
(0206) ********************************************************************************************************/
(0207) unsigned char Com_R_count(siocirqueue *RTbuf){
(0208) return RTbuf->R_count;
_Com_R_count:
RTbuf --> R16
0320 01F8 MOVW R30,R16
0321 8102 LDD R16,Z+2
0322 9508 RET
(0209) }
(0210) /*********************************************************************************************************
(0211) ** 函数名称: Rbuf_init
(0212) ** 功能描述: 接收缓冲区初始化
(0213) ** 输 入:
(0214) ** 输出 :
(0215) ** 全局变量: 无
(0216) ** 调用模块:
(0217) ** 说明:
(0218) ** 注意:
(0219) ********************************************************************************************************/
(0220) void Rbuf_init(siocirqueue *RTbuf){
(0221) RTbuf->R_front=0;
_Rbuf_init:
RTbuf --> R16
0323 2422 CLR R2
0324 01F8 MOVW R30,R16
0325 8220 STD Z+0,R2
(0222) RTbuf->R_rear=0;
0326 8221 STD Z+1,R2
(0223) RTbuf->R_count=0;
0327 01F8 MOVW R30,R16
0328 8222 STD Z+2,R2
(0224) RTbuf->R_overflow=0;
0329 01F8 MOVW R30,R16
032A 8223 STD Z+3,R2
032B 9508 RET
(0225) }
(0226) /*********************************************************************************************************
(0227) ** 函数名称: Tbuf_init
(0228) ** 功能描述: 发送缓冲区初始化
(0229) ** 输 入:
(0230) ** 输出 :
(0231) ** 全局变量: 无
(0232) ** 调用模块:
(0233) ** 说明:
(0234) ** 注意:
(0235) ********************************************************************************************************/
(0236) void Tbuf_init(siocirqueue *RTbuf){
(0237) RTbuf->T_front=0;
_Tbuf_init:
RTbuf --> R16
032C 2422 CLR R2
032D 01F8 MOVW R30,R16
032E 59E8 SUBI R30,0x98
032F 4FFF SBCI R31,0xFF
0330 8220 STD Z+0,R2
(0238) RTbuf->T_rear=0;
0331 01F8 MOVW R30,R16
0332 59E7 SUBI R30,0x97
0333 4FFF SBCI R31,0xFF
0334 8220 STD Z+0,R2
(0239) RTbuf->T_count=0;
0335 01F8 MOVW R30,R16
0336 59E6 SUBI R30,0x96
0337 4FFF SBCI R31,0xFF
0338 8220 STD Z+0,R2
(0240) RTbuf->T_disabled=1;
0339 E081 LDI R24,1
033A 01F8 MOVW R30,R16
033B 53E1 SUBI R30,0x31
033C 4FFF SBCI R31,0xFF
033D 8380 STD Z+0,R24
033E 9508 RET
_Rbuf_empty:
RTbuf --> R16
033F 940E04E1 CALL push_gset1
(0241) }
(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;
0341 01F8 MOVW R30,R16
0342 8022 LDD R2,Z+2
0343 2022 TST R2
0344 F419 BNE 0x0348
0345 E041 LDI R20,1
0346 E050 LDI R21,0
0347 C002 RJMP 0x034A
0348 2744 CLR R20
0349 2755 CLR R21
034A 2F04 MOV R16,R20
034B 940E04E4 CALL pop_gset1
034D 9508 RET
_Tbuf_full:
RTbuf --> R16
034E 940E04E1 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;
0350 01F8 MOVW R30,R16
0351 59E6 SUBI R30,0x96
0352 4FFF SBCI R31,0xFF
0353 8180 LDD R24,Z+0
0354 3684 CPI R24,0x64
0355 F419 BNE 0x0359
0356 E041 LDI R20,1
0357 E050 LDI R21,0
0358 C002 RJMP 0x035B
0359 2744 CLR R20
035A 2755 CLR R21
035B 2F04 MOV R16,R20
035C 940E04E4 CALL pop_gset1
035E 9508 RET
_Tbuf_putchar:
RTbuf --> R20
x --> R22
035F 940E04DF CALL push_gset2
0361 01A9 MOVW R20,R18
0362 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)){
0363 018A MOVW R16,R20
0364 DFE9 RCALL _Tbuf_full
0365 2300 TST R16
0366 F009 BEQ 0x0368
0367 C02D RJMP 0x0395
(0325) TXC_DIS();
0368 9856 CBI 0x0A,6
(0326) if (RTbuf->T_disabled)
0369 01FA MOVW R30,R20
036A 53E1 SUBI R30,0x31
036B 4FFF SBCI R31,0xFF
036C 8020 LDD R2,Z+0
036D 2022 TST R2
036E F039 BEQ 0x0376
(0327) {
(0328) UDR0=x;
036F B96C OUT 0x0C,R22
(0329) RTbuf->T_disabled=0;
0370 2422 CLR R2
0371 01FA MOVW R30,R20
0372 53E1 SUBI R30,0x31
0373 4FFF SBCI R31,0xFF
0374 8220 STD Z+0,R2
(0330) }
0375 C01E RJMP 0x0394
(0331) else
(0332) {
(0333) RTbuf->T_count++;
0376 01CA MOVW R24,R20
0377 5986 SUBI R24,0x96
0378 4F9F SBCI R25,0xFF
0379 01FC MOVW R30,R24
037A 8180 LDD R24,Z+0
037B 5F8F SUBI R24,0xFF
037C 8380 STD Z+0,R24
(0334) RTbuf->T_buf[RTbuf->T_rear]=x;
037D 01CA MOVW R24,R20
037E 5985 SUBI R24,0x95
037F 4F9F SBCI R25,0xFF
0380 01FA MOVW R30,R20
0381 59E7 SUBI R30,0x97
0382 4FFF SBCI R31,0xFF
0383 81E0 LDD R30,Z+0
0384 27FF CLR R31
0385 0FE8 ADD R30,R24
0386 1FF9 ADC R31,R25
0387 8360 STD Z+0,R22
(0335) RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
0388 01CA MOVW R24,R20
0389 5987 SUBI R24,0x97
038A 4F9F SBCI R25,0xFF
038B 011C MOVW R2,R24
038C E614 LDI R17,0x64
038D 01FC MOVW R30,R24
038E 8100 LDD R16,Z+0
038F 5F0F SUBI R16,0xFF
0390 940E04B8 CALL mod8u
0392 01F1 MOVW R30,R2
0393 8300 STD Z+0,R16
(0336) }
(0337) TXC_EN();
0394 9A56 SBI 0x0A,6
(0338) }
0395 940E04D0 CALL pop_gset2
0397 9508 RET
_Rbuf_getchar:
Btemp --> R20
RTbuf --> R22
0398 940E04DF CALL push_gset2
039A 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;
039B 2744 CLR R20
(0378) if (!Rbuf_empty(RTbuf)){
039C 018B MOVW R16,R22
039D DFA1 RCALL _Rbuf_empty
039E 2300 TST R16
039F F4C1 BNE 0x03B8
(0379) Btemp=RTbuf->R_buf[RTbuf->R_front];
03A0 01CB MOVW R24,R22
03A1 9604 ADIW R24,4
03A2 01FB MOVW R30,R22
03A3 81E0 LDD R30,Z+0
03A4 27FF CLR R31
03A5 0FE8 ADD R30,R24
03A6 1FF9 ADC R31,R25
03A7 8140 LDD R20,Z+0
(0380) REV_DIS();
03A8 9857 CBI 0x0A,7
(0381) RTbuf->R_count--;
03A9 01CB MOVW R24,R22
03AA 9602 ADIW R24,2
03AB 01FC MOVW R30,R24
03AC 8180 LDD R24,Z+0
03AD 5081 SUBI R24,1
03AE 8380 STD Z+0,R24
(0382) RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
03AF E614 LDI R17,0x64
03B0 01FB MOVW R30,R22
03B1 8100 LDD R16,Z+0
03B2 5F0F SUBI R16,0xFF
03B3 940E04B8 CALL mod8u
03B5 01FB MOVW R30,R22
03B6 8300 STD Z+0,R16
(0383) REV_EN();
03B7 9A57 SBI 0x0A,7
(0384) }
(0385) return (Btemp);
03B8 2F04 MOV R16,R20
03B9 940E04D0 CALL pop_gset2
03BB 9508 RET
_uart0_rx_isr:
data --> R22
status --> R10
RTbuf --> R20
03BC 922A ST R2,-Y
03BD 923A ST R3,-Y
03BE 930A ST R16,-Y
03BF 931A ST R17,-Y
03C0 938A ST R24,-Y
03C1 939A ST R25,-Y
03C2 93EA ST R30,-Y
03C3 93FA ST R31,-Y
03C4 B62F IN R2,0x3F
03C5 922A ST R2,-Y
03C6 940E04DD 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) ***********************************************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?