#include<reg52.h>
#define BLKN 8//列锁存数(为LED显示字数*2)
#define TOTAL 4//待显示字个数,本例共四个
#define CONIO P1//显示控制口
sbit G=CONIO^7;//为154译码器显示允许控制信号,0时输出,1时输出全为高请求高阻态
sbit CLK=CONIO^6;//为595输出锁存器时钟信号端,1时输出数据,从1到0时锁存输出数据
sbit SCLR=CONIO^5;//为595移位寄存器清0口,平时为1,为0时,输出全为0
unsigned char idata dispram[(BLKN/2)*32]={0};//显示区缓存,4字共4*32
//*****************字模表*********************//
unsigned char code Bmp[][32]={
{0x06,0x08,0x78,0x88,
0x08,0x48,0x08,0x48,
0xFE,0x08,0x18,0x88,
0x1C,0x48,0x2A,0x48,
0x28,0x0E,0x48,0x78,
0x8B,0x88,0x08,0x08,
0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0x08},/*"科",0*/
{0x10,0x20,0x10,0x20,
0x10,0x20,0xFD,0xFE,
0x10,0x20,0x14,0x20,
0x19,0xFC,0x31,0x08,
0xD0,0x88,0x10,0x90,
0x10,0x60,0x10,0x60,
0x10,0x90,0x11,0x0E,
0x56,0x04,0x20,0x00,},/*"技",1*/
{0x01,0x00,0x00,0x80,
0x3F,0xFE,0x28,0x04,
0x46,0x88,0x04,0x80,
0x08,0x80,0x06,0x80,
0x04,0x80,0x7F,0xFE,
0x00,0x80,0x01,0x40,
0x02,0x20,0x04,0x10,
0x18,0x18,0x60,0x10,},/*"实",2*/
{0x41,0x04,0x21,0x24,
0x31,0x24,0x21,0x24,
0x01,0x24,0x01,0x24,
0xF1,0x24,0x11,0x24,
0x11,0x24,0x11,0x24,
0x11,0x24,0x11,0x24,
0x15,0x24,0x1A,0x24,
0x12,0x24,0x04,0x04,},/*"训",3*/
};
//*****************字模表*********************//
unsigned char code Bmp1[][32]={
{0x01,0x00,0x01,0x00,0x01,0xF8,0x01,0x00,0x01,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,
0x10,0x10,0x1F,0xF0,0x10,0x10,0x01,0x10,0x28,0x88,0x24,0x44,0x44,0x44,0x00,0x00},/*"点",0*/
{0x00,0x80,0xF8,0x80,0x88,0x80,0x97,0xFC,0xA1,0x00,0x91,0x40,0x8A,0x40,0x8F,0xFC,
0x88,0x40,0xA8,0x40,0x97,0xFE,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40},/*"阵",1*/
{0x20,0x90,0x20,0x90,0x27,0xFC,0x20,0x90,0xFB,0xF8,0x22,0x08,0x73,0xF8,0x6A,0x08,
0xA3,0xF8,0xA0,0x40,0x27,0xFE,0x20,0x40,0x20,0xA0,0x20,0x98,0x21,0x0E,0x26,0x04},/*"模",2*/
{0x20,0x80,0x20,0x80,0x20,0x80,0x23,0xF8,0xF8,0x88,0x20,0x88,0x20,0x88,0x20,0x88,
0x2F,0xFE,0x20,0x80,0x39,0x40,0xE1,0x20,0x42,0x18,0x02,0x0E,0x04,0x04,0x08,0x00},/*"块",3*/
};
/*************延时函数(约1ms)**************/
void delay(unsigned int dt)
{
register unsigned char bt;
for (;dt;dt--)
for(bt=0;bt<255;bt++);
}
/***********主函数**********/
void main(void)
{
register unsigned char i,j,k,l,q,w;
//初始化
SCON=0X00;//串口工作模式0:移位寄存器方式
TMOD=0X01;//定时器T0工作方式1:16位方式
TR0=1;//启动定时器T0
CONIO=0x3f;//初始化控制口
IE=0x82;//允许定时器T0中断
while(1)
{
delay(2000);//2s
//第一种显示效果:卷帘出显示笑脸图案
/*for(i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++){dispram[i+q*32]=Bmp1[5][i];}
if(i%2)delay(120);
}
delay(1000);*/
//卷帘出显示文字,每次字数为BLKN/2,共显示TOTAL*2/BLKN次
for (w=0;w<TOTAL*2/BLKN;w++)
{
for(i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++){dispram[i+q*32]=Bmp[q+w*BLKN/2][1];}
if(i%2)delay(120);
}
delay(3000);
}
//第一种显示效果:卷帘出显示笑脸图案
/*for(i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++){dispram[i+q*32]=Bmp1[5][i];}
if(i%2)delay(120);
}
delay(1000);*/
//第一种显示效果:向上滚屏,每次BLKN/2个字
for(i=0;i<TOTAL*2/BLKN;i++)
{
for (j=0;j<16;j++)
{
for(k=0;k<15;k++)
{
for(q=0;q<BLKN/2;q++)
{dispram[k*2+q*32]=dispram[(k+1)*2+q*32];
dispram[k*2+1+q*32]=dispram[(k+1)*2+1+q*32];}
}
for(q=0;q<BLKN/2;q++)
{dispram[30+q*32]=Bmp[q+i*BLKN/2][j*2];dispram[31+q*32]=Bmp[q+i*BLKN/2][j*2+1];}
delay(100);
}
delay(3000);//滚动暂住
}
//第一种显示效果:卷帘出黑屏
for(i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++){dispram[i+q*32]=0xff;}
if(i%2)delay(120);
}
delay(1000);
//第三种显示效果:左移出显示
for(i=0;i<TOTAL;i++)
{
for (j=0;j<2;j++)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
for(q=0;q<BLKN/2;q++)
{
dispram[l*2+q*32]=dispram[l*2+q*32]<<1|dispram[l*2+1+q*32]>>7;
if(q==BLKN/2-1)dispram[l*2+1+q*32]=dispram[l*2+1+q*32]<<1|Bmp[i][l*2+j]>>(7-k);
else dispram[l*2+1+q*32]=dispram[l*2+1+q*32]<<1|dispram[l*2+(q+1)*32]>>7;
}
}
delay(100);
}
}
delay(3000);
//第一种显示效果:卷帘出黑屏
for(i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++){dispram[i+q*32]=0xff;}
if(i%2)delay(120);
}
delay(1000);
}
}
//主函数结束
/**********显示屏扫描(定时器T0中断)函数******************/
void leddisplay(void)interrupt 1 using 1
{
register unsigned char m,n=BLKN;
TH0=0xFc;
TL0=0x18;
m=CONIO;
m=++m&0x0f;
do{
n--;
SBUF=dispram[m*2+(n/2)*30+n];
while(!TI);TI=0;
}while(n);
G=1;
CONIO&=0xf0;
CLK=1;
CONIO|=m;
CLK=0;
G=0;
}
- 1
- 2
- 3
- 4
- 5
前往页