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

📄 zlg7289_16.c

📁 MPLAB模块编程实例
💻 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 + -