#include <reg51.h>
#include"zlg7289.h"
//函数:ZLG7289_Delay()
//功能:短延时
//说明:延时长度由Delay_T决定
void ZLG7289_Delay(uchar Delay_T)
{
uchar i;
for(i=0;i<Delay_T;i++);
}
//函数:SPI_WriteOneByte()
//功能:向SPI总线写数据
//说明:写入的数据长度为1字节
void SPI_WriteOneByte(uchar Wdata)
{
uchar i;
for(i=0;i<8;i++)
{
ZLG7289_DIO = (bit)(Wdata&0x80);//高位先移出
ZLG7289_CLK = 1;
Wdata <<= 1;
ZLG7289_Delay(1);
ZLG7289_CLK = 0;
ZLG7289_Delay(1);
}
}
//函数:SPI_ReadOneByte()
//功能:从SPI总线读数据
//说明:返回1字节数据
uchar SPI_ReadOneByte()
{
uchar i,temp;
ZLG7289_DIO = 1; //将I/O切换到输入状态
for(i=0;i<8;i++)
{
ZLG7289_CLK = 1;
ZLG7289_Delay(5);
temp <<= 1;
if(ZLG7289_DIO)
temp++;
ZLG7289_CLK = 0;
ZLG7289_Delay(5);
}
return temp; //返回所读得的数据
}
//函数:ZLG7289_Instruc()
//功能:执行ZLG7289纯指令
//说明:指令长度为1字节
void ZLG7289_Instruc(uchar Instruc) //Instruc为指令
{
uchar i;
i = IE;
IE &= 0xfa; // Disable external interrupt;
ZLG7289_CS = 0;
ZLG7289_Delay(5);
SPI_WriteOneByte(Instruc);
ZLG7289_CS = 1;
ZLG7289_Delay(5);
IE = i;
}
//函数:ZLG7289_Instruc_Data
//功能:执行ZLG7289带数据指令
//说明:指令长度以及数据长度均为1字节
void ZLG7289_Instruc_Data(uchar Instruc,uchar Data)//Instruc为指令,Data为数据
{
uchar i;
i = IE;
IE &= 0xfa;
ZLG7289_CS = 0;
ZLG7289_Delay(5);
SPI_WriteOneByte(Instruc);
ZLG7289_Delay(5);
SPI_WriteOneByte(Data);
ZLG7289_CS = 1;
ZLG7289_Delay(5);
IE = i;
}
//函数:ZLG7289_ReadKey()
//功能:执行ZLG7289读键盘指令
//说明:返回1字节的按键号
// 按键号的范围为:0 ~ 63(即0x0 ~ 0x3f)
// 若没有按按键被按下了,返回255(即0xff)
uchar ZLG7289_ReadKey()
{
uchar Key;
ZLG7289_CS = 0;
ZLG7289_Delay(10);
SPI_WriteOneByte(0x15);
ZLG7289_Delay(5);
Key = SPI_ReadOneByte();
ZLG7289_Delay(1);
ZLG7289_CS = 1;
ZLG7289_Delay(5);
return Key; // Key为返回的按键号
}
//函数:ZLG7289_Init()
//功能:初始化ZLG7289
//说明:主要是对I/O进行初始化
void ZLG7289_Init()
{
ZLG7289_CS = 1;
ZLG7289_CLK = 0;
ZLG7289_DIO = 1;
ZLG7289_INT = 1;
}
//函数:ZLG7289_Reset()
//功能:ZLG7289复位指令
#define ZLG7289_Reset() ZLG7289_Instruc(0xa4)
//函数:ZLG7289_Test()
//功能:ZLG7289测试指令
#define ZLG7289_Test() ZLG7289_Instruc(0xbf)
//函数:ZLG7289_SHL()
//功能:ZLG7289左移指令
#define ZLG7289_SHL() ZLG7289_Instruc(0xa0)
//函数:ZLG7289_SHR()
//功能:ZLG7289右移指令
#define ZLG7289_SHR() ZLG7289_Instruc(0xa1)
//函数:ZLG7289_ROL()
//功能:ZLG7289循环左移指令
#define ZLG7289_ROL() ZLG7289_Instruc(0xa2)
//函数:ZLG7289_ROR()
//功能:ZLG7289循环右移指令
#define ZLG7289_ROR() ZLG7289_Instruc(0xa3)
//函数:ZLG7289_Down_Data()
//功能:ZLG7289下载数据
//说明:形参Decode_mod:模式选择(取值范围:1 ~ 3):1--模式0译码;2--模式1译码;3--不译码
// Disp_addr: 数码管显示数据的位地址(取值范围:0 ~ 7)
// Disp_dp: 小数点控制:0--小数点被点亮,1--小数点被熄灭
// Disp_data: 显示的数据
void ZLG7289_Down_Data(uchar Decode_mod,uchar Disp_addr,bit Disp_dp,uchar Disp_data)
{
uchar Mode[] = {0x80,0xc8,0x90};
uchar temp,temp1;
if(Decode_mod==0x01)
temp = Mode[0];
else if(Decode_mod==0x02)
temp = Mode[1];
else if(Decode_mod==0x03)
temp = Mode[2];
if(Disp_dp==1)
temp1 = 0x80;
else
temp1 = 0x00;
Disp_addr=((0x07-Disp_addr)&0x07);
ZLG7289_Instruc_Data((temp | Disp_addr),(temp1 | (Disp_data&0x7f)));
}
//函数:ZLG7289_Glint
//功能:ZLG7289闪烁控制
//说明:形参temp为8bits数据,
// 从temp的最高位置(MSB)到最低位(LSB)分别代表数码管的第7到第0位
// 0--闪烁,1--不闪烁
#define ZLG7289_Glint(temp) ZLG7289_Instruc_Data(0x88,(temp))
//函数:ZLG7289_Hide
//功能:ZLG7289消隐控制
//说明:形参temp为8bits数据,
// 从temp的最高位置(MSB)到最低位(LSB)分别代表数码管的第0到第7位
// 0--消隐,1--显示;复位后所有位都不消隐
#define ZLG7289_Hide(temp) ZLG7289_Instruc_Data(0x98,(temp))
//函数:ZLG7289_Seg_On
//功能:ZLG7289段点亮指令
//说明:形参seg的最高位置(MSB)到最低位(LSB)的格式为“XXd5d4d3d2d1d0”
// 其中“XX”为无关位,d5d4d3d2d1d0为6位段地址。
// 点亮顺序为g、f、e、d、c、b、a、dp
#define ZLG7289_Seg_On(seg) ZLG7289_Instruc_Data(0xe0,(seg))
//函数:ZLG7289_Seg_Off
//功能:ZLG7289段关闭指令
//说明:形参seg的最高位置(MSB)到最低位(LSB)的格式为“XXd5d4d3d2d1d0”
// 其中“XX”为无关位,d5d4d3d2d1d0为6位段地址。
// 关闭顺序为g、f、e、d、c、b、a、dp
#define ZLG7289_Seg_Off(seg) ZLG7289_Instruc_Data(0xc0,(seg))