点阵屏的移动显示

  • 格式: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的出现,否则显示出乱