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

📄 24c01.lst

📁 通过MEGA128的串口对I2C芯片24c01的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -