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

📄 main.lst

📁 ATMEGA128的串口驱动程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0180) 	}
(0181) 	else{
(0182) 		
(0183) 		
(0184) 		do{
(0185) 				*p++=Com_getchar(1,RTbuf);
    0126 019B      MOVW	R18,R22
    0127 E001      LDI	R16,1
    0128 DFD2      RCALL	_Com_getchar
    0129 01F5      MOVW	R30,R10
    012A 9301      ST	R16,Z+
    012B 015F      MOVW	R10,R30
(0186) 				i++;
    012C 9543      INC	R20
(0187) 				//WDR(); //喂狗
(0188) 			}while(*(p-1)!='\n');
    012D 01F5      MOVW	R30,R10
    012E 9731      SBIW	R30,1
    012F 8180      LDD	R24,Z+0
    0130 308A      CPI	R24,0xA
    0131 F7A1      BNE	0x0126
(0189) //			*p++=Com_getchar(1,RTbuf);
(0190) //			*(p)=0;
(0191) 		return(i);
    0132 2F04      MOV	R16,R20
    0133 940E0316  CALL	pop_gset4
    0135 9508      RET
(0192) 		}
(0193) 	
(0194) }
(0195) 
(0196) 
(0197) /*********************************************************************************************************
(0198) ** 函数名称: Com_R_count
(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
    0136 01F8      MOVW	R30,R16
    0137 8102      LDD	R16,Z+2
    0138 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
    0139 2422      CLR	R2
    013A 01F8      MOVW	R30,R16
    013B 8220      STD	Z+0,R2
(0222) 	RTbuf->R_rear=0;
    013C 8221      STD	Z+1,R2
(0223)     RTbuf->R_count=0;
    013D 01F8      MOVW	R30,R16
    013E 8222      STD	Z+2,R2
(0224) 	RTbuf->R_overflow=0;
    013F 01F8      MOVW	R30,R16
    0140 8223      STD	Z+3,R2
    0141 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
    0142 2422      CLR	R2
    0143 01F8      MOVW	R30,R16
    0144 59E8      SUBI	R30,0x98
    0145 4FFF      SBCI	R31,0xFF
    0146 8220      STD	Z+0,R2
(0238) 	RTbuf->T_rear=0;
    0147 01F8      MOVW	R30,R16
    0148 59E7      SUBI	R30,0x97
    0149 4FFF      SBCI	R31,0xFF
    014A 8220      STD	Z+0,R2
(0239)     RTbuf->T_count=0;
    014B 01F8      MOVW	R30,R16
    014C 59E6      SUBI	R30,0x96
    014D 4FFF      SBCI	R31,0xFF
    014E 8220      STD	Z+0,R2
(0240) 	RTbuf->T_disabled=1;
    014F E081      LDI	R24,1
    0150 01F8      MOVW	R30,R16
    0151 53E1      SUBI	R30,0x31
    0152 4FFF      SBCI	R31,0xFF
    0153 8380      STD	Z+0,R24
    0154 9508      RET
_Rbuf_empty:
  RTbuf                --> R16
    0155 940E0321  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;
    0157 01F8      MOVW	R30,R16
    0158 8022      LDD	R2,Z+2
    0159 2022      TST	R2
    015A F419      BNE	0x015E
    015B E041      LDI	R20,1
    015C E050      LDI	R21,0
    015D C002      RJMP	0x0160
    015E 2744      CLR	R20
    015F 2755      CLR	R21
    0160 2F04      MOV	R16,R20
    0161 940E0324  CALL	pop_gset1
    0163 9508      RET
_Tbuf_full:
  RTbuf                --> R16
    0164 940E0321  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;
    0166 01F8      MOVW	R30,R16
    0167 59E6      SUBI	R30,0x96
    0168 4FFF      SBCI	R31,0xFF
    0169 8180      LDD	R24,Z+0
    016A 3684      CPI	R24,0x64
    016B F419      BNE	0x016F
    016C E041      LDI	R20,1
    016D E050      LDI	R21,0
    016E C002      RJMP	0x0171
    016F 2744      CLR	R20
    0170 2755      CLR	R21
    0171 2F04      MOV	R16,R20
    0172 940E0324  CALL	pop_gset1
    0174 9508      RET
_Tbuf_putchar:
  RTbuf                --> R20
  x                    --> R22
    0175 940E031F  CALL	push_gset2
    0177 01A9      MOVW	R20,R18
    0178 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)){
    0179 018A      MOVW	R16,R20
    017A DFE9      RCALL	_Tbuf_full
    017B 2300      TST	R16
    017C F009      BEQ	0x017E
    017D C02D      RJMP	0x01AB
(0325) 		TXC_DIS();
    017E 9856      CBI	0x0A,6
(0326) 		if (RTbuf->T_disabled)
    017F 01FA      MOVW	R30,R20
    0180 53E1      SUBI	R30,0x31
    0181 4FFF      SBCI	R31,0xFF
    0182 8020      LDD	R2,Z+0
    0183 2022      TST	R2
    0184 F039      BEQ	0x018C
(0327) 			{
(0328) 			UDR0=x;
    0185 B96C      OUT	0x0C,R22
(0329) 			RTbuf->T_disabled=0;
    0186 2422      CLR	R2
    0187 01FA      MOVW	R30,R20
    0188 53E1      SUBI	R30,0x31
    0189 4FFF      SBCI	R31,0xFF
    018A 8220      STD	Z+0,R2
(0330) 			}
    018B C01E      RJMP	0x01AA
(0331) 		else
(0332) 			{
(0333) 			RTbuf->T_count++;
    018C 01CA      MOVW	R24,R20
    018D 5986      SUBI	R24,0x96
    018E 4F9F      SBCI	R25,0xFF
    018F 01FC      MOVW	R30,R24
    0190 8180      LDD	R24,Z+0
    0191 5F8F      SUBI	R24,0xFF
    0192 8380      STD	Z+0,R24
(0334) 			RTbuf->T_buf[RTbuf->T_rear]=x;
    0193 01CA      MOVW	R24,R20
    0194 5985      SUBI	R24,0x95
    0195 4F9F      SBCI	R25,0xFF
    0196 01FA      MOVW	R30,R20
    0197 59E7      SUBI	R30,0x97
    0198 4FFF      SBCI	R31,0xFF
    0199 81E0      LDD	R30,Z+0
    019A 27FF      CLR	R31
    019B 0FE8      ADD	R30,R24
    019C 1FF9      ADC	R31,R25
    019D 8360      STD	Z+0,R22
(0335) 			RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
    019E 01CA      MOVW	R24,R20
    019F 5987      SUBI	R24,0x97
    01A0 4F9F      SBCI	R25,0xFF
    01A1 011C      MOVW	R2,R24
    01A2 E614      LDI	R17,0x64
    01A3 01FC      MOVW	R30,R24
    01A4 8100      LDD	R16,Z+0
    01A5 5F0F      SUBI	R16,0xFF
    01A6 940E02F8  CALL	mod8u
    01A8 01F1      MOVW	R30,R2
    01A9 8300      STD	Z+0,R16
(0336) 			}
(0337) 		TXC_EN();
    01AA 9A56      SBI	0x0A,6
(0338) 	}
    01AB 940E0310  CALL	pop_gset2
    01AD 9508      RET
_Rbuf_getchar:
  Btemp                --> R20
  RTbuf                --> R22
    01AE 940E031F  CALL	push_gset2
    01B0 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;
    01B1 2744      CLR	R20
(0378) 	if (!Rbuf_empty(RTbuf)){
    01B2 018B      MOVW	R16,R22
    01B3 DFA1      RCALL	_Rbuf_empty
    01B4 2300      TST	R16
    01B5 F4C1      BNE	0x01CE
(0379) 		Btemp=RTbuf->R_buf[RTbuf->R_front];
    01B6 01CB      MOVW	R24,R22
    01B7 9604      ADIW	R24,4
    01B8 01FB      MOVW	R30,R22
    01B9 81E0      LDD	R30,Z+0
    01BA 27FF      CLR	R31
    01BB 0FE8      ADD	R30,R24
    01BC 1FF9      ADC	R31,R25
    01BD 8140      LDD	R20,Z+0
(0380) 		REV_DIS();
    01BE 9857      CBI	0x0A,7
(0381) 		RTbuf->R_count--;
    01BF 01CB      MOVW	R24,R22
    01C0 9602      ADIW	R24,2
    01C1 01FC      MOVW	R30,R24
    01C2 8180      LDD	R24,Z+0
    01C3 5081      SUBI	R24,1
    01C4 8380      STD	Z+0,R24
(0382) 		RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
    01C5 E614      LDI	R17,0x64
    01C6 01FB      MOVW	R30,R22
    01C7 8100      LDD	R16,Z+0
    01C8 5F0F      SUBI	R16,0xFF
    01C9 940E02F8  CALL	mod8u
    01CB 01FB      MOVW	R30,R22
    01CC 8300      STD	Z+0,R16
(0383) 		REV_EN();
    01CD 9A57      SBI	0x0A,7
(0384) 		}
(0385) 	return (Btemp);
    01CE 2F04      MOV	R16,R20
    01CF 940E0310  CALL	pop_gset2
    01D1 9508      RET
_uart0_rx_isr:
  data                 --> R22
  status               --> R10
  RTbuf                --> R20
    01D2 922A      ST	R2,-Y
    01D3 923A      ST	R3,-Y
    01D4 930A      ST	R16,-Y
    01D5 931A      ST	R17,-Y
    01D6 938A      ST	R24,-Y
    01D7 939A      ST	R25,-Y
    01D8 93EA      ST	R30,-Y
    01D9 93FA      ST	R31,-Y
    01DA B62F      IN	R2,0x3F
    01DB 922A      ST	R2,-Y
    01DC 940E031D  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;
    01DE E040      LDI	R20,0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -