求助谁帮我用单片机控制的16x16点阵LED循环显示“08自动化毕业设计张少鹏”,这个程序怎么写嘛?
#include<reg52.h>
#define BLKN 2
#define NUM 6 //等待显示字数 此时为 6
sbit G=P1^7; //P1.7为显示允许控制信号端口 P1.7为高电平时输出无效
sbit RRCLK=P1^6; //P1.6为输出锁存器时钟信号端
sbit SCLR=P1^5; //P1.5为移位寄存器清零端
sbit P32=P3^2;
void delay(unsigned int); //延时函数
unsigned char idata huancun[32]; //显示缓存2
unsigned char code Cmp[][32]; //定义字模
void toup(); //定义向上移动函数
void todown(); //定义向下移动函数
void toleft(); //定义向左移动函数
void toright(); //定义向右移动函数
void jing(); //定义静态显示函数
void main(void)
{
SCON=0x00; //串口工作模式0,移位寄存器方式 书P140-141
TMOD=0x01; //定时器T0工作方式1;16位方式 书P117-119
TR0=1; //启动定时器T0 (TCON=0x10?) 书P107
P1=0x3f; //P1端口初值,允许接收,缓存,显示
IE=0x83; //允许定时器T0中断和外部中断INT0 书P106-107
IT0=1;
P2=0x3f;
while(1)
{
delay(1000); //显示效果:刷屏
jing();
toup();
todown();
toleft();
toright();
}
}
//延时函数
void delay(unsigned int dt)
{
register unsigned char bt;
for(;dt;dt--)
for(bt=0;bt<255;bt++);
}
/*************************外部中断INT0服务函数***************************/
void xuanze() interrupt 0 using 2
{
register unsigned char mm;
mm++;
if (mm==1)
{P2=0x06;
// jing();
}
else if (mm==2)
{P2=0x5b;
// toup();
}
else if (mm==3)
{P2=0x4f;
// todown();
}
else if (mm==4)
{P2=0x66;
// toleft();
}
else if (mm==5)
{
mm=0;
P2=0x3f;
// toright();
}
}
//显示屏扫描(定时器T0中断)函数服务程序 (中断后,执行此程序) 书P112(C51中断程序设计)
void leddisplay(void)interrupt 1 using 1 //using 1可以默认省略 interrupt 1 (定时/计数器0溢出中断)
{
register unsigned char i,j=BLKN;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256; //2000个脉冲以内刷新一次,才能稳定显示
// TH0=0Xf8; //设定显示屏刷新率每秒62.5 (记了2000个脉冲) 书P248
// TL0=0X30; //1000个脉冲差不多1毫秒
//定时 t=12/f*(65536-X) X为记的脉冲个数, f为晶振
//T0=1111 1000 0011 0000=63536
//T0最高为全1, 65536
//记 X 个脉冲时, TH0=(65536-X)/256;TL0=(65536-X)%256;
//即:TH0=(65536-X)的高八位,TL0为(65536-X)的低八位.
//如:X=50000时,65536-50000=1536= 3CB0 H,此时TH0=3C,TL0=B0;
i=P1; //读取当前显示的行号
i=++i&0x0f; //行号加 1 ,屏蔽高四位
do {
j--;
SBUF=huancun[i*BLKN+j]; //送显示数据 SBUF接收、发送缓冲寄存器?
while(!TI);TI=0; //TI为发送中断标志位,发送完后TI=0;
}while(j); //完成一行数据的发送
G=1; //消隐(关闭显示)
P1&=0xf0; //行号端口清零
RRCLK=1; //显示数据打入输出锁存器
P1|=i; //写入行号 ???
RRCLK=0; //锁存显示数据
G=0; //打开显示
}
/***************************向上移动函数********************************/
void toup() //向上
{
register unsigned char i,j,k;
for(i=0;i<32;i++) //显示效果:半屏卷帘
{
huancun[i]=Cmp[0][i];
if(i%2)delay(70);
}
delay(100);
for(i=0;i<NUM;i++) //显示效果:上滚屏
{
for(j=0;j<16;j++)
{
for(k=0;k<15;k++)
{
huancun[k*BLKN]=huancun[(k+1)*BLKN]; //左列
huancun[k*BLKN+1]=huancun[(k+1)*BLKN+1]; //右列
}
huancun[30]=Cmp[(i+1)%NUM][j*BLKN];
huancun[31]=Cmp[(i+1)%NUM][j*BLKN+1];
delay(70);
}
}
delay(1000); //控制显示的停留时间
}
/***********************向下移动函数**********************************/
void todown()
{
register unsigned char i,j,k;
for(i=0;i<32;i++) //显示效果:半屏卷帘
{
huancun[i]=Cmp[0][i];
if(i%2)delay(70);
}
for(i=0;i<NUM;i++) //显示效果:向下滚屏
{
for(j=16;j>0;j--)
{
for(k=15;k>0;k--)
{ huancun[k*BLKN]=huancun[(k-1)*BLKN];
huancun[k*BLKN+1]=huancun[(k-1)*BLKN+1];
}
huancun[0]=Cmp[(i+1)%NUM][(j-1)*BLKN];
huancun[1]=Cmp[(i+1)%NUM][(j-1)*BLKN+1];
delay(70);
}
}
delay(1000); //控制显示的停留时间
}
/****************************向左移动**************************************/
void toleft()
{
register unsigned char i,j,k,l;
for(i=0;i<32;i++) //显示效果:半屏卷帘
{
huancun[i]=Cmp[0][i];
if(i%2)delay(70);
}
for(i=0;i<NUM;i++) //显示效果,左移动显示
{
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{ huancun[l*BLKN]=huancun[l*BLKN]<<1|huancun[l*BLKN+1]>>7;
huancun[l*BLKN+1]=huancun[l*BLKN+1]<<1|Cmp[(i+1)%NUM][l*BLKN+j]>>(8-k);
}
delay(70);
}
}
delay(1000); //控制显示的停留时间
}
/*******************************************************************/
void toright()
{
register unsigned char i,j,k,l;
for(i=0;i<32;i++) //显示效果:半屏卷帘
{
huancun[i]=Cmp[0][i];
if(i%2)delay(70);
}
for(i=0;i<NUM;i++) //显示效果,向右移动显示
{
for(j=2;j>0;j--)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
huancun[l*BLKN+1]=huancun[l*BLKN+1]>>1|huancun[l*BLKN]<<7;
huancun[l*BLKN]=huancun[l*BLKN]>>1|Cmp[(i+1)%NUM][l*BLKN+j-1]<<(8-k);
}
delay(70);
}
}
delay(1000); //控制显示的停留时间
}
/***************************静态卷帘显示函数****************************/
void jing() //卷帘显示
{
register unsigned char ii;
register unsigned char i;
for(ii=0;ii<NUM;ii++)
{
for(i=0;i<32;i++) //显示效果:卷帘出
{
huancun[i]=Cmp[ii][i];
if(i%2)delay(70); //取两个数据(一行),延时一次
}
delay(100); //控制显示的停留时间
}
}
/******************************字模***************************/
unsigned char code Cmp[][32]={
/*---------------笑脸----------------*/
{0xf8,0x3f,0xe7,0xcf,0xdf,0xf7,0xbf,0xfb,0xb3,0x9b,0x73,0x9d,0x7f,0xfd,0x7f,0xfd,
0x6f,0xed,0x67,0xcd,0xb3,0x9b,0xb8,0x3b,0xdf,0xf7,0xe7,0xcf,0xf8,0x3f,0xff,0xff},
/*---------------学----------------*/
{0xFE,0xF7,0xEF,0x73,0xF3,0x37,0xF7,0x6F,0x80,0x01,0xBF,0xFB,0x70,0x17,0xFF,0xBF,
0xFF,0x7F,0x80,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFD,0x7F,0xFE,0xFF},
/*---------------习----------------*/
{0xFF,0xFF,0xC0,0x03,0xFF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFC,0xFB,0xFE,0xEB,0xFF,0x9B,
0xFE,0x7B,0xF9,0xFB,0xC7,0xFB,0xEF,0xFB,0xFF,0xFB,0xFF,0xDB,0xFF,0xEB,0xFF,0xF7},
/*---------------单----------------*/
{0xF7,0xDF,0xF9,0xCF,0xFB,0xBF,0xC0,0x07,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,
0xC0,0x07,0xDE,0xF7,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF},
/*---------------片----------------*/
{0xFF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0xBB,0xE0,0x01,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,
0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xDF,0xEF,0xDF,0xEF,0xBF,0xEF,0x7F,0xEF},
/*---------------机----------------*/
{0xEF,0xFF,0xEF,0x07,0xEF,0x77,0x01,0x77,0xEF,0x77,0xEF,0x77,0xC7,0x77,0xCB,0x77,
0xAB,0x77,0xAF,0x77,0x6E,0xF7,0xEE,0xF5,0xED,0xF5,0xED,0xF5,0xEB,0xF9,0xEF,0xFF}};
第一,写一段程序保证能依次点亮点阵上的每一个点。
第二,将“08自动化毕业设计张少鹏”几个字,用字模软件取出它的16X16编码。
第三,将字模编码,拷入到程序中,然后用写好的程序依次调用字模的每个编码。
最后,在程序中加个大循环,不断的重复这些字。一切OK。
参考资料: 百度一下