📄 zq9712驱动测试程序.c
字号:
/*晶振22.1184M,AT89S52*/
/*包含的库文件*/
#pragma small
#pragma CODE DEBUG SYMBOLS OBJECTEXTEND
//#include "..\includes\TypeDef.h"
#include <reg52.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define ulint unsigned long int
#define uint unsigned int
/***********************************************/
//uchar code color_data[8]={7,6,5,3,4,2,1,0};//黑,红,绿,蓝,黄,紫,青,白//阳码
uchar code color_data[8]={0,4,2,1,6,5,3,7};//黑,红,绿,蓝,黄,紫,青,白//阳码
/***************************************************/
/*定义颜色控制端口*/
sbit DIN_ZQ9712=P1^3;/*蓝线 ZQ9712的数据输入*/
sbit CKIN_ZQ9712=P1^2;/*绿线 ZQ9712的时钟*/
sbit LIN_ZQ9712=P1^1;/*红线 ZQ9712的数据锁存*/
sbit OEIN_ZQ9712=P1^0;/*黄线 ZQ9712的数据使能*/
uchar te=1;
/*********************延时函数*************
函数原型:void dely(ulint timepara);
功 能:延时等待,参数timepara为延时时间*/
void delay(ulint timepara)
{ulint mpara;
mpara=0;
do
{
mpara=mpara+1;
}
while (mpara!=timepara);
}
/*********************延时函数*************
函数原型:void dely(ulint timepara);
功 能:延时等待,参数timepara为延时时间*/
void delays(ulint timepara)
{ulint i;
for(i=0;i<timepara;i++)
{delay(207);//22.1184M ---207---0.005S=5ms
}
}
sbit DQX=P2^3;
sbit CLKX=P2^2;
sbit STBX=P2^1;
sbit ENX=P2^0;
sbit dig1=P0^3;
sbit dig2=P0^2;
sbit dig3=P0^1;
sbit dig4=P0^0;
uchar code xian_data[13]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C};
/***************************************************/
/*函数原型:void stb_data(void);
功 能:锁存有效*/
void stbx_data(void)
{ STBX=0;
STBX=1;
delay(5);
STBX=0;
delay(5);
}
/*********************向由低位到高位发送一个像素的数据函数*************
函数原型:send_byte_lsbtomsb(uint8 bt);
功 能:向发送一个像素,参数bt为要发送的数据*/
void sendx( uchar bt1)
{ uint i;
for(i=0;i<8;i++)
{CLKX = 0;//将时钟线置低
DQX =(bt1 & 0x01)?1:0;//判断当前位为1还是为0;当为1时将数据线置高;当为0时将数据线置低;
CLKX = 1;//将时钟线置高
bt1>>=1;//将当前数据右移一位,准备与0x01进行比较
}
}
void ledK(int n) //数码管显示及数据处理程序
{ sendx(xian_data[n]);
stbx_data();
ENX=0;
dig1=0;dig2=0;dig3=0;dig4=1;
}
/*********************ZQ9712数据锁存函数*************
函数原型:void stb_data_ZQ9712(void);
功 能:ZQ9712数据锁存*/
void stb_data_ZQ9712(void)
{ uchar i;
LIN_ZQ9712=1;
for(i=0;i<2;i++);
LIN_ZQ9712=0;
}
/*********************向由低位到高位ZQ9712发送一个像素的数据函数*************
函数原型:send_byte_lsbtomsb(uint8 bt);
功 能:向ZQ9712发送一个像素,参数bt为要发送的数据*/
void send_3bit_lsbtomsb( uchar bt1,det)
{ uint i;
CKIN_ZQ9712 = 0;//将时钟线置低
//bt1=7-bt1;
for(i=0;i<3;i++)
{
DIN_ZQ9712 =(bt1 & 0x01)?1:0;//判断当前位为1还是为0;当为1时将数据线置高;当为0时将数据线置低;
CKIN_ZQ9712 = 1;//将时钟线置高
CKIN_ZQ9712 = 0;//将时钟线置低
bt1>>=1;//将当前数据右移一位,准备与0x01进行比较
}
if(det==1)
{OEIN_ZQ9712=1;
OEIN_ZQ9712=0;}
}
/*********************向ZQ9712发送N个某像素的函数*************
函数原型:void send_n_byte(n,bt);
功 能:向ZQ9712发送n个bt字节*/
void send_n_3bit(register uint k,uchar bt1,det)
{
while(k!=0)
{
send_3bit_lsbtomsb(bt1,det);
k--;
}
}
//ZQ9712颜色跳变函数
//i是当前颜色的地址
//num有多少个像素点
tiaobian(uchar i,num,det)
{
send_n_3bit(num,color_data[i],1);
stb_data_ZQ9712();
if(det) delays(500);
}
liushui(uchar i,j,num)
{uchar k;
for(k=1;k<num+1;k++)
{
send_n_3bit(k,color_data[i],1);
send_n_3bit(num-k,color_data[j],1);
stb_data_ZQ9712();
delays(100);
}
}
/*******************************************渐变程序开始*************************************/
uchar Gradation_Counter =0;//定义当前灰度计数器
#define Gradation_level 16//定义灰度级
uchar Gradation_level_Counter =0;//定义灰度级计数器
#define Gradation_level_time_Constant 1000//每一级灰度的显示时间常数
ulint Gradation_level_time =0;//每一级灰度的显示时间计数器
bit Process_mark =0;// (最亮-最暗)与(最暗-最亮)两过程判断标志
bit Cycle_mark =1;//为0时表示经历了(最亮-最暗)到(最暗-最亮)的过程了
jianbian_camp()
{ Gradation_level_Counter++;
if(Gradation_level_Counter==0xff)Gradation_level_Counter=0;
Gradation_level_time++;
if (Gradation_level_time==Gradation_level_time_Constant)
{
if(Process_mark==0)//最暗-最亮
{
Gradation_Counter++;
if(Gradation_Counter==Gradation_level)Process_mark=1;
}
else //最亮-最暗
{
Gradation_Counter--;
if(Gradation_Counter==1)
{
Process_mark=0;
Cycle_mark=0;
}
}
Gradation_level_time=0;
}
if(Gradation_level_Counter<Gradation_Counter) OEIN_ZQ9712=0; else OEIN_ZQ9712=1;
}
jianbian()
{uchar i=0;
Cycle_mark=0;
while(1)
{
if(Cycle_mark==0)
{
ET0=0;
i++;
if((i==8)) break;
// if((i==8)||(te==0)) break;
send_n_3bit(3,color_data[i],0);
stb_data_ZQ9712();
Cycle_mark=1;
}
//if(te==0) break;
jianbian_camp();
}
}
uchar code composecolor_data2[4][3]={
{4,4,4}, //红
{6,6,6},
{3,3,3},
{2,2,2},
};
uchar code composecolor_data3[5][2]={
{4,4}, //红
{1,1},
{5,5},
{2,2},
{6,6},
};
uchar length=2; // 颜色数组 的列数
uchar width=5; // 颜色数组 的行数
uint list=80; //一行有多少个像素;
/******************************方案一***************************/
// N组多色彩追逐流水,颜色组合通过改变数组来实现
/****************************************************************/
void liushui_composecolor(uchar *p)
{
uint i,j,k;
uchar *m;
m=p;
for(k=0;k<list;k++)
{if(te==1)
{
for(i=0;i<width;i++)
{if(te==1)
{
for(j=0;j<5;j++)
{ if(te==1)
{
p=m+i*length+j%length;
send_n_3bit(1,*p,1);
stb_data_ZQ9712();
delays(10);
//liangdu(levoe,500,2);
}else break;
}}else break;
}}else break;
}
}
/****主程序*******************/
void main(void)
{uchar *p,i;
//OEIN_ZQ9712=0;//使能ZQ9712
OEIN_ZQ9712=1;
//OEIN_ZQ9712=0;
tiaobian(0,3,0);
while(1)
{ i=0;
i++;
ledK(i);
length=2;
width=5;
p=&composecolor_data3[0][0];
//liushui_composecolor(p);
i++;
ledK(i);
tiaobian(1,3,1);
i++;
ledK(i);
tiaobian(2,3,1);
i++;
ledK(i);
tiaobian(3,3,1);
i++;
ledK(i);
tiaobian(4,3,1);
i++;
ledK(i);
tiaobian(5,3,1);
i++;
ledK(i);
tiaobian(6,3,1);
i++;
ledK(i);
tiaobian(7,3,1);
/*i++;
ledK(i);
tiaobian(0,3,1);
i++;
ledK(i);
liushui(0,1,3);
i++;
ledK(i);
liushui(0,2,3);
i++;
ledK(i);
liushui(0,3,3);
i++;
ledK(i);
liushui(0,4,3);
i++;
ledK(i);
liushui(0,5,3);
i++;
ledK(i);
liushui(0,6,3);
i++;
ledK(i);
liushui(0,7,3);
i++;
ledK(i);
liushui(1,0,3);
i++;
ledK(i);
liushui(2,0,3);
i++;
ledK(i);
liushui(3,0,3);
i++;
ledK(i);
liushui(4,0,3);
i++;
ledK(i);
liushui(5,0,3);
i++;
ledK(i);
liushui(6,0,3);
i++;
ledK(i);
liushui(7,0,3);
i++;
ledK(i);
jianbian();
i++;
ledK(i);*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -