📄 main.lst
字号:
011B 24CC CLR R12
011C C00A RJMP 0x0127
(0126) while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
011D 019B MOVW R18,R22
011E 2DEC MOV R30,R12
011F 27FF CLR R31
0120 0FE4 ADD R30,R20
0121 1FF5 ADC R31,R21
0122 8100 LDD R16,Z+0
0123 DFDE RCALL _Com_putchar
0124 2300 TST R16
0125 F3B9 BEQ 0x011D
0126 94C3 INC R12
0127 14CA CP R12,R10
0128 F3A0 BCS 0x011D
(0127) }
0129 C00B RJMP 0x0135
(0128) else {
(0129) do{
(0130) while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
012A 019B MOVW R18,R22
012B 01FA MOVW R30,R20
012C 8100 LDD R16,Z+0
012D DFD4 RCALL _Com_putchar
012E 2300 TST R16
012F F3D1 BEQ 0x012A
(0131) }while(*p++!='\n');
0130 01FA MOVW R30,R20
0131 9181 LD R24,Z+
0132 01AF MOVW R20,R30
0133 308A CPI R24,0xA
0134 F7A9 BNE 0x012A
(0132) }
0135 940E030D CALL pop_gset4
0137 9508 RET
_Com_getchar:
RTbuf --> R20
mode --> R22
0138 940E0316 CALL push_gset2
013A 01A9 MOVW R20,R18
013B 2F60 MOV R22,R16
(0133)
(0134) }
(0135) /*********************************************************************************************************
(0136) ** 函数名称: Com_getchar
(0137) ** 功能描述: 从串行口输入一个字符
(0138) ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
(0139) ** 1 等待数据到来
(0140) ** 输出 : 读入的字符
(0141) ** 全局变量: 无
(0142) ** 调用模块:
(0143) ** 说明:
(0144) ** 注意:
(0145) ********************************************************************************************************/
(0146)
(0147) uint8 Com_getchar (uint8 mode,siocirqueue *RTbuf) {
(0148) //WDR(); //喂狗
(0149) // Delay(Delay_Comget,MaxLimit_Comget_Delay);
(0150) // if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
(0151) // if (DelayOvf(Delay_Comget))
(0152) // return 0; //时间超时
(0153) // else
(0154)
(0155) while(!Com_R_count(RTbuf));
013C 018A MOVW R16,R20
013D D035 RCALL _Com_R_count
013E 2300 TST R16
013F F3E1 BEQ 0x013C
(0156) return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
0140 018A MOVW R16,R20
0141 D096 RCALL _Rbuf_getchar
0142 940E0307 CALL pop_gset2
0144 9508 RET
_Com_Rbuf_Clear:
RTbuf --> R20
0145 940E0318 CALL push_gset1
0147 01A8 MOVW R20,R16
(0157) }
(0158)
(0159)
(0160)
(0161) void Com_Rbuf_Clear(siocirqueue *RTbuf){
(0162) Rbuf_init(RTbuf);
0148 018A MOVW R16,R20
0149 D02C RCALL _Rbuf_init
014A 940E031B CALL pop_gset1
014C 9508 RET
_Com_getstring:
i --> R20
RTbuf --> R22
len --> R12
p --> R10
014D 940E0312 CALL push_gset4
014F 2EC2 MOV R12,R18
0150 0158 MOVW R10,R16
0151 8568 LDD R22,Y+8
0152 8579 LDD R23,Y+9
(0163) }
(0164)
(0165)
(0166)
(0167) uint8 Com_getstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {
(0168) uint8 i=0;
0153 2744 CLR R20
(0169) //WDR(); //喂狗
(0170) if (len>0 ){
0154 2422 CLR R2
0155 142C CP R2,R12
0156 F460 BCC 0x0163
(0171) for(i=0;i<len;i++){
0157 C007 RJMP 0x015F
(0172) //WDR(); //喂狗
(0173) *p++=Com_getchar(1,RTbuf);
0158 019B MOVW R18,R22
0159 E001 LDI R16,1
015A DFDD RCALL _Com_getchar
015B 01F5 MOVW R30,R10
015C 9301 ST R16,Z+
015D 015F MOVW R10,R30
015E 9543 INC R20
015F 154C CP R20,R12
0160 F3B8 BCS 0x0158
(0174) }
(0175) return(len);
0161 2D0C MOV R16,R12
0162 C00D RJMP 0x0170
(0176) }
(0177) else{
(0178)
(0179)
(0180) do{
(0181) *p++=Com_getchar(1,RTbuf);
0163 019B MOVW R18,R22
0164 E001 LDI R16,1
0165 DFD2 RCALL _Com_getchar
0166 01F5 MOVW R30,R10
0167 9301 ST R16,Z+
0168 015F MOVW R10,R30
(0182) i++;
0169 9543 INC R20
(0183) //WDR(); //喂狗
(0184) }while(*(p-1)!='\n');
016A 01F5 MOVW R30,R10
016B 9731 SBIW R30,1
016C 8180 LDD R24,Z+0
016D 308A CPI R24,0xA
016E F7A1 BNE 0x0163
(0185) // *p++=Com_getchar(1,RTbuf);
(0186) // *(p)=0;
(0187) return(i);
016F 2F04 MOV R16,R20
0170 940E030D CALL pop_gset4
0172 9508 RET
(0188) }
(0189)
(0190) }
(0191)
(0192)
(0193) /*********************************************************************************************************
(0194) ** 函数名称: Com_R_count
(0195) ** 功能描述: 返回接收缓冲区字符个数函数
(0196) ** 输 入:
(0197) ** 输出 : 字符个数
(0198) ** 全局变量: 无
(0199) ** 调用模块:
(0200) ** 说明:
(0201) ** 注意:
(0202) ********************************************************************************************************/
(0203) uint8 Com_R_count(siocirqueue *RTbuf){
(0204) return RTbuf->R_count;
_Com_R_count:
RTbuf --> R16
0173 01F8 MOVW R30,R16
0174 8102 LDD R16,Z+2
0175 9508 RET
(0205) }
(0206) /*********************************************************************************************************
(0207) ** 函数名称: Rbuf_init
(0208) ** 功能描述: 接收缓冲区初始化
(0209) ** 输 入:
(0210) ** 输出 :
(0211) ** 全局变量: 无
(0212) ** 调用模块:
(0213) ** 说明:
(0214) ** 注意:
(0215) ********************************************************************************************************/
(0216) void Rbuf_init(siocirqueue *RTbuf){
(0217) RTbuf->R_front=0;
_Rbuf_init:
RTbuf --> R16
0176 2422 CLR R2
0177 01F8 MOVW R30,R16
0178 8220 STD Z+0,R2
(0218) RTbuf->R_rear=0;
0179 8221 STD Z+1,R2
(0219) RTbuf->R_count=0;
017A 01F8 MOVW R30,R16
017B 8222 STD Z+2,R2
(0220) RTbuf->R_overflow=0;
017C 01F8 MOVW R30,R16
017D 8223 STD Z+3,R2
017E 9508 RET
(0221) }
(0222) /*********************************************************************************************************
(0223) ** 函数名称: Tbuf_init
(0224) ** 功能描述: 发送缓冲区初始化
(0225) ** 输 入:
(0226) ** 输出 :
(0227) ** 全局变量: 无
(0228) ** 调用模块:
(0229) ** 说明:
(0230) ** 注意:
(0231) ********************************************************************************************************/
(0232) void Tbuf_init(siocirqueue *RTbuf){
(0233) RTbuf->T_front=0;
_Tbuf_init:
RTbuf --> R16
017F 2422 CLR R2
0180 01F8 MOVW R30,R16
0181 8626 STD Z+14,R2
(0234) RTbuf->T_rear=0;
0182 01F8 MOVW R30,R16
0183 8627 STD Z+15,R2
(0235) RTbuf->T_count=0;
0184 01F8 MOVW R30,R16
0185 8A20 STD Z+16,R2
(0236) RTbuf->T_disabled=1;
0186 E081 LDI R24,1
0187 01F8 MOVW R30,R16
0188 8F83 STD Z+27,R24
0189 9508 RET
_Rbuf_empty:
RTbuf --> R16
018A 940E0318 CALL push_gset1
(0237) }
(0238) /*********************************************************************************************************
(0239) ** 函数名称: Rbuf_empty
(0240) ** 功能描述: 接收缓冲区判空
(0241) ** 输 入:
(0242) ** 输出 : TRUE 空 FALSE 非空
(0243) ** 全局变量: 无
(0244) ** 调用模块:
(0245) ** 说明:
(0246) ** 注意:
(0247) ********************************************************************************************************/
(0248) uint8 Rbuf_empty(siocirqueue *RTbuf){
(0249) return RTbuf->R_count==0;
018C 01F8 MOVW R30,R16
018D 8022 LDD R2,Z+2
018E 2022 TST R2
018F F419 BNE 0x0193
0190 E041 LDI R20,1
0191 E050 LDI R21,0
0192 C002 RJMP 0x0195
0193 2744 CLR R20
0194 2755 CLR R21
0195 2F04 MOV R16,R20
0196 940E031B CALL pop_gset1
0198 9508 RET
_Tbuf_full:
RTbuf --> R16
0199 940E0318 CALL push_gset1
(0250) }
(0251) /*********************************************************************************************************
(0252) ** 函数名称: Tbuf_empty
(0253) ** 功能描述: 发送缓冲区判空
(0254) ** 输 入:
(0255) ** 输出 : TRUE 空 FALSE 非空
(0256) ** 全局变量: 无
(0257) ** 调用模块:
(0258) ** 说明:
(0259) ** 注意:
(0260) ********************************************************************************************************
(0261) uint8 Tbuf_empty(void){
(0262) return RTbuf->T_count==0;
(0263) }
(0264) /*********************************************************************************************************
(0265) ** 函数名称: Rbuf_full
(0266) ** 功能描述: 接收缓冲区判满
(0267) ** 输 入:
(0268) ** 输出 : TRUE 满 FALSE 非满
(0269) ** 全局变量: 无
(0270) ** 调用模块:
(0271) ** 说明:
(0272) ** 注意:
(0273) ********************************************************************************************************
(0274) uint8 Rbuf_full (void){
(0275) return RTbuf->R_count==RBUF_SIZE;
(0276) }
(0277) /*********************************************************************************************************
(0278) ** 函数名称: Tbuf_full
(0279) ** 功能描述: 发送缓冲区判满
(0280) ** 输 入:
(0281) ** 输出 : TRUE 满 FALSE 非满
(0282) ** 全局变量: 无
(0283) ** 调用模块:
(0284) ** 说明:
(0285) ** 注意:
(0286) ********************************************************************************************************/
(0287) uint8 Tbuf_full(siocirqueue *RTbuf){
(0288) return RTbuf->T_count==TBUF_SIZE;
019B 01F8 MOVW R30,R16
019C 8980 LDD R24,Z+16
019D 308A CPI R24,0xA
019E F419 BNE 0x01A2
019F E041 LDI R20,1
01A0 E050 LDI R21,0
01A1 C002 RJMP 0x01A4
01A2 2744 CLR R20
01A3 2755 CLR R21
01A4 2F04 MOV R16,R20
01A5 940E031B CALL pop_gset1
01A7 9508 RET
_Tbuf_putchar:
RTbuf --> R20
x --> R22
01A8 940E0316 CALL push_gset2
01AA 01A9 MOVW R20,R18
01AB 2F60 MOV R22,R16
(0289) }
(0290) /*********************************************************************************************************
(0291) ** 函数名称: Rbuf_putchar
(0292) ** 功能描述: 把一个字符放入接收缓冲区
(0293) ** 输 入:
(0294) ** 输出 :
(0295) ** 全局变量: 无
(0296) ** 调用模块:
(0297) ** 说明:
(0298) ** 注意:
(0299) ********************************************************************************************************
(0300) void Rbuf_putchar (uint8 x){
(0301) if(!Rbuf_full()){
(0302) REV_DIS();
(0303) RTbuf->R_count++;
(0304) RTbuf->R_buf[RTbuf->R_rear]=x;
(0305) RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
(0306) REV_EN();
(0307) }
(0308) }
(0309) /*********************************************************************************************************
(0310) ** 函数名称: Tbuf_putchar
(0311) ** 功能描述: 把一个字符放入发送缓冲区
(0312) ** 输 入:
(0313) ** 输出 :
(0314) ** 全局变量: 无
(0315) ** 调用模块:
(0316) ** 说明:
(0317) ** 注意:
(0318) ********************************************************************************************************/
(0319) void Tbuf_putchar(uint8 x,siocirqueue *RTbuf){
(0320) if(!Tbuf_full(RTbuf)){
01AC 018A MOVW R16,R20
01AD DFEB RCALL _Tbuf_full
01AE 2300 TST R16
01AF F009 BEQ 0x01B1
01B0 C024 RJMP 0x01D5
(0321) TXC_DIS();
01B1 9856 CBI 0x0A,6
(0322) if (RTbuf->T_disabled)
01B2 01FA MOVW R30,R20
01B3 8C23 LDD R2,Z+27
01B4 2022 TST R2
01B5 F029 BEQ 0x01BB
(0323) {
(0324) UDR0=x;
01B6 B96C OUT 0x0C,R22
(0325) RTbuf->T_disabled=0;
01B7 2422 CLR R2
01B8 01FA MOVW R30,R20
01B9 8E23 STD Z+27,R2
(0326) }
01BA C019 RJMP 0x01D4
(0327) else
(0328) {
(0329) RTbuf->T_count++;
01BB 01CA MOVW R24,R20
01BC 9640 ADIW R24,0x10
01BD 01FC MOVW R30,R24
01BE 8180 LDD R24,Z+0
01BF 5F8F SUBI R24,0xFF
01C0 8380 STD Z+0,R24
(0330) RTbuf->T_buf[RTbuf->T_rear]=x;
01C1 01CA MOVW R24,R20
01C2 9641 ADIW R24,0x11
01C3 01FA MOVW R30,R20
01C4 85E7 LDD R30,Z+15
01C5 27FF CLR R31
01C6 0FE8 ADD R30,R24
01C7 1FF9 ADC R31,R25
01C8 8360 STD Z+0,R22
(0331) RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
01C9 01CA MOVW R24,R20
01CA 960F ADIW R24,0xF
01CB 011C MOVW R2,R24
01CC E01A LDI R17,0xA
01CD 01FC MOVW R30,R24
01CE 8100 LDD R16,Z+0
01CF 5F0F SUBI R16,0xFF
01D0 940E02EF CALL mod8u
01D2 01F1 MOVW R30,R2
01D3 8300 STD Z+0,R16
(0332) }
(0333) TXC_EN();
01D4 9A56 SBI 0x0A,6
(0334) }
01D5 940E0307 CALL pop_gset2
01D7 9508 RET
_Rbuf_getchar:
Btemp --> R20
RTbuf --> R22
01D8 940E0316 CALL push_gset2
01DA 01B8 MOVW R22,R16
(0335) }
(0336) /*********************************************************************************************************
(0337) ** 函数名称: Rbuf_getstring
(0338) ** 功能描述: 从接收缓冲区返回当前子串指针
(0339) ** 输 入:
(0340) ** 输出 : 当前子串指针
(0341) ** 全局变量: 无
(0342) ** 调用模块:
(0343) ** 说明:
(0344) ** 注意:
(0345) ********************************************************************************************************
(0346) uint8 * Rbuf_getstring(void){
(0347) return (RTbuf->R_buf[RTbuf->R_front]);
(0348) }
(0349) /*********************************************************************************************************
(0350) ** 函数名称: Tbuf_getstring
(0351) ** 功能描述: 从发送缓冲区返回当前子串指针
(0352) ** 输 入:
(0353) ** 输出 : 当前子串指针
(0354) ** 全局变量: 无
(0355) ** 调用模块:
(0356) ** 说明:
(0357) ** 注意:
(0358) ********************************************************************************************************
(0359) uint8 * Tbuf_getstring(void){
(0360) return (RTbuf->T_buf[RTbuf->T_front]);
(0361) }
(0362) /*********************************************************************************************************
(0363) ** 函数名称: Rbuf_putchar
(0364) ** 功能描述: 从接收缓冲区读一个字符
(0365) ** 输 入:
(0366) ** 输出 : 读字符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -