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

📄 h_iic._c

📁 一款挂面机的自动化控制源程序
💻 _C
字号:
#include <mega128.h>
//TWI状态定义
//MT 主方式传输  MR 主方式接收
#define START 0x08 
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK  0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK  0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
//hardware IIC
#define TWINT   7
#define TWEA    6
#define TWSTA   5
#define TWSTO   4
#define TWEN    2 

//常用TWI操作(主模式写和主模式读)
#define Start()    	  (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop()     	  (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait()	   	  {while(!(TWCR&(1<<TWINT)));}
#define TestAck() 	  (TWSR&0xf8)
#define SetAck()	  (TWCR|=(1<<TWEA))
#define SetNoAck()        (TWCR&=~(1<<TWEA))
#define TWI()	  	  (TWCR=(1<<TWINT)|(1<<TWEN)) 
#define TWE()             (TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN))
#define Write8Bit(x)      {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 

#define zlg7290  0x70

/******************************************
               I2C总线写字符串
	       返回0:写成功
	       返回非0:写失败
*******************************************/
      
unsigned char ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{     unsigned char i;
          #asm("cli")
          Start();//I2C启动
	  Wait();
	  if(TestAck()!=START){Stop(); return 1;}        //ACK
	  Write8Bit(sla);//写I2C从器件地址和写方式
	  Wait();
	  if(TestAck()!=MT_SLA_ACK){Stop(); return 1;}   //ACK
	  Write8Bit(suba);//写地址
	  for(i=0;i<no;i++)
	  { Wait();
	    if(TestAck()!=MT_DATA_ACK){Stop(); return 1;}//ACK
	    Write8Bit(*s);//写数据
	    s++;
	  }	
	  Wait(); 
	  if(TestAck()!=MT_DATA_ACK){Stop(); return 1;}  //ACK	
	  Stop();//I2C停止
	  #asm("sei")
 	  return 0;
}

/******************************************
               I2C总线读字符串
	       如果读失败也返回0,正确返回1;
*******************************************/
unsigned char IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) 
      {    
	   unsigned char i;
	   #asm("cli")
	   Start();//I2C启动
	   Wait();
	   if (TestAck()!=START) {Stop(); return 0;}//ACK	   
	   Write8Bit(sla);//写I2C从器件地址和写方式
	   Wait(); 
	   if (TestAck()!=MT_SLA_ACK) {Stop(); return 0;}//ACK
	   Write8Bit(suba);//写地址
	   Wait();
	   if (TestAck()!=MT_DATA_ACK) {Stop(); return 0;}
	   Start();//I2C重新启动
	   Wait();
	   if (TestAck()!=RE_START)  {Stop(); return 0;}
	   Write8Bit(sla+1);//写I2C从器件地址和读方式
	   Wait();
	   if(TestAck()!=MR_SLA_ACK)   {Stop(); return 0;}//ACK 
	   for(i=0;i<no-1;i++)
	   {  TWE();//启动主I2C读方式
	      Wait();
	      if(TestAck()!=MR_DATA_ACK)  {Stop(); return 0;};//ACK
	      *s=TWDR;//读取I2C接收数据
	      s++;
	   }
	   TWI();//启动主I2C读方式
	   Wait();
	   if(TestAck()!=MR_DATA_NOACK)  {Stop(); return 0;}//ACK	
	   *s=TWDR;//读取I2C接收数据	
	   Stop();//I2C停止 
	   #asm("sei")
	   return 1;
      }
unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
{
	if(SubAdd>0x17)
	return 0;
	ISendStr(zlg7290,SubAdd,&Data,1);
       //	delay_ms(10);
	return 1;
}
//向zlg7290命令缓冲区发送命令(2个字节)
unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
{  
    unsigned char Data[2];
	Data[0]=Data1;
	Data[1]=Data2;
	ISendStr(zlg7290,0x07,Data,2);
       //	delay_ms(10);
	return 1;
}
//向zlg7290的显示缓冲区发送数据
void ZLG7290_SendBuf(unsigned char *display_buf,unsigned char num)
{
 	unsigned char i;
	for(i=0;i<num;i++)
	{	
		ZLG7290_SendCmd(0x60+i,*display_buf);
		display_buf++;
	}
} 
//zlg7290的键值
unsigned char ZLG7290_GetKey()
{   unsigned char rece=0;
    if( IRcvStr(zlg7290,1,&rece,1)==0 )  return (0);
       //	delay_ms(10);
	return rece;
} 
//向ZLG7290发送字符串
void disstring(char *tmp)
{
unsigned char num;
unsigned char i;  
unsigned char chr,chr1,chr2;
signed char at;
num=strlen(tmp);
at=strpos(tmp,'.');
if ((at<10) & (at>1)) num=num-1;
if (num>=8) num=8;
for (i=0;i<num;i++)
   {
   i2cstart();
   i2cwrite(0x70);
   i2cwrite(0x07);
   chr=0x68-i;
   i2cwrite(chr); 
   chr=*tmp;
   switch (chr)
      {
      case '0' : chr1=0; break;
      case '1' : chr1=1; break;
      case '2' : chr1=2; break;
      case '3' : chr1=3; break;
      case '4' : chr1=4; break;
      case '5' : chr1=5; break;
      case '6' : chr1=6; break;
      case '7' : chr1=7; break;
      case '8' : chr1=8; break;
      case '9' : chr1=9; break; 
      case ' ' : chr1=31; break;
      case 'A' : chr1=10; break;
      case 'b' : chr1=11; break;
      case 'C' : chr1=12; break;
      case 'd' : chr1=13; break;
      case 'E' : chr1=14; break;
      case 'F' : chr1=15; break;
      case 'G' : chr1=16; break;
      case 'H' : chr1=17; break;
      case 'i' : chr1=18; break;
      case 'J' : chr1=19; break;
      case 'L' : chr1=20; break;
      case 'O' : chr1=21; break;
      case 'P' : chr1=22; break;
      case 'q' : chr1=23; break;
      case 'r' : chr1=24; break;
      case 't' : chr1=25; break;
      case 'U' : chr1=26; break;
      case 'y' : chr1=27; break;
      case 'c' : chr1=28; break;
      case 'h' : chr1=29; break;
      case 'T' : chr1=30; break;
      case '.' : chr1=128; break;
      default  : chr1=31; 
      }  
   tmp++; 
   chr2=*tmp;
   if (chr2=='.')  
      {
      chr1=chr1+128;
      tmp++;
      }
   i2cwrite(chr1);
   i2cstop();
  
   }
} 

⌨️ 快捷键说明

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