标题：ZLG7290
引言
在智能仪表中，经常会用到键盘、数码管等外设。因此，一个稳定、占用系统资源少的人机对话通道设计非常重要。传统的键盘与数码管解决方案，由于键盘与数码管是分离的，因而电路连接比较复杂，不管是独立式键盘还是矩阵式键盘，都会浪费微控制器的端口资源，而且都需要人为进行去抖动处理，且抗干扰性差。而数码管部分，不管是静态显示方式还是动态显示方式，在不进行锁存器扩展的前提下。仍然要占用8根I／O端口线，这将严重浪费系统的端口资源。
ZLG7290可完全克服上述弊端。它采用I2C总线接口，与微控制器的连接仅需两根信号线，硬件电路比较简单。而且可以驱动8位共阴数码管或64只独立LED、64只独立按键，并可提供自动消除抖动、连击键计数等功能。这对于传统的键盘与数码管解决方案，无疑是不可想象的。强大的功能，丰富的资源，良好的接口，使得ZLG7290比传统的键盘与数码管解决方案且有更大的优越性。因此，在现代智能仪表的设计中，通过ZLG7290可为系统设计工程师设计出良好的人机对话通道，从而提供了一种理想的解决方案。
ZLG7290的工作原理
ZLG7290的核心是一块ZLG7290B芯片，它采用I2C接口，能直接驱动8位共阴式数码管，同时可扫描管理多达64只按键，实现人机对话的功能资源十分丰富。除具有自动消除抖动功能外，它还具有段闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能，并可提供10种数字和21种字母的译码显示功能，用户可以直接向显示缓存写入显示数据，而且无需外接元件即可直接驱动数码管，还可扩展驱动电压和电流。此外，ZLG7290B的电路简单，使用也很方便。
用户按下某个键时，ZLG7290的INT引脚会产生一个低电平的中断请求信号，读取键值后，中断信号就会自动撤销。正常情况下，微控制器只需要判断INT引脚就可以得到键盘输入的信息。微控制器可通过两种方式得到用户的键盘输入信息。其一是中断方式，该方式的优点是抗干扰能力强，缺点是要占用微控制器的一个外部中断源。其二是查询方式，即通过不断查询INT引脚来判断是否有键按下，该方式可以节省微控制器的一根I／O口线，但是代价是I2C总线处于频繁的活动状态，消耗电流多并且不利于抗干扰。
2基于ZLG7290的无功补偿控制器设计
由于采用了I2C总线接口，因而用ZLG7290与微控制器设计电力仪表的硬件电路连接非常简单。它只需要两根信号线(一根数据线SDA，一根时钟信号线SCL)。但应注意进行I2C通信的双方要共地，并应用，INT传递键盘中断信号。微控制器通过RST可以将ZLG7290复位。
一．        作用及其功能介绍
ZLG7290能够直接驱动8 位共阴式数码管（或64 只独立的LED），同时还可以扫描管理多达64 只按键。其中有8 只按键还可以作为功能键使用，就像电脑键盘上的Ctrl、Shift、Alt 键一样。另外ZLG7290B 内部还设置有连击计数器，能够使某键按下后不松手而连续有效。采用I2C 总线方式，与微控制器的接口仅需两根信号线。可控扫描位数，可控任一数码管闪烁。  引脚说明
二．        使用说明
ZLG7290B是基于I2C总线接口的芯片。主控单片机ADUC831作为主器件时，内部没有I2C总线功能，因此需用SPI总线的引脚来模拟I2C总线。具体连接如下：
ZLG7290B            ADUC831
GND            DGND
SDA            MOSI
SCL            SCLOCK
/INT             INT0
VCC            DVDD
但是，这种连接不是唯一的，只是在所写的软件里需要这样连接。其实中断可以根据自己所选的中断而定。地（GND）和电源（VCC）也可以另外从电源上接过来。所用电源为5V。
编译软件使用的是WSD，这个软件主要是用于AD系列芯片的。只要下载扩展名为HEX的文件即可。
三．软件库及调用说明
（1）I2C头文件库
⑴ void I2C_Delay()； I2C延时程序
⑵ void I2C_Init()；   I2C 总线初始化，使总线处于空闲状态
⑶ void I2C_Start()；  产生I2C 总线的起始状态
⑷ void I2C_Write(char dat)； 向I2C 总线写1 个字节的数据
⑸ char I2C_Read()；         从从机读取1 个字节的数据
⑹ bit I2C_GetAck()；        读取从机应答位
⑺ void I2C_PutAck(bit ack)； 主机产生应答位或非应答位
⑻ void I2C_Stop()；          产生I2C 总线的停止状态
⑼ void idle()；            将I2C总线置于空闲状态，即将时钟线和数据线都拉高
⑽ bit I2C_Puts(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,char *dat,unsigned int Size)； I2C 总线综合发送函数，向从机发送多个字节的数据
⑾ bit I2C_Gets(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,char *dat,unsigned int Size)；I2C 总线综合接收函数，从从机接收多个字节的数据
⑿ char gets2(unsigned char subaddr)；
（2）ZLG7290函数库
首先要包含另一个库ZLG7290B.h，里面定义了ZLG7290的各个寄存器地址和它本身的地址。而zlg7290.h包含的函数如下：
⑴  bit ZLG7290_WriteReg(unsigned char RegAddr, char dat)   向ZLG7290 的某个内部寄存器写入数据
⑵ unsigned char ZLG7290_ReadReg(unsigned char regaddr)    从ZLG7290 的某个内部寄存器读出数据
⑶ bit ZLG7290_cmd(char cmd0, char cmd1)     向ZLG7290 发送控制命令
⑷ bit ZLG7290_SegOnOff(char seg, bit b)     段寻址，单独点亮或熄灭数码管（或LED）中的某一段
⑸ bit ZLG7290_Download(char addr, bit dp, bit flash, char dat) 下载数据并译码
说明：⑴，⑵，⑶，⑷，⑸中的函数都有返回值，0表示正常返回，1表示访问ZLG7290 时出现异常。
（3）主函数ZLG7290B.c;
void INT0_SVC() interrupt 0   中断服务函数
void Delay1(unsigned int t)   延时函数
void SystemInit()     系统初始化函数，用于初始化定时器和让ZLG7290复位
void ClearAll()    清除所有数码管显示函数
void Test_DispBuf()  测试直接写显存函数，
void Test_Download()   测试下载数据函数
void Test_ScanNum()   测试扫描不同数码管函数
void Test_Flash()   测试闪烁功能函数
void Test_SegOnOff()  测试段寻址函数，用于将数码管分段点亮
void DispValue(char x, unsigned char dat)  以十进制显示数据函数
void DispHexValue(char x, unsigned char dat)  以十六进制显示数据函数
void Test_Key()  测试按键函数，自动读出键值并且在数码管上显示