最近學著寫了一個LED點陣屏左移的程序16*32,用的138和595,可是在定義字模數組的時候只能定義5個字,多于5個字就沒有顯示,五個字以內就正常,請
大神們給予指點,
以下是源程序
#include<STC12C5A60S2.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDA_G =P4^1; //
sbit SDA_R =P4^5;//串行數據輸入
sbit SHCP =P0^6; //移位時鐘脈沖
sbit STCP =P4^6; //輸出鎖存器控制脈沖
sbit IA=P2^0;//
sbit IB=P2^1; //
sbit IC=P2^2; //
sbit ID=P2^3;//
sbit OE=P4^4; //
//uint uiAllData;
uchar Move,line,Speed;
uint zimuo;
uchar BUFF[20]; //緩存
void DelayMs(void); // 延時
void in_data(); // 調整移動數據
void rxd_data(); // 發送移動數據
uchar code hanzi[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x01,0x00,0x01,0x3F,0x01,0x20,0x3F,0xA0,0x20,0x92,0x10,0x54,0x02,0x28,0x02,
0x08,0x02,0x14,0x05,0x24,0x05,0xA2,0x08,0x81,0x08,0x40,0x10,0x20,0x20,0x10,0x40,/*"歡",0*/
0x00,0x00,0x04,0x01,0xC8,0x3C,0x48,0x24,0x40,0x24,0x40,0x24,0x4F,0x24,0x48,0x24,
0x48,0x24,0x48,0x2D,0xC8,0x14,0x48,0x04,0x08,0x04,0x14,0x04,0xE2,0x7F,0x00,0x00,/*"迎",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
};
/******************************************************/
/*****不影響其他端口的掃描*************************/
void scan(uchar Value)
{
switch(Value)
{case 0: {IA=0;IB=0;IC=0;ID=0;};break;
case 1:{IA=1;IB=0;IC=0;ID=0;};break;
case 2:{IA=0;IB=1;IC=0;ID=0;};break;
case 3: {IA=1;IB=1;IC=0;ID=0;};break;
case 4: {IA=0;IB=0;IC=1;ID=0;};break;
case 5: {IA=1;IB=0;IC=1;ID=0;};break;
case 6: {IA=0;IB=1;IC=1;ID=0;};break;
case 7:{IA=1;IB=1;IC=1;ID=0;};break;
case 8: {IA=0;IB=0;IC=0;ID=1;};break;
case 9: {IA=1;IB=0;IC=0;ID=1;};break;
case 10:{IA=0;IB=1;IC=0;ID=1;};break;
case 11: {IA=1;IB=1;IC=0;ID=1;};break;
case 12: {IA=0;IB=0;IC=1;ID=1;};break;
case 13:{IA=1;IB=0;IC=1;ID=1;};break;
case 14:{IA=0;IB=1;IC=1;ID=1;};break;
case 15:{IA=1;IB=1;IC=1;ID=1;};break;
default:break;
}
}
/**************************延時***********************/
void DelayMs(void)
{
unsigned char i, j;
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Timer0Init(void) //1毫秒@22.1184MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0xCD; //設置定時初值
TH0 = 0xF8; //設置定時初值
TR0 = 1; //定時器0開始計時
EA=1;
ET0=1;
}
/********************************************/
/*主函數*/
void main()
{ P4SW=0x70;
P2M1=0x00;P2M0=0x0f;
P4M1=0x00;P4M0=0xff;
P3M1=0x00;P3M0=0x80;
zimuo=0;
Move=0;
SHCP=0;
STCP=0;
Timer0Init();
line=0;
while(1)
{
while(zimuo<128)
{
while(Move<16)
{
for(Speed=0;Speed<15;Speed++)
{
for(line=0;line<16;line++)
{
in_data(); //
rxd_data(); //
scan(line); //
OE=1;//
DelayMs();
OE=0;
}
}
Move++;
}
Move=0;
zimuo=zimuo+32;
}
zimuo=0;
}
}
/******************************************************** */
void in_data(void)
{
uchar s;
for(s=0;s<8;s++)
{
BUFF[2*s]=hanzi[zimuo+32*s+2*line];
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*line];
}
}
/***********************發送移動的數據************************ */
void rxd_data(void)
{
uchar h;
uchar inc,tempyid,temp,k;
if(Move<8)
inc=0;
else
inc=1;
for(h=0+inc;h<4+inc;h++)
{
if(Move<8)
tempyid=Move;
else
tempyid=Move-8;
temp=(BUFF[h]>>tempyid)|(BUFF[h+1]<<(8-tempyid));
temp=~temp;
for(k=0;k<8;k++)
{
SHCP=0;
if(temp&0x01==0x01)
{
SDA_G=1;
}
else
{
SDA_G=0;
}
// SDA_G=(bit)(temp&0x01);
temp=temp>>1;
SHCP=1;
_nop_();
_nop_();
}
STCP=1;
STCP=0;
}
}
|