利用ADuC7026的I2C接口与SAA1064设计显示电路
0赞本文为大家介绍如何利用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]); }
