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

📄 zlg7289.c

📁 程序名称: 数码管显示与键盘管理芯片ZLG7289的标准驱动程序(C51) 文件名: ZLG7289.h ZLG7289.C 说明: 本程序已经调试通过 程序的可移植性很好
💻 C
字号:
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************		 
* File Name          : ZLG7289.c
* Author             : 蔡新岗
* Version            : V1.0
* Date               : 06/20/2008
* Description        : ZLG7289显示,按键程序
*******************************************************************************/
#include "ZLG7289.h"
#include "stm32f10x_lib.h"

//定义一个全局变量,用于延时
//该变量在调用函数ZLG7289_Init()时被初始化
unsigned char ZLG7289_Delay_t;

/* Private typedef -----------------------------------------------------------*/
#define WORD unsigned short
#define BYTE unsigned char

#define ZLG7289CS(x)          GPIOA->ODR=(GPIOA->ODR&~GPIO_Pin_11)  	    | (x ? GPIO_Pin_11 : 0)
#define ZLG7289CLK(x)         GPIOC->ODR=(GPIOC->ODR&~GPIO_Pin_9 )  	    | (x ? GPIO_Pin_9  : 0)
#define ZLG7289DAT(x)         GPIOC->ODR=(GPIOC->ODR&~GPIO_Pin_6 )  	    | (x ? GPIO_Pin_6  : 0)
#define ZLG7289KEY(x)         GPIOA->ODR=(GPIOA->ODR&~GPIO_Pin_9 )  	    | (x ? GPIO_Pin_9  : 0)																	
/************************************************
函数:ZLG7289_Delay_1us()
功能:短延时
说明:延时1us程序
************************************************/
void ZLG7289_Delay_1us(WORD x)
{	
	x += x;
	while(x--);
}

/************************************************
函数:ZLG7289_Delay_1ms()
功能:长延时
说明:延时(ZLG7289_Delay_t*12+2)个机器周期
************************************************/
void ZLG7289_Delay_1ms(WORD x)
{
	while(x--)
	{
	  ZLG7289_Delay_1us(800);
	}
}
/************************************************
函数:ZLG7289_SPI_Write()
功能:向SPI 总线写入1 个字节的数据
参数:
     dat:要写入的数据
************************************************/
void ZLG7289_SPI_Write(char dat)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
	BYTE i;
    
    //PC.6,配置为推拉输出
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	ZLG7289_Delay_1us(200);
	
    for(i=0;i<8;i++)
	{
	  if (( dat & 0x80) != 0)       //send the high bit first,must has the ()!!!
	   
	       ZLG7289DAT(1);
      else
 	  
	       ZLG7289DAT(0);

	  dat=dat<<1;
		
	  ZLG7289_Delay_1us(50);		
	  
	  ZLG7289CLK(1);
	  ZLG7289_Delay_1us(50);
	  ZLG7289CLK(0);
	  ZLG7289_Delay_1us(50);
	}

	  ZLG7289_Delay_1us(100);

}
/************************************************
函数:ZLG7289_SPI_Read()
功能:从SPI 总线读取1 个字节的数据
返回:
读取到的数据:DAT
************************************************/
char ZLG7289_SPI_Read()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    unsigned char t;
    char DAT=0;
    t = 8;
    //PC.6,配置为浮点输入
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	do
	{
	    ZLG7289CLK(1);
	    ZLG7289_Delay_1us(50);
	    DAT<<=1;  
	    if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)) DAT++;
	    ZLG7289CLK(0);
	    ZLG7289_Delay_1us(50);

	} while ( --t != 0 );
	
	return DAT;
}
/************************************************
函数:ZLG7289_cmd()
功能:执行ZLG7289 纯指令
参数:
cmd:命令字
************************************************/

void ZLG7289_cmd(char cmd)
{
 	ZLG7289CS(0);
	ZLG7289_Delay_1us(200);
	ZLG7289_SPI_Write(cmd);
	ZLG7289CS(1);
	ZLG7289_Delay_1us(50);

}
/************************************************
函数:ZLG7289_cmd_dat()
功能:执行ZLG7289 带数据指令
参数:
cmd:命令字
dat:数据
************************************************/
void ZLG7289_cmd_dat(char cmd, char dat)
{
	ZLG7289CS(0);
	ZLG7289_Delay_1us(200);
	ZLG7289_SPI_Write(cmd);
	ZLG7289_Delay_1us(80);
	ZLG7289_SPI_Write(dat);
	ZLG7289CS(1);
	ZLG7289_Delay_1us(50);
}
/************************************************
函数: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, int dp, char dat)
{
unsigned 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 则表示没有键按下
************************************************/
unsigned char ZLG7289_Key(void)
{
   unsigned char key;
   
   ZLG7289CS(0);
   ZLG7289_Delay_1us(200);
   ZLG7289_SPI_Write(0x15);
   ZLG7289_Delay_1us(100);
   key=ZLG7289_SPI_Read();
   ZLG7289CS(1);
   ZLG7289_Delay_1us(50);

   return key;
}
/******************************************************************************
函数:ZLG7289_Init()
功能:ZLG7289 初始化
参数:

t:SPI 总线的延时值设置,取值1-40(超出范围可能导致错误)
说明:
t的取值可以参照以下公式:t >= 5 * f1 / f2,其中f1 表示CPU的
晶振频率,f2 表示ZLG7289 的晶振频率
*********************************************************************************/
void ZLG7289_Init(unsigned char t)
{
	unsigned char x;
	//I/O口的初始化
	ZLG7289CS(1);
	ZLG7289CLK(0);
	ZLG7289DAT(1);
	ZLG7289KEY(1);
	///延时时间初始化
	ZLG7289_Delay_t=t;
	//自检程序,点亮所有的数码管
	ZLG7289_Delay_1ms(20);
	for ( x=0; x<8; x++ )
	{
	ZLG7289_Download(1,x,1,8);
	}
}
/******************* (C) COPYRIGHT 2008 SHU *****END OF FILE****/

⌨️ 快捷键说明

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