16x16点阵显示 两种显示效果(移动+卷动)

2022-12-27  

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define BLKN 2 /*列存贮器数,表示8*8led组合的行数*/

sbit E1 =P3^4; //74HC154(18)-E1 为0开列(col)输出 显示允许控制信号端口

sbit ST_CP =P3^2; //74HC595(12)-ST_CP 上升沿--移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口

sbit MR =P3^3; //74HC595(10)-MR 为0将移位寄存器的数据清0

void delay(unsigned int); //延时函数

uchar data dispram[32]; //显示缓存

uchar code bmp[][32]={ //字模表

//{

//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" "

//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

//},

{

0x00,0x08,0x00,0x08,0xF8,0x0B,0x28,0x09,0x29,0x09,0x2E,0x09,0x2A,0x09,0xF8,0xFF,

0x28,0x09,0x2C,0x09,0x2B,0x09,0x2A,0x09,0xF8,0x0B,0x00,0x08,0x00,0x08,0x00,0x00,/*"单",2*/

},{

0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x10,0x01,0x10,0x01,0x10,0x01,0x10,0x01,

0x10,0x01,0x1F,0x01,0x10,0x01,0x10,0xFF,0x10,0x00,0x18,0x00,0x10,0x00,0x00,0x00,/*"片",3*/

},{

0x08,0x04,0x08,0x03,0xC8,0x00,0xFF,0xFF,0x48,0x00,0x88,0x41,0x08,0x30,0x00,0x0C,

0xFE,0x03,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x3F,0x00,0x40,0x00,0x78,0x00,0x00,/*"机",4*/

},{

0x40,0x00,0x20,0x00,0x10,0x00,0xEC,0x7F,0x07,0x40,0x0A,0x20,0x08,0x18,0x08,0x06,

0xF9,0x01,0x8A,0x10,0x8E,0x20,0x88,0x40,0x88,0x20,0xCC,0x1F,0x88,0x00,0x00,0x00,/*"仿",5*/

},{

0x00,0x10,0x04,0x90,0x04,0x90,0x04,0x50,0xF4,0x5F,0x54,0x35,0x5C,0x15,0x57,0x15,

0x54,0x15,0x54,0x35,0x54,0x55,0xF4,0x5F,0x04,0x90,0x06,0x90,0x04,0x10,0x00,0x00,/*"真",6*/

} };

void main( )

{

uchar num,cur,tmp,nums=sizeof(bmp)/32;

//num:当前显示的文字块指针

//cur:当前文字块的断码指针(bmp)

//tmp:临时变量

//nums:总文字块数

SCON = 0x00; //串口工作模式0;移位寄存器方式

TMOD = 0x01; //定时器T0工作方式1:16位方式

TR0 = 1; //T1

P1 = 0x3f; //

IE = 0x82; //中断允许设置

while (1)

{

delay(1000); //2种效果之间的停顿

// for(tmp=0;tmp<1;tmp++) //让卷动效果只显示一次

{

//delay(2000); //延时2s 一条标语滚动一次前的延时时间

delay(100);

for(num=0;num{

for(cur=0;cur<32;cur++) //显示效果:卷帘出

{

dispram[cur]=bmp[num][cur];

if((cur % 2)==1)

delay(100);

}

delay(100);

}

}

delay(1000); //2种效果之间的停顿

// for(tmp=0;tmp<1;tmp++) //让卷动效果只显示一次

{

//delay(2000); //延时2s 一条标语滚动一次前的延时时间

delay(100);

for(num=0;num{

for(cur=31;cur<0xff;cur--)//显示效果:卷帘入 当cur为0时,再循环一次就为0xff

{

dispram[cur]=bmp[num][cur];

if((cur % 2)==0)

delay(100);

}

delay(100);

}

}

}

}


///////延时函数

void delay(uint dt)

{

uchar bt;

for(;dt;dt--)

for(bt=0;bt<255;bt++);


}


//////////显示屏扫描(定时器T0中断)函数

void leddisplay(void) interrupt 1 using 1

{

static uchar col=0;


TH0 = 0xF8; //设定显示屏刷新率62.5帧/S

TL0 = 0x30;


MR=0; //清理行输出,将移位寄存器的数据清0

MR=1;

SBUF = dispram[col*2]; //送显示数据

while(TI==0); //等待发送完毕

T1 = 0;

SBUF = dispram[col*2+1]; //送显示数据

while(TI==0); //等待发送完毕

T1 = 0;

E1 = 1; //消隐(关闭显示)

P1 = 0xF0; //行号端口清0 多余2行,但是去掉后不行

P1 = 0xF0; //行号端口清0

E1 = 0; //打开显示

ST_CP =1; //显示数据打入输出锁存器

ST_CP = 0; //锁存显示数据

P1 = col; //写入行号

col=(col+1)%16;

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。