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

📄 zlg7289.c

📁 一个用到ZLG7289的实际项目
💻 C
字号:
/* 
 ZLG7289.c 
  数码管显示与键盘管理芯片ZLG7289的标准80C51驱动程序(C51) 
  Copyright (c) 2005,广州周立功单片机发展有限公司 
  All rights reserved. 
  本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的  
*/ 
#include "ZLG7289.h" 
 
 
//定义一个全局变量,用于延时 
//该变量在调用函数ZLG7289_Init()时被初始化 
unsigned char ZLG7289_Delay_t; 

/* 
宏定义:ZLG7289_ShortDelay() 
功能:短延时 
说明:延时(ZLG7289_Delay_t*2+2)个机器周期 
*/ 
#define ZLG7289_ShortDelay()\
{\
  	unsigned char t = ZLG7289_Delay_t;\
  	while (--t != 0);\
} 
 
/* 
宏定义:ZLG7289_LongDelay() 
功能:长延时 
说明:延时(ZLG7289_Delay_t*12+8)个机器周期 
*/ 
#define ZLG7289_LongDelay() \
{\
  	unsigned char t = ZLG7289_Delay_t * 6;\
  	while ( --t != 0 );\
} 
 
 
/* 
函数:ZLG7289_SPI_Write() 
功能:向SPI总线写入1个字节的数据 
参数: 
 dat:要写入的数据 
*/ 
void ZLG7289_SPI_Write(char dat) reentrant 
{ 
	 unsigned char t = 8; 
	 do 
	 { 
		  ZLG7289_pinDIO = (bit)(dat & 0x80); 
		  dat <<= 1; 
		  ZLG7289_pinCLK = 1; 
		  ZLG7289_ShortDelay(); 
		  ZLG7289_pinCLK = 0; 
		  ZLG7289_ShortDelay(); 
	 } while ( --t != 0 ); 
} 
 
 
/* 
函数:ZLG7289_SPI_Read() 
功能:从SPI总线读 1个字节的数据 
返回: 
*/ 
char ZLG7289_SPI_Read() reentrant 
{ 
	char dat; 
	unsigned char t = 8; 
	ZLG7289_pinDIO = 1;    //读 DIO引脚要置1以切换到输入状态 
	do 
	{ 
		ZLG7289_pinCLK = 1; 
		ZLG7289_ShortDelay(); 
		dat <<= 1; 
		if ( ZLG7289_pinDIO ) dat++; 
		ZLG7289_pinCLK = 0; 
		ZLG7289_ShortDelay(); 
	} while ( --t != 0 ); 
	return dat; 
} 
 
/* 
函数:ZLG7289_cmd() 
功能:执行ZLG7289纯指令 
参数: 
 cmd:命令字 
*/ 
void ZLG7289_cmd(char cmd) 
{ 
	char sav = IE; 
	IE &= 0xFA;    //关闭外部中断 
	ZLG7289_pinCS = 0; 
	ZLG7289_LongDelay(); 
	ZLG7289_SPI_Write(cmd); 
	ZLG7289_pinCS = 1; 
	ZLG7289_LongDelay(); 
	IE = sav;    //恢复IE 
} 

/* 
函数:ZLG7289_cmd_dat() 
功能:执行ZLG7289带数据指令 
参数: 
 cmd:命令字 
 dat:数据 
*/ 
void ZLG7289_cmd_dat(char cmd, char dat) 
{ 
	char sav = IE; 
	IE &= 0xFA;    //关闭外部中断 
	ZLG7289_pinCS = 0; 
	ZLG7289_LongDelay(); 
	ZLG7289_SPI_Write(cmd); 
	ZLG7289_LongDelay(); 
	ZLG7289_SPI_Write(dat); 
	ZLG7289_pinCS = 1; 
	ZLG7289_LongDelay(); 
	IE = sav;    //恢复IE 
} 

/* 
函数:ZLG7289_Download() 
功能:下载数据 
参数: 
 mod=0:下载数据且按方式0译码 
 mod=1:下载数据且按方式1译码 
 mod=2:下载数据但不译码 
 x:数码管编号(横坐标),取值0 7 
 dp=0:小数点不亮 
 dp=1:小数点亮 
 dat:要显示的数据 
说明: 
  译码方式的具体含义请参考数据手册 
*/ 
void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat) 
{ 
	code char ModDat[3] = {0x80,0xC8,0x90}; 
	char d1; 
	char d2; 
	if ( mod > 2 ) mod = 2; 
	d1 = ModDat[mod]; 
	x &= 0x07; 
	d1 |= x; 
	d2 = dat & 0x7F; 
	if ( dp ) d2 |= 0x80; 
	ZLG7289_cmd_dat(d1,d2); 
} 
 
/* 
功能:执行ZLG7289键盘命令 
返回: 
  返回读 0 63 
  如果返回0xFF则表示没有键按下 
*/ 
char ZLG7289_Key() reentrant 
{ 
	char key; 
	ZLG7289_pinCS = 0; 
	ZLG7289_LongDelay(); 
	ZLG7289_SPI_Write(0x15); 
	ZLG7289_LongDelay(); 
	key = ZLG7289_SPI_Read(); 
	ZLG7289_pinCS = 1; 
	ZLG7289_LongDelay(); 
	return key; 
} 

/* 
函数:ZLG7289_Init() 
功能:ZLG7289初始化 
参数: 
 t:SPI总线的延时值设置,取值1-40(超出范围可能导致错误) 
说明: 
 t的取值可以参照以下公式:t >= 5 * f1 / f2,其中f1表示80C51的 
  晶振频率,f2表示ZLG7289的晶振频率 
*/ 
void ZLG7289_Init(unsigned char t) 
{ 
	unsigned char x; 
	//I/O口初始化 
	ZLG7289_pinCS = 1; 
	ZLG7289_pinCLK = 0; 
	ZLG7289_pinDIO = 1; 
	ZLG7289_pinINT = 1; 
	//延时初始化 
	ZLG7289_Delay_t = t; 
	//点亮所有数码管 
	for ( x=0; x<8; x++ ) 
	{ 
		ZLG7289_Download(1,x,1,0x08); 
	} 
} 
/* 
函数:Delay() 
功能:延时0.01 655.36s 
参数: 
 t>0时,延时(t*0.01)s 
 t=0时,延时655.36s 
说明: 
  晶振采用11.0592MHz 
*/ 

//*********************************************
void Delay(unsigned int t) 
{ 
  do 
 { 
  TH0 = 0xDC; 
  TL0 = 0x00; 
  TR0 = 1; 
   while ( !TF0 ); 
  TF0 = 0; 
  TR0 = 0; 
 } while (--t); 
}

⌨️ 快捷键说明

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