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

📄 pic16f877.txt

📁 pic16f877 的SCI 和 I2C 程序原始代码
💻 TXT
字号:
#include<pic1687x.h>
#include<math.h>
#define CLRDOG	asm("clrwdt")

#define TIME1_L 0x00
#define TIME1_H 0xff
#define ADDR 0x01
unsigned char bank3 word_model[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xce};
static unsigned char bank3 dispbuf[7];

static unsigned char bank3 receive_buf[11];
static unsigned char bank3 receive_counter=0;
static unsigned char bank3 dispcount=0;
static unsigned char bank3 return_data=0;
static bit bank3 key1_flag=0;
static bit bank3 key2_flag=0;
static bit bank3 key3_flag=0;
static bit bank3 key4_flag=0;
static unsigned char bank3 showcount=0;
void io_init();
void timer_init();
void key_handle();
unsigned char i2c_write( unsigned char i2cWriteData );
int i2c_read( unsigned char ack );
void i2c_stop();
void i2c_repStart();
void i2c_start();
void i2c_waitForIdle();
void i2c_init();
void write_ext_eeprom(unsigned char device, unsigned char address, unsigned char data);
unsigned char read_ext_eeprom(unsigned char device, unsigned char address);
void delayNms(unsigned char N);
void dispdata_handle(unsigned char sel,unsigned int ival,unsigned char dot);
//void write_INEErom(unsigned char addr,unsigned char data);
//unsigned char read_INEErom(unsigned char addr);
#pragma interrupt_level 1
unsigned char read_INEErom(unsigned char addr)
{
      unsigned char data;
	  EEADR=addr;
	  EEPGD=0;
	  RD=1;
	  data=EEDATA;
	  return data;
}
//#pragma interrupt_level 1
void write_INEErom(unsigned char addr,unsigned char data)
{
//	unsigned char i;
	EEADR=addr;
	EEDATA=data;
	EEPGD=0;
	WREN=1;
	//EEPROM_WRITE(addr,data); 
	EECON2=0x55;
	EECON2=0xaa;
	WR=1;
	WREN=0;
//	while(WR==1);
}

void io_init()
{
	/* init watchdog */
	CLRDOG;
	OPTION=0x0f; 
	
	TRISA=0x03;
	PORTA=0xff;
	
	TRISB=0x00;
	PORTB=0xff;/*0xfe*/
	
   	TRISC=0xd8;
	PORTC=0xff;/*0x0b*/
	
	TRISD=0x1e;
 	PORTD=0xff;
	
	TRISE=0x00;//its 4th bit can control portd
	PORTE=0xff;
    ADCON1=0x0d;
	
}
void serial_init()
{
  SPBRG=0x19;
  TXSTA=0x04;
  RCSTA=0x80;
  TRISC6=1;
  TRISC7=1;
  RC5=0;
  RCIE=1;
  //RCIF=0;
  
  CREN=1;
  receive_counter=0;
  //TXIE=1;
  //INTCON=0xc0;
}
void i2c_init()
{
  TRISC3=1;           // set SCL and SDA pins as inputs
 TRISC4=1;

 SSPCON = 0x38;      // set I2C master mode
 SSPCON2 = 0x00;

 //file://SSPADD = 0x6;     // 400kHz bus with 10MHz xtal - use 0x0C with 20MHz xtal
 SSPADD = 10;            // 100k at 4Mhz clock

 STAT_CKE=1;     // use I2C levels      worked also with '0'
 STAT_SMP=1;     // disable slew rate control  worked also with '0'

 PSPIF=0;      // clear SSPIF interrupt flag
 BCLIF=0;      // clear bus collision flag
}
void timer_init()
{
	T1CON=1;
	TMR1IF=0;
	TMR1IE=1;
	TMR1L=TIME1_L;
	TMR1H=TIME1_H;
	INTCON=0xc0;
}
void dispdata_handle(unsigned char sel,unsigned int ival,unsigned char dot)
{
	unsigned int divd=100;
	unsigned char i,bitdata;
	switch(sel)
	{
	case 0:
		{
			for(i=0; i<3; i++) 
	{
		bitdata=ival/divd;
		ival=ival%divd;
		dispbuf[i]=word_model[bitdata];
		if(dot==i) dispbuf[i]+=0x01;
		divd=divd/10;
	}
		}
		break;

	case 1:
		{

   for(i=3; i<6; i++) 
	{
		bitdata=ival/divd;
		ival=ival%divd;
		dispbuf[i]=word_model[bitdata];
		if(dot==(i-3)) dispbuf[i]+=0x01;
		divd=divd/10;
	}
		}
		break;
	case 2:
        dispbuf[6]=ival;
		break;
	}
	
}

#pragma interrupt_level 1
void interrupt t_1()
{
//	unsigned char i;
  	if(RCIF==1)
	{   
		GIE=0;
		dispbuf[0]=word_model[0];
		receive_buf[receive_counter]=RCREG;
        receive_counter=receive_counter+1;
	if(receive_counter>=10)
		{
			dispbuf[1]=word_model[1];
			receive_counter=0;
			if((receive_buf[0]==0xff)&&(receive_buf[1]==0xaa)
				&&(receive_buf[10]=0x55)&&(receive_buf[2]=ADDR))
            {
				dispbuf[2]=word_model[2];
              if(receive_buf[3]==2)
			  { 
				  RC5=1;
				  TXEN=1;
				  delayNms(2);
				  dispbuf[3]=word_model[3];
				  TXREG=read_INEErom(0);
                 //0x12;
		         while(1)
				 {
			        if(TXIF==1) break;
				 }
				 delayNms(1);
				 dispbuf[4]=word_model[4];
				 RC5=0;
			  }
			}
		}
	    GIE=1;
	}

	else if(TMR1IF==1)
	{
	TMR1L=TIME1_L;
	TMR1H=TIME1_H;
	CLRDOG;
	TMR1IF=0;
	if(showcount>6)
		showcount=0;

      switch(showcount) 
	  {
		case 0:		
		    RA5=1;
	        RE0=0;
			RE1=0;
		    RE2=0;
			RD7=0;
			RD6=0;
			RD5=0;
			PORTB=dispbuf[0];
			break;
		case 1:	
		    
			RA5=0;
	        RE0=1;
			RE1=0;
		    RE2=0;
			RD7=0;
			RD6=0;
			RD5=0;
			PORTB=dispbuf[1];
			break;
		case 2:	
		    RA5=0;
	        RE0=0;
			RE1=1;
		    RE2=0;
			RD7=0;
			RD6=0;
			RD5=0;
			PORTB=dispbuf[2];
			break;
		case 3:	
		    RA5=0;
	        RE0=0;
			RE1=0;
		    RE2=1;
			RD7=0;
			RD6=0;
			RD5=0;
			PORTB=dispbuf[3];
			break;
		case 4:	
		    RA5=0;
	        RE0=0;
			RE1=0;
		    RE2=0;
			RD7=1;
			RD6=0;
			RD5=0;
			PORTB=dispbuf[4];
			break;
		case 5:	
		    RA5=0;
	        RE0=0;
			RE1=0;
		    RE2=0;
			RD7=0;
			RD6=1;
			RD5=0;
			PORTB=dispbuf[5];
			break;
		case 6:	
		    RA5=0;
	        RE0=0;
			RE1=0;
		    RE2=0;
			RD7=0;
			RD6=0;
			RD5=1;
			PORTB=dispbuf[6];
			break;
		}
	showcount=showcount+1;	
	}
		
}
void delayNms(unsigned char N)
{
	int i,j;
	for(j=0;j<N;j++)
	{
	 for(i=0;i<1000;i++) continue;

	}
}

//#pragma interrupt_level 1
void key_handle()
{ 
   
   if(key1_flag==1)
   {
	  if(RD4==1) 
	  {
		
		/*  dispcount=dispcount+1;
		  if(dispcount>9)
		    dispcount=0;
		   write_ext_eeprom(0xa2,dispcount,dispcount+2);   // it to eeprom
	       delayNms(1);
           return_data=read_ext_eeprom(0xa2,dispcount); 
		 PORTB=word_model[return_data];
	*/
		 write_INEErom(0,9);
		  dispbuf[0]=word_model[1];
		  key1_flag=0;
	  }
	  
   }
   else
   {
     if(RD4==0) 
	  {
		key1_flag=1;
	  }
   }
/**************************/
    if(key2_flag==1)
   {
	  if(RD3==1) 
	  {
		  
          unsigned char data=0;
		  data=read_INEErom(0);
		  dispbuf[0]=word_model[data];
		  key2_flag=0;
	  }
	  
   }
   else
   {
     if(RD3==0) 
	  {
		key2_flag=1;
	  }
   }
   /*****************************/
   if(key3_flag==1)
   {
	  if(RD2==1) 
	  {
		  dispbuf[2]=word_model[3];
		  key3_flag=0;
	  }
	  
   }
   else
   {
     if(RD2==0) 
	  {
		key3_flag=1;
	  }
   }
   /*****************************/
   if(key4_flag==1)
   {
	  if(RD1==1) 
	  {
		  dispbuf[3]=word_model[4];
		  key4_flag=0;
	  }
	  
   }
   else
   {
     if(RD1==0) 
	  {
		key4_flag=1;
	  }
   }
}

/******************************************************************************************/

void i2c_waitForIdle()

{
 while (( SSPCON2 & 0x1F ) | STAT_RW ) {}; // wait for idle and not writing
}

/******************************************************************************************/

void i2c_start()

{
 i2c_waitForIdle();
 SEN=1;
}

/******************************************************************************************/

void i2c_repStart()

{
 i2c_waitForIdle();
 RSEN=1;
}

/******************************************************************************************/

void i2c_stop()

{
 i2c_waitForIdle();
 PEN=1;
}

/******************************************************************************************/

int i2c_read( unsigned char ack )

{
 unsigned char i2cReadData;

 i2c_waitForIdle();

 RCEN=1;

 i2c_waitForIdle();

 i2cReadData = SSPBUF;

 i2c_waitForIdle();

 if ( ack )
  {
  ACKDT=0;
  }
 else
  {
  ACKDT=1;
  }
  ACKEN=1;               // send acknowledge sequence

 return( i2cReadData );
}

/******************************************************************************************/

unsigned char i2c_write( unsigned char i2cWriteData )

{
 i2c_waitForIdle();
 SSPBUF = i2cWriteData;
 return ( ! ACKSTAT  ); // function returns '1' if transmission is acknowledged
}

//下面是读写函数:
void write_ext_eeprom(unsigned char device, unsigned char address, unsigned char data)

 {
   unsigned char flag; 
   while(1)
 {
        i2c_start();
     flag=i2c_write(device);    
     if (flag) break;  //判定是否在写EEPROM
        i2c_stop();
    }
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   //DelayMs(5);   //等待写EEPROM
}

/******************************************************************************************/

unsigned char read_ext_eeprom(unsigned char device, unsigned char address)
{
   unsigned char data;
   unsigned char flag;
   while(1)
 {
        i2c_start();
     flag=i2c_write(device);    
     if (flag) break;   //判定是否在写EEPROM
        i2c_stop();
    }
 
   i2c_write(address);

   i2c_repStart();
   i2c_write(device+1);
 
   data=i2c_read(0);

   i2c_stop();
 
   return(data);
}

void main()
{
	unsigned char i;
	for(i=0;i<6;i++)
	{
		dispbuf[i]=0xce;
	}
     CLRDOG;
  	io_init();	
	i2c_init();
	timer_init();
	serial_init();
	while(1) 
	{
	  key_handle();


	}
	
	
	
}


⌨️ 快捷键说明

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