最近做了个32*64 单色点阵仿真。在程序上遇到问题了。望各位路过的大佬帮帮我这单片机菜鸟。#include<reg52.h>
#include"MacroAndConst.h"
#include"delay.h"
#include"display.h"
#include"ziku.h"
extern bit fLeftFlag; //声明外部变量
extern bit fRightFlag; //声明外部变量
uchar scan;
uchar speed=5; //设定移动速度
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
/**********************************************************
函数名称:LeftflowDisplay
函数功能:左移显示函数
入口参数:无
出口参数:无
备 注:
**********************************************************/
void LeftflowDisplay() //逐行 阴码 逆向
{
uchar sp,y=0;
move=0;
words=0;
while(words<20*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,等待一段时间,产生视觉暂留
}
}
else
break;
}
move=move+1; //移动一步(一位)
}
else
break;
}
move=0;
words=words+32; //下一个字
}
else
break;
}
words=0;
}
/**********************************************************
函数名称:loadline1
函数功能:装载点阵数据 缓存
入口参数:无
出口参数:无
备 注:
**********************************************************/
void loadline1()
{
uchar s;
for(s=0;s<5;s++) //s为要显示的字数+1(显示4字+1=5)
{
BUFF[2*s]=zuoyi[words+ 32*s + 2*line];
BUFF[2*s+1]=zuoyi[words+1+ 32*s + 2*line];
}
}
/**********************************************************
函数名称: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>>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;
while(words<=20*32) //数组元素。46组,每组32个
{
if(fRightFlag==1)
{
while(move<16)// 循环16次,点亮并移动一个汉字
{
if(fRightFlag==1)
{
for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
{
if(fRightFlag==1)
{
for(line=0;line<16;line++)//扫描16行
{
loadoneline();//装载一线点阵数据
sendoneline();//发送一线点阵数据
P2=line;
ST= 0;
ST= 1;
delay_10us(50); //延时500us,等待一段时间,产生视觉暂留
}
}
else
break;
}
move++; //列指针递增
}
else
break;
}
move=0;
words=words+32;// 一个汉字移动后,指向下一个汉字
}
else
break;
}
words=0;
}
/**********************************************************
函数名称:loadoneline
函数功能:装载点阵数据 缓存
入口参数:无
出口参数:无
备 注:
**********************************************************/
void loadoneline()
{
uchar s;
for(s=0;s<5;s++) //s为要显示的数字+1
{
BUFF[2*s+1]=youyi[words+32*s+2*line];
BUFF[2*s]=youyi[words+1+32*s+2*line];//~
}
}
/**********************************************************
函数名称: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>>tempcol)|(BUFF[s+1]<<(8-tempcol));
for(k=0;k<8;k++)
{
SH=0;
DATA=(bit)(temp&0x01);
temp=temp>>1;
SH=1;
}
}
}
显示程序是这样的。显示出来的是两行一样的字。
那么问题来了。。。
1、如果如原理图所示,595的DS只接一个数据引脚da0,怎么改程序让两行都显示数据,且数据不同呢?
2、如果把第二排595的DS接另一个数据引脚,先把第一排的数据全部移入595,再把第二排的数据移入595,然后再给第一排输出时钟,给第二排输出时钟,让两排的数据同时输出。请问怎么改程序?
|