⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlg7289.h

📁 周立功7289在cortex stm32上的一直
💻 H
字号:
/*
程序名称:
	数码管显示与键盘管理芯片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 <reg52.h>
#include <intrins.h>


//定义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~7
	dp=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)	ZLG7289_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_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -