最近做了個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,然后再給第一排輸出時鐘,給第二排輸出時鐘,讓兩排的數據同時輸出。請問怎么改程序?
|