📄 zlg7289.c
字号:
/*
ZLG7289Demo2.c
ZLG7289 演示程序
说明:
采用中断方式读取按键值
*/
#include "ZLG7289.h"
//定义全局变量Key,用来保存按键值
unsigned char Key = 0xFF; //0xFF 表示未按键的状态
//定义全局变量Keysetflag,指示进入设置状态;
unsigned char Keysetflag=0; //1:进入设置状态;
//定义全局变量KeyCounter,指示角度计数值(输出的二进制数值);
unsigned char AngleCounter=0; //在 Keysetflag=1 后,“+ ”“—” 键改变他的值;
//定义全局变量,该变量在调用函数ZLG7289_Init()时被初始化
unsigned char data ZLG7289_Delay_t;
/************************************************************
**函数:ZLG7289_ShortDelay()
**功能:短延时
**说明:延时(t*2+2)个机器周期
************************************************************/
void ZLG7289_ShortDelay()
{
unsigned char t = ZLG7289_Delay_t;
while ( --t != 0 );
}
/************************************************************
**函数:ZLG7289_LongDelay()
**功能:长延时
**说明:延时(t*12+8)个机器周期
************************************************************/
void 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_pinDATA = (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_pinDATA = 1; //读取数据之前DATA引脚要置1 以切换到输入状态
ZLG7289_LongDelay();
do
{
ZLG7289_pinCLK = 1;
ZLG7289_ShortDelay();
dat <<= 1;
if ( ZLG7289_pinDATA ) dat++;
ZLG7289_pinCLK = 0;
ZLG7289_LongDelay();
} while ( --t != 0 );
ZLG7289_pinDATA = 0;
return dat;
}
/*************************************************************
函数:ZLG7289_cmd()
功能:执行ZLG7289 纯指令
参数: cmd:命令字
*************************************************************/
void ZLG7289_cmd(char cmd)
{
// char sav = IE;
// IE &= 0xFA; //关闭外部中断1111 1010 屏蔽外部中断1和0
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_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, unsigned char x, bit dp, unsigned char dat)
{
code char ModDat[3] = {0x80,0xC8,0x90}; // 10000 0000 1100 1000 1001 0000,方式0译码 方式1 下载数据但不译码
/*返回读到的按键值:0~63
如果返回0xFF 则表示没有键按下
*/
char d1;
char d2;
if ( mod > 2 ) mod = 2;
d1 = ModDat[mod];
x &= 0x07; //x=x&0x07;;0000 0111
d1 |= x; // d1=d1 | x
d2 = dat & 0x7F;
if ( dp ) d2 |= 0x80;
ZLG7289_cmd_dat(d1,d2);
}
/*************************************************************
函数:char ZLG7289_Key()
功能:读出键值;
参数:按键的值;
*************************************************************/
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_pinDATA = 1;
ZLG7289_pinKEY = 1;
//延时初始化
ZLG7289_Delay_t = t;
ZLG7289_Reset();
//点亮所有数码管0 0 0.0 0 0
//对于的是数码管5 4 3 2 1 0
for ( x=0; x<6; x++ )
{
ZLG7289_Download(1,x,0,0);
}
ZLG7289_Download(1,3,1,0);
}
/*************************************************************
函数:void main()
功能:
参数:
*************************************************************/
void main()
{
unsigned char i,x;
unsigned char key_back=0;
unsigned long angle=0;
unsigned char dat[6]={0};
ZLG7289_Init(8);
EA = 0;
while(1)
{
if(ZLG7289_pinKEY==0) //键盘中断请求信号,低电平有效,判断是否有键按下.
{
Key = ZLG7289_Key();
switch(Key)
{
case K4_Rest:
{
P1&=0xc0; //将IO输出全部清0;
AngleCounter=0; //清标志;
ZLG7289_Reset(); //rest;
//ZLG7289_Hide(0xf0); //前2位消隐;
/*******显示 000.000******/
for ( x=0; x<6; x++ )
{
ZLG7289_Download(1,x,0,0);
}
ZLG7289_Download(1,3,1,0);
}break;
case K3_Set:
{
if(Keysetflag==0)
{
Keysetflag=1; //进入设置状态;
ZLG7289_Flash(0x00); //闪烁;
}
else
{
Keysetflag=0;
ZLG7289_Flash(0xff);
}
}break;
case K2_Up:
{
if(Keysetflag)
{
AngleCounter++;
if(AngleCounter==64)
{
AngleCounter=0;
}
angle=0;
angle=(unsigned long)AngleCounter*StepAngle;
// angle=123456;
dat[0]=angle/100000;
angle=angle%100000;
dat[1]=angle/10000;
angle=angle%10000;
dat[2]=angle/1000;
angle=angle%1000;
dat[3]=angle/100;
angle=angle%100;
dat[4]=angle/10;
dat[5]=angle%10;
/*******显示 xxx.xxx******/
for(i=0;i<6;i++) //显示"xxxxxx"
{
ZLG7289_Download(1,i,0,dat[5-i]);
}
ZLG7289_Download(1,3,1,dat[2]);//显示 "."
//*******IO输出******/
P1&=0xc0;
P1|=AngleCounter;
}
}break;
case K1_Down:
{
if(Keysetflag)
{
if(AngleCounter==0)
{
AngleCounter=64;
}
AngleCounter--;
angle=0;
angle=(unsigned long)AngleCounter*StepAngle;
dat[0]=(angle/100000)&0x03;
angle=angle%100000;
dat[1]=angle/10000;
angle=angle%10000;
dat[2]=angle/1000;
angle=angle%1000;
dat[3]=angle/100;
angle=angle%100;
dat[4]=angle/10;
dat[5]=angle%10;
/*******显示 xxx.xxx******/
for(i=0;i<6;i++) //显示"xxxxxx"
{
ZLG7289_Download(1,i,0,dat[5-i]);
ZLG7289_LongDelay();
}
ZLG7289_Download(1,3,1,dat[2]);//显示 "."
//*******IO输出******/
P1&=0xc0;
P1|=AngleCounter;
}
}break;
default:break;
}
while(!ZLG7289_pinKEY);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -