/*
ZLG7289U.c
数码管显示与键盘管理芯片ZLG7289的NUC1XX驱动程序。
2011年9月21日
*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "ZLG7289U.h"
/*
函数:ZLG7289_SPI_Write()
功能:向SPI总线写入1个字节的数据。
参数:dat:要写入的数据
*/
void ZLG7289_SPI_Write(uint8_t dat)
{
uint8_t i;
for (i=0;i<8;i++)
{
if (dat&0x80)
{
SET_DIO ;
}
else
{
CLR_DIO;
}
SET_CLK;
DrvSYS_Delay(50);
CLR_CLK;
DrvSYS_Delay(50);
dat=dat<<=1;
}
}
/*
函数:ZLG7289_SPI_Read()
功能:从SPI总线读取1个字节的数据。
返回值:dat:读取到的数据。
*/
char ZLG7289_SPI_Read()
{
char dat;
uint8_t t=8;
SET_DIO;
do
{
SET_CLK;
DrvSYS_Delay(50);
dat<<=1;
INPUT_DIO;
if(GETBIT_DIO)dat++;
CLR_CLK;
DrvSYS_Delay(50);
}
while(--t!=0);
QUA_DIO;
return (dat);
}
/*
函数:ZLG7289_cmd()
功能:执行ZLG7289纯指令。
参数:cmd:命令字。
*/
void ZLG7289_cmd(uint8_t cmd)
{
CLR_CS;
DrvSYS_Delay(180);
ZLG7289_SPI_Write(cmd);
SET_CS;
DrvSYS_Delay(180);
}
/*
函数:ZLG7289_cmd_dat()
功能:执行ZLG7289带数据指令。
参数:cmd:命令字,dat:数据。
*/
void ZLG7289_cmd_dat(uint8_t cmd,uint8_t dat)
{
CLR_CS;
DrvSYS_Delay(180);
ZLG7289_SPI_Write(cmd);
DrvSYS_Delay(180);
ZLG7289_SPI_Write(dat);
SET_CS;
DrvSYS_Delay(180);
}
/*
函数:ZLG7289_Download()
功能:在指定位显示指定段码
参数:
x:数码管编号(横坐标),取值0~7
mod=0:下载数据且按方式0 译码
mod=1:下载数据且按方式1 译码
mod=2:下载数据但不译码
d:要显示的数据
dp=0:小数点不亮
dp=1:小数点亮
*/
void ZLG7289_Download(uint8_t mod,uint8_t x,uint8_t dp,uint8_t dat)
{
uint8_t ModDat[3] = {0x80,0xC8,0x90};
uint8_t d1;
uint8_t 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);
}
/*
函数:char ZLG7289_Key()
功能:执行ZLG7289键盘命令
返回值:返回读到的键盘值:0~63。
*/
char ZLG7289_Key()
{
char key;
CLR_CS;
DrvSYS_Delay(180);
ZLG7289_SPI_Write(0x15);
DrvSYS_Delay(180);
key=ZLG7289_SPI_Read();
SET_CS;
DrvSYS_Delay(180);
return key;
}
/*
函数:ZLG7289_Init()
功能:ZLG7289初始化。
*/
void ZLG7289_Init(void)
{
uint8_t x;
FMQ_OUT;
OUT_CS;
QUA_DIO;
QUA_KEY;
OUT_CLK;
FMQ_SET;
SET_CS;
CLR_CLK;
SET_DIO;
SET_KEY;
for(x=0;x<8;x++)
{
ZLG7289_Download(1,x,1,8);
}
} |