花生漫画

利用ADuC7026的I2C接口与SAA1064设计显示电路

0
阅读(3624)

     本文为大家介绍如何利用ADuC7026的I2C接口与SAA1064设计显示电路。ADuC7026支持两个完全得到许可的I2C接口,因为这两个I2C接口是相同的,所以该接口既可作主接口用也可作为从属接口使用。两个主接口和一个从接口有独立中断。

I2C接口有两个用于数据传输的引脚SDA和SCL,配置为线与格式,此格式在多主系统中允许仲裁。在I2C总线系统上I2C总线外设地址由用户编程。除数据传送处理时间,这个ID在其他任何时刻都可以修改。用户可配置接口来响应四个从地址。

I2C系统的传送序列包括一个主机设备,它通过在总线空闲时产生一个开始条件来初始化一个数据传送。在初始地址传送时,主机传送一个从机地址和数据传送方向,如果主机没有丢失仲裁位和从机应答位,则数据传送开始,传送一直进行到主机发出一个停止条件或者总线空闲。

I2C的外围主机、从机功能是独立的,可以同时使能。当总线上的传送开始后,从机功能有效,如果从机没有被寻址,则在下一次传送开始前无效。当一个主机设备丢失仲裁位后,它也可以作为从机以同样周期响应。

I2C总线最主要的优点是其简单性和有效性。由于接口直接连接在外围组件上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线最大长度可达7.6m,最大传输速率可达400kpbs。

本设计将利用ADuC7026与SAA1064设计显示电路

显示电路采用I2C串口方式,选用SAA1064作I2C显示驱动芯片。SAA1064 LED驱动器是一个双极型集成电路,由能兼容18V电压的I2C工艺制作。此电路可驱动4位带十进制小数点的7段LED显示器,通过两组数字复合实现该驱动器内带有I2C总线的从接收接口可以编程为四个不同的从地址。

 SAA1064的从地址是由引脚ADR上的输入电平决定的。ADR引脚在接VEE、3/8VCC、5/8VCC和VCC时分别对应于4个不同的从地址(A1A0 =00、01、10、11)在写方式时,它们对应的从地址字节值为70H、72H、74H、76H,而在读方式时,它们对应的从地址字节值为71H、73H、75H、77H。其他的地址不为该器件所响应。

SAA1064通过串行口与单片机相连,时钟也是由单片机提供,电路中的两个三极管是为了增加它的驱动能力,每个SAA1064最多可以驱动四个数码管。选用I2C的方式作为显示主要是考虑到其接线比较简单,这正符合现场仪表的接线方式越简单越好的原则。#include

#define SAA1_WRITE_ADDR     0x70    
#define SAA2_WRITE_ADDR     0x76   
#define SAA_WORK_MODE_ALLON     0x47   
#define SAA_WORK_MODE_ALLOFF	0x71
Unsigned char LED_TABLE[]={
0xB7,0x06,0x73,0x57,0xC6,0xD5,0xF5,0x07,0xF7,0xC7,0xBF,0x0E,0x7B,0x5F,0xCE,0xDD,0xFD,0x0F,0xFF,0xCF,0x00,0xE7,0xF7,0xB1,0xB7,0xF1,0xE1,0x07,0x4C
};
void I2C_MasterMode(void);
void I2C_STRAT(void);
void I2C_STOP(void);
void I2C_SendData(char DATA);
void  LED_SHOW_ON_ABOVE(DATA1,DATA2,DATA3,DATA4);
void  LED_SHOW_ON_UNDER(DATA1,DATA2,DATA3,DATA4);
void delay(unsigned char x);
void delay2(unsigned char x,unsigned char y);
void delay3(unsigned char x,unsigned char y,unsigned char z);
void delay(unsigned char x){//公式10+3x									
	while(--x);				 //max70.78us
}
void delay2(unsigned char x,unsigned char y){//公式12+(3x+5)*y
	unsigned char z;						//最大延迟17.75ms 取值255,255
	do{	z=x;								
		do{
			}while(--z);
	 }while(--y);

}
void delay3(unsigned char x,unsigned char y,unsigned char z){
	unsigned char a;    //公式14+(3x+5)*(y+3)*z
	unsigned char b;	//最大延迟4.5658s 取值255,255,255									
	do{	b=y;			//延迟1s 取值255,255,56				
		do{ a=x;
			do{ 
			}while(--a);
		}while(--b);
	 }while(--z);

}
void I2C_MasterMode(void)
    {
	 CFG841=0x02;     	  
     I2CM=1;   //mode
	 MDO=1;    //Master Data Out
	 MCO=1;    //Master Clock Out
	 MDE=1;	   //Master Data Out Enable
	 MDI=0;	   //Master Data In
    }
void I2C_STRAT(void)
{   
	MDE=1;
	delay(0x0F);
	MDO=0;
	delay(0x0F);
	MCO=0;	
	delay(0x0F);	
}
void I2C_STOP(void)
{
	MDE=1;
	MDO=0;
	delay(0x0F);
	MCO=1;
	delay(0x0F);
	MDO=1;
	delay(0x1F);
}
void I2C_SendData(char DATA){
	char flag3=0;
	char counter=8;
	ACC=DATA;
    MCO=0;
	MDE=1;
	do{	
		DATA=DATA<<1;
		MDO=CY;	
		delay(0x1F);
		MCO=1;	
		delay(0x1F);
		MCO=0;
		delay(0x1F);
	}while(--counter);
	MDE=0;
	delay(0x1F);
	MCO=1;
	delay(0x1F);
	if(MDI==1)  flag3=1;  //get NACK;
	delay(0x1F);
	MCO=0;
	delay(0x1F);
	//return flag3;
}
void  LED_SHOW_ON_ABOVE(DATA4,DATA3,DATA2,DATA1)
    {
		I2C_STRAT();	 
		I2C_SendData(SAA2_WRITE_ADDR);    
		I2C_SendData(0x00);		
		I2C_SendData(SAA_WORK_MODE_ALLON);
		I2C_SendData(DATA2);      
		I2C_SendData(DATA1);      	
		I2C_SendData(DATA4);	 	
		I2C_SendData(DATA3);      	
		I2C_STOP();
 		delay2(255,12);	
	}
void  LED_SHOW_ON_UNDER(DATA4,DATA3,DATA2,DATA1)
    {
		I2C_STRAT();
		I2C_SendData(SAA1_WRITE_ADDR);
		I2C_SendData(0x00);	
		I2C_SendData(SAA_WORK_MODE_ALLON);
		I2C_SendData(DATA2);	 	
		I2C_SendData(DATA1);	 			
		I2C_SendData(DATA4);  		
		I2C_SendData(DATA3);  		
		I2C_STOP();
       delay2(255,12);
	}
void main()
{      
I2C_MasterMode();
LED_SHOW_ON_ABOVE(LED_TABLE[1],LED_TABLE[2],LED_TABLE[3],LED_TABLE[4]);			LED_SHOW_ON_UNDER(LED_TABLE[5],LED_TABLE[6],LED_TABLE[7],LED_TABLE[8]);
}