📄 zsp.c
字号:
//#include <regx52.h>
#include <AT89x52.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SPEED 1 //定义速度
#define light 1 //定义亮度
uint hang;
uchar dat1;
//*****************************************************
//管脚定义:
//P3.0---列【R】。
//P3.1--列【CLK】。
sbit V_RCK = P3^2;//列【L-STR】行【H-CLK]。
sbit V_OER = P3^3;//列【OE】。【暂时不用】。
sbit H_SDA = P3^4;//行【H_R】。
sbit H_MR = P3^5;//行【H_MR】。
//P3.0---列【R】。
//P3.1--列【CLK】。
//*****************************************************
/*****************************************************
//屏接口和单片机端口连接
0 0------单片机+5V【加一根连接到电源5V】
0 0------空
0 0------地
0 0------P3.0---列【L-R】。
0 0------P3.1---列【L-CLK】。
0 0------P3^2---列【L-STR】。
0 0------P3^3---行【H_R】。
0 0------P3^5---行【H_MR】。
****************************************************/
/*****************************************************
定义两个可位寻址的变量,用于对字模数据的顺序调整,
因为这块屏的连接没有按正常顺序,需对每位数据从新
编排,才能使用一般的字模工具产生的字模
*****************************************************/
uchar bdata temp0;
uchar bdata temp1;
sbit temp00=temp0^0;
sbit temp01=temp0^1;
sbit temp02=temp0^2;
sbit temp03=temp0^3;
sbit temp04=temp0^4;
sbit temp05=temp0^5;
sbit temp06=temp0^6;
sbit temp07=temp0^7;
sbit temp10=temp1^0;
sbit temp11=temp1^1;
sbit temp12=temp1^2;
sbit temp13=temp1^3;
sbit temp14=temp1^4;
sbit temp15=temp1^5;
sbit temp16=temp1^6;
sbit temp17=temp1^7;
uchar col,disrow; //col为位移变量,disrow为行变量
uint word;
uchar code HZ[];
uchar BUFF[10];
void loadoneline(void);
void delay(uchar t);
void sendoneline(void);
void send(uint k);
/********************************************/
uchar two_onebyte(uchar h1,uchar h2)
{uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1<<tempcol)|(h2>>(8-tempcol));
return temp;
}
/*******************************************************/
void main(void)
{uchar i;
col=0;word=0;
SCON = 0x00; //串口工作方式0
V_RCK = 1; //先拉低V_RCK///V_RCK = 0;
hang=0x0002; //行选信号初始化
while(1)
{while(col<16)
{for(i=0;i<SPEED;i++)
{for(disrow=0;disrow<16;disrow++)
{ loadoneline();
sendoneline();
V_RCK = 0; //锁存已发送的整一行的数据V_RCK = 1;
V_RCK = 1;
send(hang); //发送行选择数据
if(col<7)
delay(light); //延时
hang=_irol_(hang,1);//行选信号调整,选中下一行
}
}
col++;
}
col=0;word=word+32;
if(word>=1024)word=0;//字数*32
}
}
/****************把字模移入数组的子函数********************/
void loadoneline(void)
{uchar s;
for(s=0;s<5;s++)
{BUFF[2*s]=HZ[word+32*s+2*disrow];
BUFF[2*s+1]=HZ[word+1+32*s+2*disrow];
}
}
/*******************发送一行的子函数************************/
void sendoneline(void)
{char s;uchar inc;
if(col<8)inc=0;else inc=1;
for(s=0+inc;s<=7+inc;s++)
{temp0=two_onebyte(BUFF[s],BUFF[s+1]); //取出字模数据(数据地址为行基址i+偏移地址j)
temp10=temp07; //对字模数据进行顺序调整
temp11=temp06;
temp12=temp05;
temp13=temp04;
temp14=temp03;
temp15=temp02;
temp16=temp01;
temp17=temp00;
SBUF=temp1; //发送字模数据
while(TI==0); //等待发送完毕
TI=0;
}
}
/*******************************************************/
void send(uint k)
{uchar i;
H_SDA=1;
H_MR=1;//行【H_MR】。
for(i=0;i<16;i++) //一次发送16位数据
{
H_SDA = k&0x8000; //发送最高位
H_MR=1;//时钟信号产生一个脉冲来锁存数据
k=k<<1; //左移一位
}
}
/*******************************************************/
void delay(uchar t)
{ uchar i,j;
for(j=0;j<t;j++)
{for(i=0;i<10;i++);}
}
/*******************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -