目录
资料下载地址:基于51单片机时间和汉子在16X64点阵上显示仿真
一、项目要求
点阵上显示时间、汉子;通过按键切换左移和右移,串口打印显示信息。
二、仿真
显示内容:时间
移动方向:左移
显示内容:汉字
移动发现:左移
显示内容:时间
移动方向:右移
显示内容:汉字
移动方向:右移
三、代码
点阵显示代码
#include<reg52.h>
#include"MacroAndConst.h"
#include"delay.h"
#include"display.h"
#include"ziku.h"
#include "stdio.h"
#include "string.h"
char str[10];
extern bit fLeftFlag; //声明外部变量
extern bit fRightFlag; //声明外部变量
extern bit fLeftFlag1; //声明外部变量
extern bit fRightFlag1; //声明外部变量
uchar scan;
uchar speed=2; //设定移动速度
uint words; //字模计数器
uchar move; //列指针
uchar line; //行指针
uchar temp;
uchar BUFF[10]; //缓存数组
sbit ST=P3^5; //595 STR
sbit SH=P3^6; //595 CLK
sbit DATA=P3^7; //595 DATAS
uchar mode = 0;
extern unsigned char date[];
extern char b;
void send(uchar* state,uchar num);
/**********************************************************
函数名称:LeftflowDisplay
函数功能:左移显示函数
入口参数:无
出口参数:无
备 注:
**********************************************************/
void LeftflowDisplay() //逐行 阴码 逆向
{
uchar sp,y=0;
move=0;
words=0;
if(fLeftFlag == 1)
{
words = 0;
line = 0;
move = 0;
memset(str,0,10);
str[0] = date[0] + 0x30;
str[1] = date[1] + 0x30;
str[2] = date[2] + 0x30;
str[3] = date[3] + 0x30;
str[4] = date[4] + 0x30;
//sprintf(str,"%d \r\n",(unsigned int)date);//不加强制转换,输出异常
send(str ,5);
while(words<5*32) //
{
// if(fLeftFlag==1)
// {
while(move<16) //数据移位
{
// if(fLeftFlag==1)
// {
for(sp=0;sp<speed;sp++) //移动速度
{
if(fLeftFlag==1)
{
for(line=0;line<16;line++) //行扫描
{
loadline1(); //装载一线点阵数据
sendline1(); //发送一线移动数据
scan=line; //显示第line行
P2=scan;
ST=1; //锁存为高,595锁存信号
ST=0;
delay_10us(50); //延时500us,等待一段时间,产生视觉暂留
}
}
}
move=move+1; //移动一步(一位)
}
// }
move=0;
words=words+32; //下一个字
// }
}
}
else if(fRightFlag == 1)
{
words = 0;
line = 0;
move = 0;
memset(str,0,10);
str[0] = 0xB1;
str[1] = 0xCF;
str[2] = 0xD2;
str[3] = 0xB5;
str[4] = 0xBC;
str[5] = 0xBE;
str[6] = 0xBF;
str[7] = 0xEC;
str[8] = 0xC0;
str[9] = 0xD6;
send(str ,10);
while(words<5*32) //
{
// if(fLeftFlag==1)
// {
while(move<16) //数据移位
{
// if(fLeftFlag==1)
// {
for(sp=0;sp<speed;sp++) //移动速度
{
// if(fLeftFlag==1)
// {
for(line=0;line<16;line++) //行扫描
{
loadline1(); //装载一线点阵数据
sendline1(); //发送一线移动数据
scan=line; //显示第line行
P2=scan;
ST=1; //锁存为高,595锁存信号
ST=0;
delay_10us(50); //延时500us,等待一段时间,产生视觉暂留
}
//}
}
move=move+1; //移动一步(一位)
}
// }
move=0;
words=words+32; //下一个字
// }
}
}
words=0;
}
/**********************************************************
函数名称:sendline1
函数功能:发送点阵数据 缓存
入口参数:无
出口参数:无
备 注:
**********************************************************/
void sendline1()
{
uchar s;
uchar inc,temp,tempcol;
uchar k;
DATA=1;
if(move<8) inc=0;
else inc=1;
for(s=0+inc;s<=7+inc;s++)
{
if(move<8)
tempcol=move;
else
tempcol=move-8;
temp=(BUFF[s]>>tempcol)|(BUFF[s+1]<<(8-tempcol)); //字模左边字节右移tempcol位,右边字节左移8-tempcol位,2者相或
for(k=0;k<8;k++)
{
SH=0;
DATA=(bit)(temp&0x80);
temp=temp<<1;
SH=1;
}
}
}
/**********************************************************
函数名称:RightflowDisplay
函数功能:右移显示函数
入口参数:无
出口参数:无
备 注:
**********************************************************/
void RightflowDisplay() //流动右移 逐行 阴码 顺向
{
uchar i;
move=0;
words=0;
if(fLeftFlag==1)//右移
{
words = 0;
line = 0;
move = 0;
memset(str,0,10);
str[0] = date[0] + 0x30;
str[1] = date[1] + 0x30;
str[2] = date[2] + 0x30;
str[3] = date[3] + 0x30;
str[4] = date[4] + 0x30;
send(str ,5);
while(words<=5*32) //数组元素。46组,每组32个
{
while(move<16)// 循环16次,点亮并移动一个汉字
{
for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
{
for(line=0;line<16;line++)//扫描16行
{
loadoneline();//装载一线点阵数据
sendoneline();//发送一线点阵数据
P2=line;
ST= 0;
ST= 1;
delay_10us(50); //延时500us,等待一段时间,产生视觉暂留
}
}
move++; //列指针递增
}
move=0;
words=words+32;// 一个汉字移动后,指向下一个汉字
}
}
else if(fRightFlag == 1)
{
words = 0;
line = 0;
move = 0;
memset(str,0,10);
str[0] = 0xB1;
str[1] = 0xCF;
str[2] = 0xD2;
str[3] = 0xB5;
str[4] = 0xBC;
str[5] = 0xBE;
str[6] = 0xBF;
str[7] = 0xEC;
str[8] = 0xC0;
str[9] = 0xD6;
send(str ,10);
while(words<5*32) //
{
while(move<16)// 循环16次,点亮并移动一个汉字
{
for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
{
for(line=0;line<16;line++)//扫描16行
{
loadoneline();//装载一线点阵数据
sendoneline();//发送一线点阵数据
P2=line;
ST= 0;
ST= 1;
delay_10us(50); //延时500us,等待一段时间,产生视觉暂留
}
}
move++; //列指针递增
}
move=0;
words=words+32; //下一个字
}
}
words=0;
}
/**********************************************************
函数名称:sendoneline
函数功能:发送点阵数据 缓存
入口参数:无
出口参数:无
备 注:
**********************************************************/
void sendoneline()
{
char s;
uchar inc,k,tempcol;
if(move<8)
inc=0;
else
inc=1;
for(s=7+inc;s>=0+inc;s--)
{
if(move<8)
tempcol=move;
else
tempcol=move-8;
temp=(BUFF[s]>>tempcol)|(BUFF[s+1]<<(8-tempcol));
for(k=0;k<8;k++)
{
SH=0;
DATA=(bit)(temp&0x01);
temp=temp>>1;
SH=1;
}
}
}