程序名称:数码管显示与键盘管理芯片ZLG7289的标准80C51驱动程序(C51)文件名:ZLG7289.h作者:广州周立功单片机发展有限公司王大星,2005年6月说明:本程序已经调试通过程序的可移植性很好,仅做少量修改就可以直接包含使用程序占用资源少,仅使用4根必须I/O口线,不占用定时器等其它资源所有全局性的标识符都以ZLG7289_开头,不必担心命名冲突问题程序结构清晰,思路明确,结合ZLG7289的数据手册很容易理解用法:1、重新定义I/O接口2、如果CPU的主频比较高,则要适当调整延时,详见ZLG7289_Delay()函数3、在用户程序中包含本头文件4、在main()函数的开始处添加初始化函数ZLG7289_Init()5、以后在程序中可以直接使用ZLG7289的用户指令集6、读取键盘扫描码使用函数ZLG7289_Key(),查询方式、中断方式皆可用户指令集汇总:复位指令:void ZLG7289_Reset();测试指令:void ZLG7289_Test();左移指令:void ZLG7289_SHL();右移指令:void ZLG7289_SHR();循环左移:void ZLG7289_ROL();循环右移:void ZLG7289_ROR();下载数据:void ZLG7289_Download(char mod,char addr,bit dp,char dat);闪烁控制:void ZLG7289_Flash(char dat);消隐控制:void ZLG7289_Hide(char dat);段点亮控制:void ZLG7289_SegOn(char dat);段关闭控制:void ZLG7289_SegOff(char dat);读键盘数据指令:char ZLG7289_Key();*/#ifndef _ZLG7289_H_#define _ZLG7289_H_#include#include//定义I/O接口sbit ZLG7289_pinCS = P1^0; //片选信号,低电平有效sbit ZLG7289_pinCLK = P1^1; //时钟信号:上升沿有效sbit ZLG7289_pinDIO = P1^2; //数据信号:双向sbit ZLG7289_pinKEY = P3^2; //键盘中断请求信号,低电平有效/*功能:专用的延时函数,延时几微秒到几百微秒参数:t:决定延时长短说明:本程序在12MHz主频的标准80C51上调试通过。
如果实际的CPU速度较快,则要适当增加_nop_()语句的个数; */static void ZLG7289_Delay(unsigned char t) reentrant{do{_nop_();}while ( --t );}/*功能:通过SPI总线写一个字节参数:dat:要发送的数据*/static void ZLG7289_SPI_Write(char dat) reentrant{unsigned char t;t = 8;do{ZLG7289_pinDIO = (bit)(dat & 0x80);dat <<= 1;ZLG7289_pinCLK = 1;ZLG7289_Delay(8);ZLG7289_pinCLK = 0;ZLG7289_Delay(6);} while ( --t );}/*功能:通过SPI总线读一个字节*/static char ZLG7289_SPI_Read() reentrant{char dat;unsigned char t;ZLG7289_pinDIO = 1;t = 8;do{ZLG7289_pinCLK = 1;ZLG7289_Delay(8);dat <<= 1;if ( ZLG7289_pinDIO ) dat++;ZLG7289_pinCLK = 0;ZLG7289_Delay(7);} while ( --t );return dat;}/*功能:执行ZLG7289纯指令参数:cmd:命令字*/static void ZLG7289_cmd(char cmd){ZLG7289_pinCS = 0;ZLG7289_Delay(50);ZLG7289_SPI_Write(cmd);ZLG7289_pinCS = 1;ZLG7289_Delay(10);}/*功能:执行ZLG7289带数据指令参数:cmd:命令字dat:数据*/static void ZLG7289_cmd_dat(char cmd, char dat) {ZLG7289_pinCS = 0;ZLG7289_Delay(50);ZLG7289_SPI_Write(cmd);ZLG7289_Delay(25);ZLG7289_SPI_Write(dat);ZLG7289_pinCS = 1;ZLG7289_Delay(10);}//以下定义ZLG7289的用户指令集//复位(清除)指令#define ZLG7289_Reset() ZLG7289_cmd(0xA4)//测试指令#define ZLG7289_Test() ZLG7289_cmd(0xBF)//左移指令#define ZLG7289_SHL() ZLG7289_cmd(0xA1)//右移指令#define ZLG7289_SHR() ZLG7289_cmd(0xA0)//循环左移指令#define ZLG7289_ROL() ZLG7289_cmd(0xA3)//循环右移指令#define ZLG7289_ROR() ZLG7289_cmd(0xA2)/*功能:下载数据参数:mod=0:下载数据且按方式0译码mod=1:下载数据且按方式1译码mod=2:下载数据但不译码addr:数码管地址位,取值0~7dp=0:小数点不亮dp=1:小数点亮dat:要显示的数据,取值0~15,详见数据手册*/extern void ZLG7289_Download(char mod, char addr, bit dp, char dat) {code char ModDat[3] = {0x80,0xC8,0x90};char d1;char d2;if ( ( mod < 0 ) || ( mod > 2 ) ) mod = 2;d1 = ModDat[mod];addr &= 0x07;d1 |= addr;d2 = dat & 0x7F;if ( dp ) d2 |= 0x80;ZLG7289_cmd_dat(d1,d2);}//闪烁控制#define ZLG7289_Flash(dat) ZLG7289_cmd_dat(0x88,dat)//消隐控制#define ZLG7289_Hide(dat) Z LG7289_cmd_dat(0x98,dat)//段点亮指令#define ZLG7289_SegOn(dat) ZLG7289_cmd_dat(0xE0,dat)//段关闭指令#define ZLG7289_SegOff(dat) ZLG7289_cmd_dat(0xC0,dat)/*功能:执行ZLG7289键盘命令返回值:返回读到的按键值说明:本函数已经被定义成再入属性,因此在中断服务程序里也可以调用当有键按下时,ZLG7289的KEY引脚将出现低电平,向主机提出中断申请主机采用查询方式或中断方式去处理都是可以的应当在KEY引脚出现低电平时立即用本函数去读取键值读取键值后,KEY引脚不会自动恢复为高电平,一定要等到按键抬起为止如果没有及时读取按键值,当按键抬起时,KEY引脚也将恢复高电平在ZLG7289的KEY引脚处于高电平期间,试图去读取键值将得不到有意义的数据如果采用中断方式,建议选择负边沿触发模式*/extern char ZLG7289_Key() reentrant{char key;ZLG7289_pinCS = 0;ZLG7289_Delay(50);ZLG7289_SPI_Write(0x15);ZLG7289_Delay(25);key = ZLG7289_SPI_Read();ZLG7289_pinCS = 1;ZLG7289_Delay(10);return key;}/*功能:ZLG7289初始化*/extern void ZLG7289_Init(){unsigned char addr;//I/O口初始化ZLG7289_pinCS = 1;ZLG7289_pinCLK = 0;ZLG7289_pinDIO = 1;ZLG7289_pinKEY = 1;//点亮所有数码管for ( addr=0; addr<8; addr++ ){ZLG7289_Download(1,addr,1,8);}}#endif //_ZLG7289_H_。