#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define HPORT P1
#define TOTALZISHU 34 //要显示的字符数
#define DIANZHENSHU 3 //点阵板块数
sbit OE=P3^4;
sbit STC=P3^5;
sbit SHC=P3^6;
sbit DS=P3^7;
uchar code sch[16][TOTALZISHU*2]={{0x10,0x40,0x08,0x20,0x02,0x00,0x00,0x00,0x04,0x10,0x10,0x40,0x01,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x00,0x00,0x08,0x04,0x22,0x08,0x00,0x80,0x00,0x00}
,{0x10,0x40,0x08,0x20,0x02,0x00,0x3F,0xF0,0x0E,0x10,0x10,0x40,0x01,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x10,0x10,0x02,0x00,0x00,0x08,0x1D,0xFE,0x11,0x08,0x78,0x40,0x00,0x00}
,{0x10,0x48,0x08,0x20,0x02,0x10,0x00,0x10,0xF8,0x90,0x10,0x48,0x01,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x11,0xF8,0x02,0x10,0x7F,0xFC,0xF1,0x04,0x11,0x10,0x4F,0xFE,0x00,0x00}
,{0x13,0xFC,0x08,0x24,0x7F,0xF8,0x00,0x20,0x08,0x50,0x13,0xFC,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x11,0x10,0x7F,0xF8,0x01,0x00,0x11,0x04,0x00,0x20,0x54,0x02,0x00,0x00}
,{0xFC,0x40,0xFE,0xFE,0x42,0x10,0x00,0x40,0x08,0x10,0xFC,0x40,0x01,0x04,0x7F,0xFE,0x00,0x00,0x00,0x00,0xFD,0x10,0x42,0x10,0x01,0x00,0x11,0x04,0x7F,0xFE,0x58,0x14,0x00,0x00}
,{0x10,0x44,0x08,0x20,0x42,0x10,0x01,0x80,0xFE,0x90,0x10,0x40,0xFF,0xFE,0x40,0x02,0x00,0x00,0x00,0x00,0x11,0x10,0x42,0x10,0x01,0x00,0xFF,0x04,0x40,0x02,0x63,0xF8,0x00,0x00}
,{0x37,0xFE,0x18,0x60,0x7F,0xF0,0x01,0x04,0x08,0x50,0x10,0x40,0x01,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x31,0x10,0x7F,0xF0,0x01,0x00,0x11,0xFC,0x80,0x04,0x50,0x00,0x00,0x00}
,{0x38,0x40,0x1C,0x70,0x42,0x10,0xFF,0xFE,0x1C,0x14,0x13,0xF8,0x02,0x80,0x1F,0xE0,0x7F,0xFE,0x7F,0xFE,0x39,0x10,0x42,0x10,0x01,0x00,0x38,0x00,0x1F,0xE0,0x48,0x08,0x00,0x00}
,{0x54,0x40,0x2A,0xA8,0x42,0x10,0x01,0x00,0x1A,0x1E,0x1A,0x08,0x02,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x55,0x10,0x42,0x10,0x01,0x00,0x37,0xFE,0x00,0x40,0x4F,0xFC,0x00,0x00}
,{0x50,0x48,0x28,0xAE,0x7F,0xF0,0x01,0x00,0x29,0xF0,0x31,0x10,0x02,0x40,0x01,0x84,0x00,0x00,0x00,0x00,0x51,0x10,0x7F,0xF0,0x01,0x00,0x54,0x20,0x01,0x84,0x48,0xA0,0x00,0x00}
,{0x93,0xFC,0x49,0x24,0x42,0x10,0x01,0x00,0x28,0x10,0xD1,0x10,0x04,0x40,0xFF,0xFE,0x00,0x00,0x00,0x00,0x91,0x10,0x42,0x10,0x01,0x00,0x50,0x28,0xFF,0xFE,0x68,0xA0,0x00,0x00}
,{0x10,0x40,0x8A,0x20,0x02,0x00,0x01,0x00,0x48,0x10,0x10,0xA0,0x04,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x02,0x00,0x01,0x00,0x91,0xFC,0x01,0x00,0x50,0xA0,0x00,0x00}
,{0x10,0x40,0x08,0x20,0x02,0x04,0x01,0x00,0x88,0x10,0x10,0x40,0x08,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x11,0x12,0x02,0x04,0x01,0x04,0x10,0x20,0x01,0x00,0x41,0x22,0x00,0x00}
,{0x10,0x44,0x08,0x20,0x02,0x04,0x01,0x00,0x08,0x10,0x10,0xB0,0x10,0x0E,0x01,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x02,0x04,0xFF,0xFE,0x10,0x24,0x01,0x00,0x41,0x22,0x00,0x00}
,{0x1F,0xFE,0x08,0x20,0x01,0xFC,0x05,0x00,0x08,0x10,0x51,0x0E,0x60,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x14,0x0E,0x01,0xFC,0x00,0x00,0x17,0xFE,0x05,0x00,0x42,0x1E,0x00,0x00}
,{0x10,0x00,0x08,0x20,0x00,0x00,0x02,0x00,0x08,0x10,0x26,0x04,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x4C,0x00,0x00,0x00}
};
uint zlength=16*TOTALZISHU; //要输出的列数
unsigned char code tableh[16]={0x0f,0x1f,0x2f,0x3f,0x4f,0x5f,0x6f,0x7f,0x8f,0x9f,0xaf,0xbf,0xcf,0xdf,0xef,0xff};
void delay(uint n)
{
while(n--);
}
/*
void clear(uint n)
{
uint i;
for(i=0;i<n;i++)
{
SHC=0;
DS=0;
SHC=1;
}
}
*/
void xhshow(int lie) //循环显示方式
{
int liez;
uchar liey;
uint qingchu; //循环清除数
uchar hang; //行循环数
int i;
uchar j;
uchar tsch;
uchar zifushu; //要输出的字符数
zifushu=zlength/8; //zlength 总共要输出的列数
// lie=lie%zlength;
liez=lie/8;
liey=lie%8;
for(hang=0;hang<16;hang++) //行
{
for(qingchu=lie-1;qingchu<DIANZHENSHU*16;qingchu++) //清除595上的数据
{
SHC=0;
DS=0;
SHC=1;
}
i=0;
if((liez-DIANZHENSHU*2)>=0)
i=liez-DIANZHENSHU*2;
for(;i<liez;i++) //循环输出列
{
tsch=sch[hang][i%zifushu];
for(j=0;j<8;j++)
{
SHC=0;
DS=tsch&0x80;
SHC=1;
tsch=tsch<<1;
}
}
if(liey!=0)
{
tsch=sch[hang][i%zifushu];
for(i=0;i<liey;i++)
{
SHC=0;
DS=tsch&0x80;
SHC=1;
tsch=tsch<<1;
}
}
HPORT=tableh[hang]; //打开行
STC=0;
STC=1;
}
}
/*
void ctshow(uchar lie) //显示完成后从头开始
{
uchar liez;
uchar liey;
uchar hang;
uchar i,j;
uchar tsch;
uint qingchu; //循环清除数
lie=lie%zlength;
liez=lie/8;
liey=lie%8;
for(hang=0;hang<16;hang++) //行
{
HPORT=tableh[hang]; //打开行
for(qingchu=DIANZHENSHU*16-lie;qingchu<DIANZHENSHU*16;qingchu++) //清除595上的数据
{
SHC=0;
DS=0;
SHC=1;
}
OE=1;
for(i=0;i<liez;i++) //循环输出列
{
tsch=sch[hang][i];
for(j=0;j<8;j++)
{
SHC=0;
DS=tsch&0x80;
SHC=1;
tsch=tsch<<1;
}
}
if(liey!=0)
{
tsch=sch[hang][liez];
for(i=0;i<liey;i++)
{
SHC=0;
DS=tsch&0x80;
SHC=1;
tsch=tsch<<1;
}
}
STC=0;
STC=1;
OE=0;
delay(50);
}
}
*/
void main()
{
uint i;
uint j=10;
/// clear(zlength);
// STC=0;
// STC=1;
OE=0;
while(1)
{
for(j=0;j<zlength;j++)
for(i=0;i<2;i++) //延时
xhshow(j);
}
}