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

📄 i2c.~c

📁 I2C AVR单片机使用I2C总线的例子
💻 ~C
字号:
/**********************************************
             http://www.sl.com.cn
      双龙电子公司----I2C总线演示程序(ICCAVR)
	             作者:詹卫前
		  1、以访问AT24C02为例
		  2、SDA :PORTA.0
		  3、SCL : PORTA.1
	使用注意:1、应包含头文件slavr.h
              2、在工程选项中的Additional Lib中填入slavr
		         使用编译器使用附加库文件libslavr.a
***********************************************/
#include <io8515.h>
#include <slavr.h>
          /*   七段译码字形表     */
#pragma data:code		          
const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#pragma data:data
          /*     显示缓冲区       */
unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x00,0x00};
unsigned char at24_add,at24_data;
/******************************************
               I2C总线写一个字节
*******************************************/
void i2c_Write(unsigned char Wdata,unsigned char RomAddress) 
{
	  Start();
	  Write8Bit(0xa0);
	  TestAck();
	  Write8Bit(RomAddress);
	  TestAck();	
	  Write8Bit(Wdata);
	  TestAck();		
	  Stop();
 	  delay_ms(10);
}
/******************************************
               I2C总线读一个字节
*******************************************/
unsigned char i2c_Read(unsigned char RomAddress) 
      {
	   unsigned char temp;
	   Start();
	   Write8Bit(0xa0); 
	   TestAck();
	   Write8Bit(RomAddress);
	   TestAck();
	   Start();
	   Write8Bit(0xa1);
	   TestAck();	
	   temp=Read8Bit();
	   NoAck();
       Stop();
	   return temp;
      }   
/******************************************
               端口初始化
*******************************************/
void port_init(void)
 {
  DDRD=0x3f;
  DDRB=0xff;
  PORTD=0xff;
  PORTB=0xff;
 }
/******************************************
          六路动态扫描显示电路
*******************************************/
void display(void)
{
 unsigned char i;
  i=at24_data%16;
  ledbuff[0]=tabel[i];
  i=at24_data/16;
  ledbuff[1]=tabel[i];
  i=at24_add%16;
  ledbuff[2]=tabel[i];
  i=at24_add/16;
  ledbuff[3]=tabel[i];
 for (i=0;i<6;i++)
  {
   PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
   PORTD=~(1<<i);   //开始显示
   delay_1ms();     //每一位显示保持一定时间
   PORTD|=(1<<i);   //关闭显示
  }
}
/******************************************
    主程序功能:演示了读写AT24C02的过程
	说明:1、键盘上0~F键用于输入地址或数据,
	         SHIFT键用于切换状态
		  2、上电复位后,按数字键只可以修改地
		     址,程序自动显示AT24C02单元内容。
		  3、按一次SHIFT键,最高位LED小数点亮
		     此时可以修改数字,再按一次SHIFT键
			 程序将修改后的数字写入AT24C02,然
			 后回到上电复位后的状态		
*******************************************/
void main(void)
{
 unsigned char key1,key2;
 unsigned char index,flag;
 MCUCR=0;
 at24_add=0;
 at24_data=0;
 index=0;
 flag=0;
 port_init(); //端口初始化
 while(1)
  {  
     key1=scan_key();
  	 if (key1!=0x7f)
	    {
		 do 
		   {
		    key2=scan_key();//检查按键释放
	  	    display();
			}
		 while(key1==key2);
		 if (key1>=0x80)
		    {
			 if (flag!=0x00)//SHIFT键切换数据和地址修改
			     { 
				   i2c_Write(at24_data,at24_add);
				   flag=0x00;
				  }			 
			 else flag=0x80;
			 ledbuff[5]=0x00^flag;
			 index=0;
			 }
		 else
		    {
			 switch (index)
			   {
			    case 0:{if (flag==0x00)
				           {key2=at24_add&0x0f;
						    at24_add=key2|(key1<<4);
						    }
				        else
						   {key2=at24_data&0x0f;
						    at24_data=key2|(key1<<4);
							}
						index=01;							
						break;	     
				       }
				case 1:{if (flag==0x00)
				           {key2=at24_add&0xf0;
						    at24_add=key2|(key1&0x0f);
						    }
				        else
						   {key2=at24_data&0xf0;
						    at24_data=key2|(key1&0x0f);
							}
						index=00;	
						break;	
				       }
			   }    			
			} 	
		 }	 	 		 		 			  
     if (flag==0x00)
	 at24_data=i2c_Read(at24_add);
	 display();	  
  }
}

⌨️ 快捷键说明

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