📄 hanzixianshi.c
字号:
#include<reg51.h>
#define BLKN 2 //列锁存器数
sbit G=0x97; //痬 1.7为显示允许控制信号端日
sbit RCLK=0x96; //P1. 6为输出锁存器时钟信号端口
sbit SCLR=0X95; //P1.5为移位寄存器清0端
void delay(unsigned int); //延时函数
unsigned char data dispram[64]; //显示缓存
void main(void)
{
unsigned char code Bmp[][32]={ //字模表
{
/*-- 文字: 贺 --*/
/*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
0xF7,0xFF,0x80,0x83,0xF6,0xBB,0xF6,0xBB,0xEE,0x83,0xDA,0xBB,0xBD,0xFF,0xF0,0x0F,
0xF7,0xEF,0xF7,0x6F,0xF7,0x6F,0xF7,0x6F,0xF6,0xBF,0xFD,0xCF,0xF3,0xE3,0xCF,0xF7
},
{
/*-- 文字: 明 --*/
/*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
0xFF,0x03,0x83,0x7B,0xBB,0x7B,0xBB,0x7B,0xBB,0x03,0x83,0x7B,0xBB,0x7B,0xBB,0x7B,
0xBB,0x03,0x83,0x7B,0xFF,0x7B,0xFE,0xFB,0xFE,0xFB,0xFD,0xFB,0xFB,0xEB,0xFF,0xF7
},
{
/*-- 文字: 老 --*/
/*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
0xFD,0xFF,0xFD,0xF7,0x80,0x03,0xFD,0xF7,0xFD,0xEF,0xFD,0xDF,0x00,0x01,0xFE,0x7F,
0xFD,0xFF,0xF3,0xCF,0xCB,0x3F,0x38,0xFF,0xFB,0xFB,0xFB,0xFB,0xFC,0x03,0xFF,0xFF
},
{
/*-- 文字: 师 --*/
/*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
0xF7,0xFF,0xF4,0x01,0xB7,0xDF,0xB7,0xDF,0xB4,0x01,0xB5,0xDD,0xB5,0xDD,0xB5,0xDD,
0xB5,0xDD,0xAD,0xDD,0xAD,0xD5,0xED,0xDB,0xDF,0xDF,0xBF,0xDF,0x7F,0xDF,0xFF,0xDF
},
{
/*-- 文字: 好 --*/
/*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
0xEF,0xFF,0xEE,0x03,0xEF,0xF7,0xEF,0xEF,0x03,0xDF,0xDB,0xDF,0xDB,0xDF,0xD8,0x01,
0xBB,0xDF,0x9B,0xDF,0xE7,0xDF,0xF7,0xDF,0xEB,0xDF,0xD9,0xDF,0xBB,0x5F,0x7F,0xBF
},
{
0xf8,0x3f,0xe7,0xcf,0xdf,0xF7,0xBF,0xFB,0xB3,0x9B,0x73,0x9D,0x7F,0xFD,0x7E,0xFD,
0x6F,0xED,0x67,0xCD,0xB3,0x9B,0xB8,0x3B,0xDF,0xF7,0xE7,0xCF,0xF8,0x3F,0xFF,0xFF
} /*◎*/
};
register unsigned char i,j,k,l;
SCON=0x00; //串口工作模式0:移位寄存器方式
TMOD=0x01; //定时器T0工作方式1:16位方式
TR0=1; //启动定时器T0
P1=0x3f; //PI端口初值:允许接收、锁存、显示
IE=0x82; //允许定时器T0中断
while(1)
{
delay(2000); //延时2S
for(i=0;i<32;i++) //显示效果:卷帘出
{
dispram[i]=Bmp[5][i];
if(i%2)delay(100);
}
delay(3000);
for(i=0;i<6;i++) //显示效果:上滚屏
{
for(j=0;j<16;j++)
{
for(k=0;k<15;k++)
{
dispram[k*BLKN]= dispram[(k+1)*BLKN];
dispram[k*BLKN+1]=dispram[(k+1)*BLKN+1];
}
dispram[30]=Bmp[i][j*BLKN];
dispram[31]=Bmp[i][j*BLKN+1];
delay(100);
}
}
delay(3000);
for(i=0;i<6;i++) //显示效果:左跑马
{
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<32;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]<<1|Bmp[i][l*BLKN+j]>>(8-k);
}
delay(100);
} //end(k=0;k<16;k++)
} //end f0r(i=0; i<6;i++)
delay(3000);
for(i=0;i<32;i++) //显示效果:卷帘入
{
dispram[i]=0x00;
if(i%2)delay(100);
}
} //end while(1)
}
/*延时函数*/
void delay(unsigned int dt)
{
register unsigned char bt;
for(;dt;dt--)
for(bt=0;bt<255;bt++);
}
/*显示屏扫描(定时器T0中断)函数*/
void leddisplay(void)interrupt 1 using 1
{
register unsigned char i,j=BLKN;
TH0=0xFc; //设定显示屏刷新率62 5帧/s(12MHz)
TL0=0x18;
//TH0=0xF8; //设定显示屏刷新率62 5帧/s(24MHz)
//TL0=0x30;
i=P1; //读取当前显示的行号
i=++i&0x0f; //行号加l,屏蔽高4位
do{
j--;
SBUF=dispram[i*BLKN+j]; //送显示数据
while(!TI);
TI=0;
}
while(j); //完成一行数据的发送
j=BLKN;
do{
j--;
SBUF=dispram[i*BLKN+j]; //送显示数据
while(!TI);
TI=0;
}
while(j); //完成一行数据的发送
G=1; //消隐(关闭显示)
P1&=0xf0; //行号端口清0
RCLK=1; //最示数据打入输出锁存器
P1|=i; //写入行号
RCLK=0; //锁存显示数据
G=0; //打开显示
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -