⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 bootloader
💻 LST
📖 第 1 页 / 共 3 页
字号:
    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 + -