点阵屏的移动显示
- 格式:docx
- 大小:16.23 KB
- 文档页数:7
点阵屏的移动显示
/*--------16*16点阵屏的移动显示------------*/
#include <reg51.h>
#include <intrins.h>
#define DATE_OUT P2 //指定P2口做为输出
sbit DATA=DATE_OUT^0; //列数据输出位
sbit SCLH=DATE_OUT^1; //列扫描时钟位
sbit SCLT=DATE_OUT^2; //列数据锁存位
sbit AB =DATE_OUT^3; //行数据输出位
sbit SCK =DATE_OUT^4; //行扫描时钟位
unsigned char date[32];//32字节RAM做为16*16点阵屏显示缓存
void display();//做为点阵扫描函数,将显示缓存的数据输出到点阵屏
void display_time(unsigned int timer); //指定时间扫描显示
void displaymove(unsigned char *lp,unsigned char c,unsigned char timer);//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,
//timer是移动的速度
void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer);
//上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度
void delay(unsigned int a);//延时子函数
//非常好用的字摸软件PCtoLCD2002完美版 字模选项:阴码、逐行式、顺向
code unsigned char yu[32]={
0x00,0x00,0x7E,0xFC,0x02,0x04,0x02,0x04,0x22,0x44,0x12,0x24,0x12,0x24,0x06,0x04,
0x0A,0x14,0x12,0x24,0x62,0xC4,0x02,0x04,0x02,0x04,0x02,0x04,0x0A,0x14,0x04,0x08/*"羽",0*/};
code unsigned char yi[32]={
0x7E,0xF8,0x12,0x48,0x0A,0x28,0x12,0x18,0x22,0x28,0x1F,0xF0,0x11,0x10,0x1F,0xF0,
0x11,0x10,0x1F,0xF0,0x08,0x20,0x7F,0xFC,0x08,0x20,0xFF,0xFE,0x18,0x30,0x60,0x0C/*"翼",0*/};
code unsigned char dian[32]={
0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x00/*"电",0*/};
code unsigned char zi[32]={
0x00,0x00,0x3F,0xF0,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x04,
0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00/*"子",0*/};
code unsigned char gong[32]={
0x00,0x00,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00/*"工",0*/};
code unsigned char zuo[32]={
0x08,0x80,0x0C,0x80,0x09,0x00,0x13,0xFE,0x12,0x80,0x34,0x88,0x50,0xFC,0x90,0x80,
0x10,0x80,0x10,0x84,0x10,0xFE,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80/*"作",1*/};
code unsigned char shi[32]={
0x02,0x00,0x01,0x00,0x3F,0xFE,0x20,0x04,0x40,0x08,0x3F,0xFC,0x04,0x00,0x08,0x20,
0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00/*"室",2*/};
void main(void) //主入口函数
{
unsigned char i=0,j=0;
for(i=0;i<32;i++)
date=yu;//将"羽"复制到显示缓存
while(1){
display_time(2); //显示约2秒
displaymove(yi,6,7);//将从"翼"开始的六个汉字从右向左移动 display_time(1); //等持约1秒
displaymovetb(1,0,10); //将点阵上显示的内容向下以10的速度移出,补上0,即清空显示屏
display_time(1); //等待1秒
displaymovetb(0,yu,10); //将"羽"字以10的速度向上移动
displaymovetb(0,yi,10); //将"翼"字以10的速度向上移动
displaymovetb(0,dian,10); //将"电"字以10的速度向上移动
displaymovetb(0,zi,10); //将"子"字以10的速度向上移动
displaymovetb(0,gong,10); //将"工"字以10的速度向上移动
displaymovetb(0,zuo,10); //将"作"字以10的速度向上移动
displaymovetb(0,shi,10); //将"室"字以10的速度向上移动
displaymovetb(0,0,10); //以10的速度向上清空
display_time(1); //等待1秒
displaymovetb(1,yu,10); //将"羽"字以10的速度向下移动
}
}
void display()//显示
{
unsigned char i,ia,j,tmp; //定义变量
DATE_OUT=0XFF; //置位高电平做准备
AB=0; //将行数据位清0,准备移位
for(i=0;i<16;i++){ //循环输出16行数据
SCK=0; //为行移位做准备
SCLT=0; //为列锁存做准备
for(ia=2;ia>0;){ //每行16个点,循环位移两个字节
ia--; //循环两次
tmp=~date[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成,
//电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
for(j=0;j<8;j++){ //循环两次,每次移一个字节,
SCLH=0; //为列移位做准备
DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
tmp>>=1; //将数据缓冲右移
一位,为下次输出做准备
SCLH=1; //将DATA上的数据移入寄存器
} //移入单字节结束
} //移入两个字节结束
DATE_OUT|=0X14; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像
//SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
//SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始
AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
//移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱