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

📄 rs232.c

📁 Keil 8051 C example RS232 to I2c
💻 C
字号:
#include <at89x52.H>              // SFR definition header file
#include <stdio.h>                 // prototype declarations for I/O functions
#include "SystemEvent.h"
#include "UART.h"
#include <intrins.h>
#include "ExtVar.h"
#include "function.h"
#include "RTOS.h" 
/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_    0x01

#define STOP_   0x02
#define PD_     0x02    /* Alternate definition */

#define GF0_    0x04
#define GF1_    0x08
#define SMOD_   0x80

void InitSERIALPort(void){  
	ET1 = 0;
   TI=0;		  
   _Sync=0;
   _LghOfCommand=0;
	//  SCON : SM0 | SM1 | SM2 | REN |TB8 | RB8 | TI | RI
	PCON|=SMOD_;
	SCON&=0xf0;
   SCON=0x51;	//01010000B
	TMOD&=0x0f;
	TMOD|=0x20; //   MOV  TMOD,#00100000B
	TH1=0xfd;  	// MOV  TH1,#FDH
   TCON&=0x3f;
   TCON|=0xc0;	//  MOV  TCON,#01000000B  
   ES=1;                            
   EA = 1; 		// global interrupt enable    
   				//    SBUF=0x55;                   
}  

void StartTriI2C(void){             
	TI=0; 
	SBUF=*(_PtrI2c+_IndxOfI2C);                    
	_IndxOfI2C++;
}

void LatchI2CHandler(unsigned char _LengthX,unsigned char _SyncX){	 										         
	_IndxOfI2C=0;               
	_AdrxOfI2C=_AdrX;                            
	_LengthOfI2C=_LengthX ;
   _Sync=_SyncX;
}
 
void CheckBreak(unsigned char _SyncX){					   							 
 	if(_Indx>=(_Length-1)){  
 		_Sync=_SyncX;  _LghOfCommand=0; 	 
	}
   _Indx++;
}
 
void SerialPort (void) interrupt 4 using 3 {   
	unsigned char _ix;     
	_Busy=1;		 
 	switch(_Sync){
	case _REC_COMMAND:   
		RI=0;					
     	_CommandBufX[_LghOfCommand]=SBUF;         						    
     	if((_LghOfCommand==0)) { 
     		if((_CommandBufX[_LghOfCommand]&0xf0)==0xc0) 
       		_LghOfCommand++;					 
			}					 
	      else {     
				if(_LghOfCommand==3){  
					P2^=0x80;    //	os_send_signal (_HDMIFuncX);
					_AdrX=(unsigned int)_CommandBufX[_ADDRH];                                   
					_AdrX<<=8;
			      _AdrX+=(unsigned int)_CommandBufX[_ADDRL];	
					_CommandBufX[_LENGTH]-=3; 	
        	   	_Length=(unsigned int)_CommandBufX[_LENGTH]&0x00ff;  
	   	     	_Indx=0;
	      	  	switch(_CommandBufX[_COMMAND]){ 
		         case _RDI2C:											       
        		      LatchI2CHandler(_Length,_TRI_ECHO_I2C_TO_HOST);                                                      
	    	   	   _FuncX|=_ReadI2CMode;
						//	isr_send_signal(_Init);
						break;
					case _WRI2C:     											       
		        		LatchI2CHandler(_Length,_REC_I2C_DATA_FROM_HOST);												     
						break;                                           
					case _CommandFromHostX:     
            		LatchI2CHandler(_Length,_REC_CommandX_FROM_HOST);												    
						break;                                         
           	}													              
	     	}
			_LghOfCommand++;										                	
		}                                    
      break;
	case _REC_CommandX_FROM_HOST:			
		*(_PtrI2c+_IndxOfI2C)=SBUF;
		RI=0;
      _IndxOfI2C++;			
	   if((_IndxOfI2C>=0x08)||(_Indx>=(_Length-1))){
      	for(_ix=0;_ix<8;_ix++){
         	*(_WPtrI2c+_ix)=*(_PtrI2c+_ix);
         }                                                                         
         _IndxOfI2C=0;								 
         _FuncX|=_CommandX;   
           // 	isr_send_signal(_Init);
      }   						 
      CheckBreak(_REC_COMMAND);	 
		break;
	case _REC_I2C_DATA_FROM_HOST:              
		*(_WPtrI2c+_IndxOfI2C)=SBUF;
		RI=0;
      _IndxOfI2C++;			
      if((_IndxOfI2C>=_Length)||(_Indx>=(_Length-1))){                  
			_IndxOfI2C=0;								 
         _FuncX|=_WriteI2CMode;  
         // 	isr_send_signal(_Init);
      }   						 
      CheckBreak(_REC_COMMAND);
	 	break;
	case _TRI_ECHO_I2C_TO_HOST:  		   				 	
		TI=0;		                 
		if(_IndxOfI2C<_LengthOfI2C){ 
      	SBUF=*(_PtrI2c+_IndxOfI2C);       						   						                  
        	_IndxOfI2C++;                                            
		}
		else { 
			_IndxOfI2C=0;
			_Busy=0; 
		}                                                                    						    
      CheckBreak(_TRI_OVER);
	 	break;
	case _TRI_OVER: 
  		TI=0;						 
		_Sync=_REC_COMMAND;								                               
      break;
	}   
}  

⌨️ 快捷键说明

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