zlg7289
- 格式:doc
- 大小:49.00 KB
- 文档页数:6
ZLG7289键盘矩阵使用示例一、使用ZLG7289时容易出现的问题和注意事项1、数码管出现闪烁现象正常工作的ZLG7289驱动数码管显示应处于一个很稳定的状态,数码管被点亮后不会出现闪烁和跳动的现象。
出现闪烁的很大原因是在选定ZLG7289(即将片选信号/CS置为低电平)后长时间没有释放,导致7289中断扫描的时间太长,从而肉眼看到数码管出现闪烁和不稳定的现象;正确的使用方法是在CS置为低电平后减少不必要的延时,使ZLG7289被中断扫描的时间降到最低而不至于影响显示。
2、扫描按键返回值为0向ZLG7289写入0x15指令会读出当前的按键代码,其范围是0~3F,在没有键按下的情况下返回0xFF。
如果在使用过程中无论按键按下与否都返回0,则很可能是在写完命令或数据后对DIO做了写入0的操作,导致ZLG7289在按键按下后总是读出0。
3、两个键同时按下如果在本套实验板上有两个以上的键同时按下,ZLG7289将只能给出其中的一个键的代码;4、没有键按下的情况下检测到KEY端为低电平根据ZLG7289的数据手册可知,KEY端口在通常情况下为高电平,只有在有键按下的情况下才跳变为低电平。
若没有键按下KEY却为低电平,这种错误很可能是键盘电路的下拉电阻没有按要求接好。
如果不使用键盘,下拉电阻和数码管的位选电阻都可以省略;如果使用了键盘,下拉电阻、位选电阻和串入DP及SA-SG连线的8只电阻均不能省略;5、上电后ZLG7289不工作,数码管和按键都无反应检查此类错误情况需要从两方面入手:硬件上,检查电源供电是否正常、晶振是否起振、电路接线是否良好可靠;软件上,检查程序上触发ZLG7289的时序是否正确,片选是否选通、程序中是否有必要的延时。
二、ZLG7289典型应用图如图1所示为ZLG7289的测试实验板(Demo板),ZLG7289连接共阴极数码管。
图1 ZLG7289的典型应用图用户在设计ZLG7289的电路时,可参照图1做如下改进:1) 在电源处接一电阻串联一个发光二极管,电阻的取值为1K左右,当上电后二极管被点亮说明电源部分正常工作,否则电源供电失败,方便检查电源是否正常供电。
万年历数字钟及可调时钟系统一、引言万年历数字钟是一种用万年历时钟芯片实现年、月、日、时、分、秒计时,并通过单片机处理后送给显示芯片显示的装置,与机械式时钟相比具有更高的准确性和直观性,且具有更长的使用寿命。
本系统还可以扩展为可调的自动开关,对家电对用电设备进行控制,笔者在随后改制成为可调时的自动断电的供电系统.二、原理图设计1.单片机及其外围电路设计复位采用X25045芯片,复位电路如图1所示。
图1 复位电路设计单片机采用贴片封装的AT89S51,晶振为11.0592MHz。
其中P1.5~P1.7为下载程序使用,电路如图2所示。
图2 单片机89S51外围电路设计2.时钟芯片电路设计时钟芯片采用PCF8563,晶振采用32.768K,电容使用15pf。
PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片。
内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C 总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。
同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。
电路如图3所示。
图3 时钟芯片电路设计3.显示芯片电路设计显示芯片采用ZLG7289,晶振为12MHz。
ZLG7289A 是广州周立功单片机发展有限公司自行设计的,具有SPI 串行接口功能的可同时驱动8 位共阴式数码管(或64 只独立LED )的智能显示驱动芯片,该芯片同时还可连接多达64 键的键盘矩阵,单片即可完成LED 显示﹑键盘接口的全部功能。
电路如图4所示。
图4 显示芯片电路设计4.双电源电路设计系统采用双电源,平时使用V1=10V的外接电源,停电时使用电池,由V2输入。
电池有6节,其电压为9V。
当电池电压低于6V时,LED亮,说明电池电量不足。
电路如图5所示。
图5 双电源电路设计三、程序设计程序开始时先对系统初始化,并设置好各种中断。
下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数。
目录第1章概述 (1)1.1 ZLG7289B的主要特性 (1)1.2 描述 (1)1.3 引脚图 (1)第2章引脚功能说明 (2)第3章典型应用电路图 (3)3.1 电路原理图 (3)3.2 电路简析 (3)第4章SPI串行接口 (4)4.1 SPI串行接口信号 (4)4.2 SPI总线时序图 (4)4.3 时序图中的各项延迟时间 (4)第5章控制指令详解 (6)5.1 单字节纯指令 (6)5.1.1 复位(清除)指令 (6)5.1.2 测试指令 (6)5.1.3 左移指令 (6)5.1.4 右移指令 (6)5.1.5 循环左移指令 (6)5.1.6 循环右移指令 (7)5.2 双字节带数据指令 (7)5.2.1 下载数据并且按方式0进行译码 (7)5.2.2 下载数据并且按方式1进行译码 (7)5.2.3 下载数据但不译码 (8)5.2.4 闪烁控制 (8)5.2.5 消隐控制 (8)5.2.6 段点亮指令 (9)5.2.7 段关闭指令 (9)5.2.8 读键盘数据指令 (9)第6章实际应用中要注意的若干问题 (10)6.1 ZLG7289B要跟着控制面板走 (10)6.2 复位引脚可以由主控制器直接控制 (10)6.3 驱动1英寸以上的大数码管时,要另外加驱动电路 (10)6.4 键盘的使用注意事项 (10)6.5 降低晶振频率 (11)第7章特殊应用 (12)7.1 只使用键盘 (12)7.2 只使用数码管 (12)7.3 驱动大型数码管的方法 (13)第8章C51驱动程序软件包 (16)8.1 软件包说明 (16)8.2 头文件的程序清单 (16)8.3 C语言文件的程序清单 (18)第9章C51演示程序 (24)9.1 演示程序说明 (24)9.2 演示程序1 (24)9.3 演示程序2 (28)第10章参考文献 (34)第1章 概述1.1 ZLG7289B的主要特性很宽的工作电压范围:+2.7~6V;直接驱动8位共阴式数码管(1英寸以下)或64只独立的LED;能够管理多达64只按键,自动消除抖动;段电流可达15mA以上,字电流可达100mA;利用功率电路可以方便地驱动1英寸以上的大型数码管;具有左移、右移、闪烁、消隐、段点亮等强大功能;要显示的数据提供有两种不同的译码方式(也可以选择不译码);不接数码管而仅使用键盘管理功能时,工作电流可降至3mA;与微控制器之间采用SPI串行总线接口,操作方便,占用I/O资源少;工作温度范围:-40~+85℃;封装:SOP-28,DIP-28。
程序名称:数码管显示与键盘管理芯片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_。