📄 zlg7289_16.c
字号:
/*******************************
模块功能:基于ZLG7289A的数码管显示,dsPIC16F877A,时钟显示,时钟设置
日期:2007-8-25
修改日期: 2007-8-25 22:32
备注:
1 2 3 X
4 5 6 X
7 8 9 X
0 设置 确定 X
******************************/
#define EX_GLOBAL
#include "global.h"
void delay(unsigned int t)
{
while(t--);
}
/*
函数: ZLG7289_Write()
功能: 向SPI总线写入一个字节的数据
参数: dat 要写入的数据
*/
void ZLG7289_Write(unsigned char dat)
{
unsigned char i;
TRISD2=0;
delay(4);
for(i=0;i<8;i++)
{
SCLK=0; //数据准备里,SCLK=0
if((dat&0x80) != 0)
{SDA=1; //数据从高位先写入
}
else
{SDA=0;
}
dat<<=1;
SCLK=1;
delay(2);
SCLK=0; //SCLK为下降沿时,写入一位数据
delay(2);
}
}
/*
函数: ZLG7289_cmd()
功能: 纯指令函数
参数: cmd : 命令字节
*/
void ZLG7289_cmd(char cmd)
{
CS=1;
delay(2);
CS=0; //CS为低时,才能写入
delay(5);
ZLG7289_Write(cmd); //写子令
CS=1; //CS上升沿,则8位子令写完
delay(1000); //如果显示放在死循环里,应延时delay(1000)
}
/*
函数:ZLG7289_cmd_dat()
功能:带数据的指令函数
参数:cmd: 命令字节
dat: 数据字节
*/
void ZLG7289_cmd_dat(unsigned char cmd,unsigned char dat)
{
CS=1;
delay(2);
CS=0; //CS为低时,才能写入
ZLG7289_Write(cmd); //写子令
delay(3);
ZLG7289_Write(dat); //写数据
CS=1; //CS上升沿,则8位子令与8位数据写完
delay(1000); //如果显示放在死循环里,应延时delay(1000)
}
/*
函数:ZLG7289_show()
功能:根据选择的方式,显示数码管
参数:mod: 0/1 分别代表下载数据按照0译码方式\1译码方式
x : 数码管的显示位码0~7
dp : 0/1 分别代表小数点的显式方式 0是不显示\1为显示
dat: 要显示的数据
*/
void ZLG7289_show(unsigned char mod,unsigned char x,unsigned char dp,unsigned char dat)
{
unsigned char ModDat[2]={0x80,0xc8}; //0x80为选择方式0 、0xc8选择方式1
unsigned char d1,d2;
if(mod > 0) mod=1;
d1=ModDat[mod];
x&=0x07;
d1=d1|x;
d2=dat&0x7f;
if(dp == 1) d2=d2|0x80;
ZLG7289_cmd_dat(d1,d2);
}
/*
函数:ZLG7289_test()
功能:数码管显示自动检测
参数:
*/
void ZLG7289_auto_test(void)
{
unsigned int x,y,i;
for(x=0;x<16;x++) //数据
{
for(y=0;y<8;y++) //数码管显示位数
{
ZLG7289_show(1,y,0,x);
for(i=0;i<40000;i++);
}
for(i=0;i<40000;i++); //延时
}
}
/*
函数:ZLG7289_read_key()
功能:从SPI总线读取一个字节的数据
返回: 读取的数据
*/
unsigned char ZLG7289_read_key(void)
{
unsigned char dat;
unsigned char i;
char c;
TRISD2=1;
delay(2);//从输出状态切换到输入状态大约需要5us
for(i=0;i<8;i++)
{
SCLK=1;
delay(2);
dat<<=1; //先移位,再去判断SDA,不然dat将多移一次
if(SDA == 1)
{
dat++;
c++;
}
SCLK=0;
delay(2);
}
return dat;
}
/*
函数:ZLG7289_key()
功能:键盘指令
返回:返回值为0~63个键盘中键盘标志值
如果返回0FF则表示没有键按下
*/
unsigned char ZLG7289_key(void)
{
unsigned char data;
CS=1;
delay(1);
CS=0;
delay(5); //25
ZLG7289_Write(0x15);
delay(2); //12
data=ZLG7289_read_key();
delay(1);
CS=1;
delay(5);
return data;
}
/*
函数: key_recode( unsigned char a )
功能:读取键盘DA设置值 result
*/
void key_recode( unsigned char q )
{
unsigned char b=0,st=0;
switch (q)
{
case 7:b=1;break;
case 15:b=2;break;
case 23:b=3;break;
case 6:b=4;break;
case 14:b=5;break;
case 22:b=6;break;
case 5:b=7;break;
case 13:b=8;break;
case 21:b=9;break;
case 4: b=0;break;
case 12:TMR1IE=0;
a[2]=0xf;
a[5]=0xf;
Num=0;
st=1;
disp=1;
break;
case 20:TMR1IE=1;
a[2] = 0x0a;
a[5] = 0x0a;
Num=0;
disp=0;
break;
default:break;
}
if(disp == 1 && st == 0)
if( (b > 0 && b < 10 ) || b==0 )
{
if(Num==8)Num=0;
a[Num] = b;
second = a[0]+a[1]*10;
if(Num==1 && second>60)
{Num=0;return;}
min = a[3]+a[4]*10;
if( Num==4 && min>60)
Num=2;
hour = a[6]+a[7]*10;
if( Num==7 && hour>23)
Num=5;
Num++;
if(Num == 2 || Num == 5)Num++;
}
}
/*
函数:LED_show_key()
功能:LED显示 result
*/
void LED_show(void)
{
unsigned char i=0;
for(i=0;i<8;i++)
ZLG7289_show(0,i,0,a[i]);
}
void deal_clock(void)
{
unsigned char i=0;
if(disp == 1)
for(i=Num; i<8; i++)
a[i] = 0xf;
else
{
a[0] = second%10;
a[1] = second/10;
a[3] = min%10;
a[4] = min/10;
a[6] = hour%10;
a[7] = hour/10;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -