点阵屏的移动显示
8x8LED点阵屏仿电梯数字滚动显示说明书
湄洲湾职业技术学院8*8LED点阵屏仿电梯数字滚动显示说明书系部:自动化工程系年级: 10 级专业:电气自动化应用技术姓名:郑沁杰学号: 1001020205导师姓名:郑德山职称:副教授2013 年 05 月 26 日目录1.前言 (1)2.系统设计技术参数要求 (2)3.系统设计 (3)3.1 系统设计总框图 (3)3.2 各模块原理说明 (4)3.3系统原理说明 (5)3.4 系统操作说明 (5)3.5系统操作注意事项 (6)4.参考文献 (7)5. 致谢词 (8)6.附录 (9)6.1元件清单 (9)6.2系统原理图 (10)6.3 PCB原理设计 (11)6.4 系统程序 (11)1.前言LED市场比较好,但是现在市场竞争也比较激烈,和做其他产品差不多。
LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。
在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法。
本文设计的是一个用8x8的点阵LED图文显示屏,图形或文字显示有静止、移入移出显示方式。
LED点阵显示屏作为一种新兴的显示器件,是由多个独立的LED发光二极管封装而成. LED点阵显示屏可以显示数字或符号, 通常用来显示时间、速度、系统状态等。
文章给出了一种基于MCS-51单片机的8×8 点阵LED显示屏的设计方案。
包括系统具体的硬件设计方案,软件流程图和部分汇编语言程序等方面。
在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。
它用高亮度发光二极管芯阵列组合后,环氧树脂与塑模封装而成。
具有高亮度,功耗低,引脚少,视角大,寿命长,耐湿,耐冷热,耐腐蚀等特性,LED显示屏以突出的优势成为平板显示的主流产品之一。
LED这一显示产品使用在我们日常的生活中扮演者越来越重要的角色。
点阵屏的移动显示
点阵屏的移动显示/*--------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,0x0 4,0x0A,0x14,0x12,0x24,0x62,0xC4,0x02,0x04,0x02,0x04,0x02,0x04,0x0A,0x14,0x04,0x 08/*"羽",0*/};code unsigned char yi[32]={0x7E,0xF8,0x12,0x48,0x0A,0x28,0x12,0x18,0x22,0x28,0x1F,0xF0,0x11,0x10,0x1F,0xF 0,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,0x0 8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x0 0/*"电",0*/};code unsigned char zi[32]={0x00,0x00,0x3F,0xF0,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x0 4,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x0 0/*"子",0*/};code unsigned char gong[32]={0x00,0x00,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x0 0,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x0 0/*"工",0*/};code unsigned char zuo[32]={0x08,0x80,0x0C,0x80,0x09,0x00,0x13,0xFE,0x12,0x80,0x34,0x88,0x50,0xFC,0x90,0x8 0,0x10,0x80,0x10,0x84,0x10,0xFE,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x8 0/*"作",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的出现,否则显示出乱}j=64;while(j--); //每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度SCK=0; //SCK=1; //将最后一行数据移出}void display_time(unsigned int timer) //指定时间扫描显示{unsigned char i;while(timer--){ //当timer=1时,大约1秒时间i=130;while(i--)display();}}void displaymove(unsigned char *lp,unsigned char c,unsigned char timer)//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,//timer是移动的速度{unsigned char i=0,j=0,ia=0;unsigned int tmp=0,timerc=0;unsigned char tmp2[16];c*=2; //因一个汉字由32字节组成,而移位显示,要分开半个汉字16字节处理,因此将这里乘以2for(i=0;i<16;i++)tmp2[1]=0; //将缓冲区清0,while(c){ //循环处理if(lp!=0){ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份for(i=0;i<16;i++){tmp2=lp[i*2+tmp]; //取半个汉字点阵数据,16字节}if(tmp) //当tmp为1时,表时一个字数组处理完成,将地址转到下一个字lp+=32;}//--------------tmp=8; //变量再次利用while(tmp){ //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲ia=0; //做为点阵数组的元素for(i=0;i<16;i++){//移动是16行同时移,因此要处理16个字节date[ia]<<=1; //移当前显示缓冲的前半行字节if(date[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理date[ia]++;ia++;date[ia]<<=1; //移当前显示缓冲的后半行字节if(tmp2&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理date[ia]++;ia++;tmp2<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位}tmp--;timerc=timer; //处理完16行,调用显示函数更新点阵while(timerc--) //循环做为处理的速度,即移动的速度display();}//----------c--; //移完一半,进入下一半或下一个汉字,直到结束}}void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer)//上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度{unsigned char i=0,j=0,ia=0;unsigned int tmp=0,timerc=0;if(din){ //判断移动方向,向下ia=32; //要移入第一个汉字的数组元素i=16; //行索引while(i--){ //逐行处理j=30;while(j){j--;date[j+2]=date[j]; //将上一行的内容复制到下一行,每两行内容相隔四个字节,复制15行}if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入date[0]=0;date[1]=0;}else{ //否则,取字数组处理ia--;date[1]=lp[ia];ia--;date[0]=lp[ia];}timerc=timer; //处理完16行,调用显示函数更新点阵while(timerc--) //循环做为处理的速度,即移动的速度display();}}else{ //移动方向,向上ia=0; //向上移动,移入汉字从低位开始for(i=0;i<16;i++){ //处理16行for(j=0;j<30;j++) //将下一行的内容复制到上一行,每两行内容相隔四个字节,复制15行date[j]=date[j+2];if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入date[30]=0;date[31]=0;}else{ //否则,取字数组处理date[30]=lp[ia];date[31]=lp[ia+1];ia+=2;}timerc=timer; //处理完16行,调用显示函数更新点阵while(timerc--) //循环做为处理的速度,即移动的速度display();}}}void delay(unsigned int a) //延时{while(a--);}。
点阵显示左移和不动程序
×点阵显示左移和不动程序显示左移的程序(串行送数据)#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define SCAN P2 //行驱动接到P2sbit SHCP=P1^0; //595 CLKsbit STCP=P1^1; //595 STRsbit DR=P1^2; //红色sbit DG=P1^3; //绿色sbit ENT=P1^4; //595 OE/Guint word; //字模计数器uchar move; //列指针uchar line; //行指针uchar speed=10; //设定移动速度uchar BUF[12]; //缓存数组uchar code disp[]; //字模数组/********************装载一线点阵数据********************/ void loadline(){uchar s;for(s=0;s<5;s++) //s为要显示的字数+1{BUF[2*s]=disp[word+32*s+2*line];BUF[2*s+1]=disp[word+1+32*s+2*line];}}/********************发送一线移动数据********************/ void sendline(){char s,p;uchar inc,k,j;if(move<8)inc=0;else inc=1;for(s=0+inc;s<=7+inc;s++){if(move<8)j=move;else j=move-8;k=(BUF[s]<<j)|(BUF[s+1]>>(8-j)); //字模左边字节左移j位,右边字节右移j位,2者相或for(p=0;p<8;p++){ DR=(k&0x80); //选择红色显示SHCP=0; //595时钟信号,产生脉冲SHCP=1;k<<=1;//左移一位}}}void main(){char s;uint k;uchar i,y=0;move=0;word=0;ENT=0;ENT=1; //清屏while(1){while(word<448) //(4+10)*32=448{while(move<16) //数据移位{for(i=0;i<speed;i++) //移动速度{for(line=0;line<16;line++) //行扫描{loadline(); //装载一线点阵数据sendline(); //发送一线移动数据SCAN=line; //显示第line行STCP=1; //锁存为高,595锁存信号STCP=0;}}move++; //移动一步(一位)}move=0;word=word+32; //下一个字}word=0;}}uchar code disp[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*前面四字位置空白显示*/0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/////////////////////////////////////////////////////////////////////////////////* (16 X 16 , 宋体)*/0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0x7F,0xFB,0xBF,0xF7,0xDF,0xEF,0xEF,0xDF,0xF7,0xBF,0xFB,0xFF,0xFF,/*"大",8*//* (16 X 16 , 宋体)*/0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x80,0x03,0xFF,0xFF,0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,/*"吉",9*//* (16 X 16 , 宋体)*/0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0x7F,0xFB,0xBF,0xF7,0xDF,0xEF,0xEF,0xDF,0xF7,0xBF,0xFB,0xFF,0xFF,/*"大",10*//* (16 X 16 , 宋体)*/0xFF,0xFD,0xF8,0x7D,0xC3,0xFD,0xFB,0xED,0xFB,0xED,0x80,0x6D,0xFB,0xED,0xFB,0xED,0xF1,0xED,0xEA,0xED,0xDB,0x6D,0xBB,0xAD,0xFB,0xFD,0xFB,0xF5,0xFB,0xF9,0xFF,0xFF,/*&q uot;利",11*//* (16 X 16 , 宋体)*/0xEF,0xFF,0xF7,0x81,0x80,0xBF,0xDD,0xBF,0xEB,0xBF,0x00,0x81,0xF7,0xB7,0xF7,0xB7,0x00,0xB7,0xF7,0xB7,0xE3,0xB7,0xD5,0xB7,0xB6,0xB7,0xE7,0xB7,0xF7,0xB7,0xFF,0xFF,/*&qu ot;新",12*//* (16 X 16 , 宋体)*/0xF7,0xFF,0xF0,0x03,0xF7,0x7F,0xEF,0x7F,0xDF,0x7F,0xB0,0x07,0x77,0x7F,0xF7,0x7F,0xF7,0x7F,0xF7,0x7F,0x00,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,/*"年",13*//* (16 X 16 , 宋体)*/0xEF,0xBF,0xEF,0xBF,0xEF,0xBF,0xC4,0x03,0xAB,0xBB,0x6D,0xBB,0xEF,0xBB,0xE8,0x00,0xEF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0x5F,0xEE,0xEF,0xED,0xF7,0xEB,0xFB,0xEF,0xFF,/*"快",14*//* (16 X 16 , 宋体)*/0xFF,0xFF,0xE0,0x07,0xEF,0xFF,0xEF,0x7F,0xEF,0x7F,0xEF,0x7F,0xE0,0x03,0xFF,0x7F,0xFF,0x7F,0xFB,0x6F,0xF7,0x77,0xEF,0x7B,0xDF,0x7D,0xBD,0x7E,0xFE,0xFF,0xFF,0xFF,/*"乐",15*//* (16 X 16 , 宋体)*/////////////////////////////////////////////////////////////////////////////////0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*结束后面五字空白显示*/0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};显示不动(静态显示)的程序(串行送数据)#include "reg52.h"#define uchar unsigned char#define uint unsigned intvoid Keyscan (void); //修改参数按键扫描子程序void Sendping(); //发送半屏子程序sbit CLK =P1^0 ; //74HC595移时钟sbit STB =P1^1 ; // 74HC595锁存信号sbit Red=P1^2 ; //红色数据输出引脚低电平有效sbit Greed=P1^3; //全屏控制使能0,低电平有效sbit EN = P1^4; //全屏使能uchar SendData; //要发送的数据变量uchar shuzu1; //数组一维变量uchar shuzu2; //数组二维变量uchar hang; //行扫描变量(半屏只有16行,所以hang=0到15)void delay(){uint i;for(i=0;i<40;i++);}uchar code data1[8][32]={{//圣[16*16]横排0x00,0x00,0x3F,0xF8,0x10,0x10,0x0C,0x60,0x02,0x80,0x01,0x00,0x02,0xC0,0x0C,0x30,0x31,0x0E,0xC1,0x24,0x1F,0xF0,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00}, {//诞[16*16]横排0x00,0x08,0x40,0x1C,0x2F,0x70,0x21,0x10,0x02,0x10,0x04,0x10,0xEF,0x5C,0x21,0x50,0x29,0x50,0x25,0x50,0x22,0x50,0x2A,0x7C,0x33,0x00,0x24,0x80,0x08,0x46,0x10,0x3C}, {//快[16*16]横排0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x88,0x5B,0xFC,0x54,0x88,0x50,0x88,0x90,0x88,0x10,0x88,0x1F,0xFE,0x10,0x80,0x11,0x40,0x11,0x20,0x12,0x10,0x14,0x0E,0x18,0x04}, {//乐[16*16]横排0x00,0x20,0x00,0xF0,0x1F,0x00,0x10,0x00,0x11,0x00,0x11,0x00,0x21,0x04,0x7F,0xFE,0x01,0x00,0x01,0x00,0x09,0x20,0x09,0x10,0x11,0x08,0x21,0x0C,0x45,0x04,0x02,0x00}, };//------------------------------------//----------字发送子程序-----------void SendByte(void){uchar m;for(m=0;m<8;m++){CLK = 0;Red = !(SendData & 0x80); //红屏显示Greed = !(SendData & 0x80); //红屏显示SendData =SendData<<1;CLK = 1; //移位时钟上升沿}}//-----------------------------------//----------行扫描子程序-------------void RowsCan(void){if (hang>=16){hang =0x00;}P2= P2 & 0xf0;P2= P2 | hang;hang++;}void SendHang(void){uchar m2,shuzu;shuzu = shuzu1*4; //一维数组变量参数传给数组变量EN=1;for(shuzu=0;shuzu<4;shuzu++){for(m2 =0;m2<2;m2++){SendData = data1[shuzu][shuzu2+m2];SendByte();}}STB = 0;STB = 1; //上升沿数据锁存RowsCan(); //行扫描EN = 0;delay();}//---------------------------------------//----------发送一屏数据-----------------void Sendping(void){SendHang();shuzu2++ ;shuzu2++ ;if(shuzu2 ==32) { shuzu2 =0;}}void initial(void){EN = 1;Red = 1;Greed = 1;SendData = 0x00;hang = 0x00;}//;---------主程序循环-------------- void main(){initial();while(1){Sendping();}}。
任务三点阵显示屏移位显示数字课件
人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。
项目四
LED点阵屏广告牌制作
任务三
点阵显示屏移位显示数字
任务三 LED点阵显示屏移位显示数字
任务要求
任务分析
硬件电路的 设计与搭建
软件编写
任务实施
任务书:
• 使用YL-236单片机实训考核 装置显示模块中的LED点阵显 示屏单元,上电后点阵显示 屏向左移位循环显示 “123456780”,其中数字的 点阵大小为8×16。显示效果 左图所示。
3、程序说明
(1)程序中设立了数字字符的字模索引数组szindex[],该数组的内容 就是对应的数字字模在二维数组中的行编号。函数通过搜索索引来查 找对应的字符的字模并返回其编号,这样定位字符的字模不仅不易出 错,而且函数的通用性强、调用方便了。这种方法也适用于对汉字等 字符的搜索。 (2)查找字符串并送显示缓冲区子函数get_char( )中,调用C51库函 数strlen()来计算要显示的字符串的长度。字符上加入引号表示是它一 个字符串,字符串使用szindex[i]!=0来判断字符串是否搜索到最后。循 环中使用j=(j+1)%len是为了当字符递增到最后一个字符后能够返回第 一个字符。 (3)变量count的值决定了要显示字符串的位置,其递增的速度决定 了字符移动的速度。
硬件电路的设计与搭建
1、硬件电路设计 2、绘制模块接线图
led点阵滚动显示原理
led点阵滚动显示原理
Led点阵滚动显示的原理是通过控制各个LED灯的亮灭来显
示出特定的图像或文字。
在点阵显示屏上,每个LED灯都代
表一个像素点,通过同时开启或关闭多个LED灯,可以组合
成不同的形状和图案。
滚动显示是通过逐个像素点的变化来实现的。
首先,需要将要显示的文字或图像通过编程转化为一个个点阵的位图,其中每个点代表一个LED灯的亮灭状态。
然后,通过定时器或者其
他时钟信号,控制LED灯按照一定的顺序进行刷新。
具体的滚动显示过程如下:首先,显示屏幕上的LED点阵全
部熄灭;然后,按照事先设定好的顺序,逐个点亮LED灯,
形成一个移动的图像或文字;接着,根据设定的显示速度和滚动方向,将已显示的LED灯逐个熄灭,并同时点亮下一个需
要显示的LED灯,如此循环往复,直至显示完整个图像或文字。
通过不断地重复上述的点亮和熄灭过程,使得LED点阵显示
屏上的图像或文字能够以滚动的方式连续变化,从而实现了滚动显示效果。
需要注意的是,在滚动显示的过程中,需要保持刷新频率足够高,以确保人眼不能察觉到每个LED灯的亮灭变化,从而产
生流畅的滚动效果。
此外,还需要合理设计点亮和熄灭的顺序,以及滚动的速度和方向,以适应不同的显示要求和观看效果。
LED点阵屏从上向下滚动显示
LED点阵屏从上向下滚动显示!!!!!LED点阵屏,我用四块8×8组成的8×32点阵。
做了个时钟,显示时间,年,月,日和星期五种状态用下移切换。
程序写的不好,还请各位多多指教。
视频在/play.php?v=mlcHH8qtdSK可以看到!!!!!!!!过几天把图一起传上来。
#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define off 0#define on 1/*sfr P1M0=0x91;sfr P1M1=0x92;sfr P3M0=0xb1;sfr P3M1=0xb2;*/sbit aa=P1^0;sbit ab=P1^1;sbit ac=P1^2;sbit ag=P1^3;sbit ba=P1^4;sbit bb=P1^5;sbit bc=P1^6;sbit bg=P1^7;sbit ca=P2^0;sbit cb=P2^1;sbit cc=P2^2;sbit cg=P2^3;sbit da=P2^4;sbit db=P2^5;sbit dc=P2^6;sbit dg=P2^7;sbit onekey=P3^3;sbit twokey=P3^2;sbit threekey=P3^5;sbit fourkey=P3^4;sbit bt=P3^6;sbit bbt=P3^7;bit keystoke;bit secdisplay;bit down;bit up;bit key_adjust;uchar auttch;uchar cgb,hour,min,sec,lb,day,month,days,counter,tier,displaycount,x; uchar downcount,autotch,days,week,clockkey,cgb,mov,yearb,yearctch_tim er;uint c,ccc,year,yeara;uchar code displaycode[32]={0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,0 x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x00,0x01,0x02,0x03 ,0x04,0x05,0x06,0x07};//32个位uchar code abc[6][6]={{0x24,0x3A,0x2B,0xFE,0x2A,0x2A},//年{0xFC,0x54,0xFC},//月{0xFC,0x94,0xFC},//日{0x7F,0x80,0x7F,0x7F,0x80,0x7F},//W{0xFF,0x89,0x89,0x81},//E{0xFF,0x14,0x22,0x41,0x80}};//Kuchar code count[10][6]={{0x7E,0x81,0x81,0x81,0x81,0x7E},//0{0x00,0x00,0x82,0xFF,0x80,0x00},//1{0xE2,0x91,0x91,0x91,0x91,0x8E},//2{0x42,0x89,0x89,0x89,0x89,0x76},//3{0x30,0x28,0x24,0x22,0xFF,0x20},//4{0x8F,0x89,0x89,0x89,0x89,0x70},//5{0x7E,0x89,0x89,0x89,0x89,0x72},//6{0x01,0x01,0xF9,0x05,0x03,0x01},//7{0x76,0x89,0x89,0x89,0x89,0x76},//8{0x4E,0x91,0x91,0x91,0x91,0x7E}};//9uchar code count1[10][6]={{0x00,0x00,0x00,0x00,0x00,0x00},//0{0x00,0x00,0x82,0xFF,0x80,0x00},//1{0xE2,0x91,0x91,0x91,0x91,0x8E},//2{0x42,0x89,0x89,0x89,0x89,0x76},//3{0x30,0x28,0x24,0x22,0xFF,0x20},//4{0x8F,0x89,0x89,0x89,0x89,0x70},//5{0x7E,0x89,0x89,0x89,0x89,0x72},//6{0x01,0x01,0xF9,0x05,0x03,0x01},//7{0x76,0x89,0x89,0x89,0x89,0x76},//8{0x4E,0x91,0x91,0x91,0x91,0x7E}};//9/******************************************************************** *********************毫秒延时程序********************************************************************* ********************/void delay(uchar i){uchar a,b;while(i--){for(a=0;a<5;a++)for(b=0;b<5;b++);}}/******************************************************************** ********************定时器0的中断程序********************************************************************* ********************/void t0(void)interrupt 1 using 1{ TH0=0x4c;TL0=0x00;counter++; //计数器20ms加1,一直加50次到1s//if(count==10)//secdisplay=!secdisplay;if(counter==20) //如果count到250{counter=off; //则清0secdisplay=!secdisplay;if(key_adjust)auttch++;//lb=off;sec++;} //秒加1if(sec==60) //如果秒到60{sec=off; //则清0min++;} //秒进位后分加1if(min==60) //如果分到60{min=off; //则清0lb=on;hour++;} //分进位后时加1if(hour==24) //如果时到24{hour=off;day++; //时清0,一天到重新开始计数,星期加一week++;}if(day==days){day=1;month++;}if(month==13){month=1;year++;}if(week==8)week=1;if(!key_adjust&&keystoke)elseif(down){if(counter%2==0)mov++;if(mov==10){mov=0;down=0;}}}/******************************************************************** ************************显示********************************************************************* ************************/void display(void){if(!clockkey){ tier++;if((tier>=1)&&(tier<=6)){bt=0;P0=count1[hour/10][displaycount]<<mov;//1P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=8)&&(tier<=13)){bt=0;P0=count[hour%10][displaycount]<<mov;//2 P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier==15)||(tier==16)){ if(tier==15){bt=0;bbt=1;}if(tier==16){bt=1;bbt=0;}if(secdisplay){P0=0x66<<mov;//2P2=displaycode[tier];delay(x);P0=0x00;}}if((tier>=18)&&(tier<=23)){bbt=0;P2=displaycode[tier];P0=count[min/10][displaycount]<<mov;//3 delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=25)&&(tier<=30)){bbt=0;P0=count[min%10][displaycount]<<mov;//4P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if(tier<=15){bt=0;bbt=1;}else{bt=1;bbt=0;}if(tier==32){tier=0;bt=0;bbt=0;}if(auttch==7)down=1;if(((auttch>=8)&&(auttch<=11))&&(!counter)){clockkey=1;tier=0;displaycount=0;}}/******************************************************************** ******************年份显示********************************************************************* *******************/if(clockkey==1){tier++;if((tier>=26)&&(tier<=31)){bbt=0;P0=abc[0][displaycount]<<mov;//4P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=19)&&(tier<=24)){bbt=0;P0=count[year%10][displaycount]<<mov;//4 P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=13)&&(tier<=18)){if(tier<=15){bt=0;bbt=1;}if(tier>=16){bt=1;bbt=0;}P2=displaycode[tier];P0=count[yeara%10][displaycount]<<mov;//3 delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=7)&&(tier<=12)){bt=0;P0=count[yearb%10][displaycount]<<mov;//2P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=1)&&(tier<=6)){bt=0;P0=count[yearc%10][displaycount]<<mov;//1P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if(tier<=15){bt=0;bbt=1;}else{bt=1;bbt=0;}if(tier==32){tier=0;bt=0;bbt=0;}if(auttch==11)down=1;if(((auttch>=12)&&(auttch<=15))&&(!counter)){clockkey=2;tier=0;displaycount=0;}}/******************************************************************** *********************显示月份******************************************************************************************/if(clockkey==2){if(tier<=5){bt=0;P0=count1[month/10][displaycount]<<mov;//1 P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=6)&&(tier<=11)){bt=0;P0=count[month%10][displaycount]<<mov;//2 P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=13)&&(tier<=15)){bt=0;P2=displaycode[tier];P0=abc[1][displaycount]<<mov;//3delay(x);P0=0x00;displaycount++;if(displaycount==3)displaycount=0;}if((tier>=16)&&(tier<=21)){bbt=0;bt=1;P2=displaycode[tier];P0=count1[day/10][displaycount]<<mov;//3 delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=22)&&(tier<=27)){bbt=0;bt=1;P0=count[day%10][displaycount]<<mov;//4 P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=29)&&(tier<=31)){bbt=0;bt=1;P0=abc[2][displaycount]<<mov;//4P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==3)displaycount=0;}tier++;if(tier<=15){bt=0;bbt=1;}elsebbt=0;}if(tier==32){tier=0;bt=0;bbt=0;}if(auttch==15)down=1;if(((auttch>=16)&&(auttch<=19))&&(!counter)){clockkey=3;tier=0;displaycount=0;}}/******************************************************************** *********************显示星期********************************************************************* *********************/if(clockkey==3){ tier++;if((tier>=20)&&(tier<=24)){bbt=0;P0=abc[5][displaycount]<<mov;//4P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==5)displaycount=0;}if((tier>=14)&&(tier<=18)){if(tier<=15){bt=0;bbt=1;}if(tier>=16)bbt=0;}P2=displaycode[tier];P0=abc[4][displaycount]<<mov;//3delay(x);P0=0x00;displaycount++;if(displaycount==5)displaycount=0;}if((tier>=8)&&(tier<=12)){bt=0;P0=abc[4][displaycount]<<mov;//2P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==5)displaycount=0;}if((tier>=1)&&(tier<=6)){bt=0;P0=abc[3][displaycount]<<mov;//1P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if((tier>=26)&&(tier<=31)){bbt=0;P0=count[week][displaycount]<<mov;//4 P2=displaycode[tier];delay(x);P0=0x00;displaycount++;if(displaycount==6)displaycount=0;}if(tier<=15){bt=0;bbt=1;}else{bt=1;bbt=0;}if(tier==32){tier=0;bt=0;bbt=0;}if(auttch==19)down=1;if(((auttch>=20)&&(auttch<=23))&&(!counter)){clockkey=0;tier=0;displaycount=0;}}if(auttch>=24)auttch=0;}/******************************************************************** *******************按键********************************************************************* *********************/void key(void){if((!onekey)&&keystoke){keystoke=0;key_adjust=0;clockkey=0;tier=0;displaycount=0;hour++;sec=0;if(hour==24)hour=0;}if((!twokey)&&keystoke) {keystoke=0;key_adjust=0;clockkey=0;tier=0;displaycount=0;min++;sec=0;if(min==60)min=0;}if((!threekey)&&keystoke) {keystoke=0;key_adjust=0;clockkey=2;tier=0;displaycount=0;month++;if(month==13)month=1;}if((!fourkey)&&keystoke) {keystoke=0;key_adjust=0;clockkey=2;tier=0;displaycount=0;day++;if(day==days)day=0;}if((((onekey)&&(twokey))&&(threekey))&&(fourkey))keystoke=1;}/******************************************************************** *********************计算每月的日数********************************************************************* ******************/void monthcount(void){if(month==1)days=32;if(month==3)days=32;if(month==4)days=31;if(month==5)days=32;if(month==6)days=31;if(month==7)days=32;if(month==8)days=32;if(month==9)days=31;if(month==10)days=32;if(month==11)days=31;if(month==12)days=32;if(year%4!=0) //如果年不能被4整除二月份为28天,否则为29天{if(month==2)days=28;}else{if(month==2)days=29;}yeara=year/10;yearb=yeara/10;yearc=yearb/10;iftch_timer>=200){key_adjust=on; //如果按键有10秒钟没按下就自动退出调节状态tch_timer=off;tier=0;displaycount=0;clockkey=off;}}/******************************************************************** *********************主程序********************************************************************* ********************/void main(void){uchar a,d,i,j,l;a=d=i=j=l=0;c=0;TMOD=0x01; //定时器T0,T1工作于模试1(16位计数器)TH0=0x4c;TL0=0x00;P0=0xff;P1=0xff;P2=0xff;P3=0xff;bt=1;bbt=0;keystoke=1;c=1;ccc=0;mov=0;down=0;up=0;key_adjust=1;downcount=0;x=0x02;displaycount=0;tier=0;j=16;hour=12;min=0;sec=0;secdisplay=0;counter=0;year=2006;yeara=0;yearb=0;yearc=0;month=1;day=1;days=0;autotch=0;week=1;clockkey=0;cgb=0;auttch=0;TR0=on; //打开定时器0ET0=on; //打开T0中断EA=on;while(1){key();//yeardisplay();//monthdaydisplay();//weekdisplay();display();//hourmindisplay();//if(key_adjust)/*if(auttch<=8) //为6显示时间hourmindisplay();if((auttch>=9)&&(auttch<=10))yeardisplay(); //为7-8显示年if((auttch>=11)&&(auttch<=12))monthdaydisplay(); //为9-10显示日期if((auttch>=13)&&(auttch<=14))weekdisplay();if(auttch==15) //超过11清0auttch=off;if((((auttch==7||auttch==9)||auttch==11)||auttch==13)&&sec==59) down=1;if((auttch==9||auttch==11||auttch==13||auttch==0)&&sec==59) //down=1;{displaycount=0;//down=1;//P0=0x00;tier=1;}*//*if(tier==32){tier=0;bt=0;bbt=0;}*/monthcount();}}。
8X16LED点阵屏滚动显示说明书
湄洲湾职业技术学院8*16LED点阵屏滚动显示说明书系别:自动化工程系年级:10级专业:电气自动化姓名:俞成坦学号:********** 导师姓名:邱兴阳职称:讲师2013年 5 月 29 日1.前言 (1)2.系统设计技术参数要求 (2)3.系统设计 (3)3.1系统设计总体框图 (3)3.2系统各模块说明 (3)3.3系统总原理图说明 (4)3.4印刷电路板的制作图 (5)3.5系统操作说明 (5)3.6系统操作注意事项 (5)参考文献 (6)致谢词 (7)附录 (8)附录1 元件清单 (8)附录2 系统印刷电路板图 (9)附录3 系统电路总图 (10)附录4 系统程序 (11)众所周知,现在市面上已出现很多有关点阵显示器的商品,如广告活动字幕机、股票显示板、活动布告栏等。
它的优点是可按需要的大小、形状、单色、或彩色来组合,可与微处理器连接,做各种广告栏文字或图形变化。
因此可知汉字显示系统在人民的生活当中是何等的重要,也是研究的课题之一。
8*8点阵LED字符显示器系统在工业、各种比赛场合及日常生活应用中占有十分重要的地位,多年来,研究此项目的工程技术人员曾为简化电路、提高可靠性、降低成本,付出了很大的努力,做出不少成绩。
如今,美观、价廉、体积小、高可靠性8*8点阵LED字符显示器的出现,为这一领域的技术打开了新的天地。
LED字符显示器发展到今天已经从模拟化、分立化迈进数字化、集成化LED系统。
它的最大优点在于采用STC89C52掉电工作方式构成高可靠、低功耗系统方法。
在单片机程序设计中,采用“模块化”思路,设计中大量硬件尽量用软件代替,从而简化了系统结构,减少电子元件虚焊,接触不良和漂移等引起的一些故障,而且使用方便,只须改变软件中几条伪指令即可。
另外,本系统还可以方便的设计监控、故障自诊断、故障自动复原程序,以提高系统的可靠性。
系统的抗干扰设计,提高了系统的抗干扰能力。
在设计中重点要考虑单片机应用系统的设计。
8×8LED点阵屏仿电梯数字滚动显示
8×8LED点阵屏仿电梯数字滚动显示摘要:伴随着我国现代化程度的提高,电梯成为高层建筑中的重要交通工具,它是高层建筑中安全、可靠、垂直上下的运载工具,对改善劳动条件、减轻劳动强度起到很大的作用。
同时也给人们的生活带来了便利,为我国现代化建设的加速发展提供了强大的保障。
电梯的应用范围很广,可用于宾馆、饭店、办公大楼、商场、娱乐场所,仓库以及居民住宅大楼等。
因此,在现代社会中电梯已成为人类必不可少的垂直运输交通工具。
利用单片机控制电梯有成本低,通用性强,灵活性大以及易于实现复杂控制等优点。
基于单片机的电梯智能控制系统的设计分别从系统要求、硬件设计、软件设计等几个部分设计,介绍了以AT89C51系列单片机为核心,并结合74LS245和LED等芯片以及与之相配套的汇编语言软件等进行电梯模拟的具体实现方法,该方法不仅可以实现电梯的基本功能,而且可以设置电梯直达、急停、停电检修等功能,从而可实现电梯的智能控制及相应的最佳路线选择,提高电梯的有效利用率。
关键词:单片机;电梯;系统;控制目录1. 课题设计内容 (3)2. 硬件电路中器件选择 (3)3. 硬件设计 (8)3.1 控制模块 (9)3.2按键模块 (10)3.3 LED显示模块 (11)3.4 电源电路 (12)4. 软件设计 (11)4.1 主程序模块 (12)4.2 判断子程序 (13)5. 结束语 (14)参考文献 (15)附录 (16)程序清单 (16)1.课题设计内容本课题的主要任务是完成一个电梯系统的智能控制模块,即根据每个楼层不同顾客的按键要求,让电梯做出合理的判断,正确高效的指导电梯完成各项载客任务。
设计基于单片机的电梯智能控制系统的硬件电路与软件程序,给出硬件系统的电路原理图,对硬件电路与软件分别进行调试,得到调试成功的基于单片机的电梯智能控制系统。
根据此任务,本课题需要研究的内容有:1、根据系统的技术要求,进行系统硬件的总体方案设计;2、学习单片机的相关知识,并且加以运用;3、选择适当的芯片,并对其内部协议有所掌握,便于应用。
16.16LED点阵滚动显示
信息与通信工程学院硬件描述语言课程设计2018年4月16*16LED点阵滚动显示1 设计要求本设计主要实现16*16LED点阵的滚动显示。
可以滚动显示“硬件描述语言”这六个字。
同时通过两个按键进行方向控制,分别是模式切换键和方向切换键。
模式切换键可以进行上下方向和左右方向的模式切换。
方向切换键可以将向左滚动切换成向右滚动或者是向上切换成向下,向右切换成向左。
显示效果,无论汉字那个方向移动都是正面显示。
2 方案设计2.1系统设计框图本文整体设计如上图2.1所示,由按键控制模块,上线滚动显示模块和左右滚动显示模块这三部分组成。
按键控制模块实现对两个显示模块的控制,通过两个按键分别控制来实现汉字向左、向右、向上和向下四个方向的滚动显示。
当key_model按键为左右滚动显示模块工作,通过key_direction按键来控制向左、向右移动;反之上下滚动显示模块工作,通过key_direction按键来实现向上、向下移动。
下面针对这三个模块进行具体的说明。
2.2按键控制模块这个模块主要实现按键的消抖功能。
机械按键触点在闭合、断开时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
机械按键的抖动时间一般为5~10ms。
按键抖动示意图如下所示:按键消抖的原理就是把按键按下过程和松开过程中的抖动现象过滤掉。
这里使用计数的方式来实现抖动过滤。
程序流程图如下所示:部分关键程序:always @(posedge clk_1ms or negedge reset_n)beginif (!reset_n)begink2 <= 1'b0;key2 <= 1'b0;state2 <= 2'b00;key_conter2 <= 5'd0;endelse begincase (state2)2'b00: beginstate2 <= 2'b00;if (key_conter2 < 5'd10)beginif (!key_model)beginkey_conter2 <= key_conter2 + 5'd1;endelse key_conter2 <= 5'd0;endelse beginstate2 <= 2'b01;key_conter2 <= 5'd0;k2 <= 1'b1;endend2'b01: begink2 <= 1'b0;if (key_conter2 < 5'd10)beginif (key_model)beginkey_conter2 <= key_conter2 + 5'd1;endelse key_conter2 <= 5'd0;endelse beginstate2 <= 2'b00;key_conter2 <= 5'd0;endenddefault : state2 <= 2'b00;endcaseif (k2) key2 <= ~key2;endendassign key_model_c = key2;2.3滚动显示模块上下滚动显示模块和左右滚动显示模块的原理基本相同,唯一不同的是上下滚动显示模块是按照逐个led点亮来显示汉字,而左右滚动模块是按照逐列led点亮来显示汉字。
点阵显示屏滚动显示程序
0x10,0x40,0x10,0x40,0x22,0x44,0x7F,0x7E, // 的
0x42,0x84,0x43,0x04,0x42,0x04,0x42,0x84,
0x7E,0x64,0x42,0x24,0x42,0x04,0x42,0x04,
0x42,0x04,0x7E,0x04,0x42,0x28,0x00,0x10,
0x00,0x04,0x7F,0xFE,0x40,0x04,0x40,0x24, // 同
0x5F,0xF4,0x40,0x04,0x40,0x24,0x4F,0xF4,
0x48,0x24,0x48,0x24,0x48,0x24,0x48,0x24,
0x4F,0xE4,0x48,0x24,0x40,0x14,0x40,0x08,
BUFF[2*s+1]=HZ[xuan][word+1+32*s+2*disrow];
} } Biblioteka /***************发送一线点阵数据*******************/
void sendoneline(void)
{
char s;uchar inc;
if(col<8)inc=0;else inc=1;
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 、
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x00,0x1E,0x00,
0x0F,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
逐行扫描,24M晶振脉冲,5V直流供电。16*64点阵滚动显示,滚动速度可调,从最快速到最慢速设置30级变速,以实现不同场合下的使用。显示内容可切换,可以将需要显示的不同内容分段写入单片机,然后可以自动定时切换内容,或者设置为手动切换显示内容。可以脱机工作,方便使用,不用总是连接电脑,板子上留有DS18B20数字温度传感器和1302时钟芯片的板载接口,可以实现时间、万年历、温度的实时滚动显示。留有备份电池接口实现掉电信息不丢失、时间不乱。设置八个轻触按钮,方便操作,预留有功能按钮可通过编程实现不同的操作
LED点阵显示仿真----由浅入深之8X8,16X16,24X24LED点阵流动显示
一直以来,对LED点阵显示很感兴趣,特别是流动点阵显示。
论坛里有不少例子,效果都不是很满意。
于是,自己动手。
先试作了8X8点阵。
8X8的点太少,只适合数字显示,从0 ~9流动,效果还不错。
有了8X8的经验,对流动显示的原理已经了解,又试了16X16的,觉得也不难。
但16X16的点仍嫌少了,又做了个24X24的,汉字漂亮。
动画可能效果差些,软件运行显示效果好多了。
8X8初学点阵仿真,常点不亮LED 。
首先,可能是点阵的极性没有正确的接线。
下面的简单方法可判断点阵的逻辑引脚。
运行proteus,在编辑区里放上一个8X8LED,如MA TRIX-8x8-GREEN。
在某些引脚上接上电源和地,试试能不能点亮。
8X8默认是上下引脚,按习惯接法,上面接电源,下面接地,不亮(图左)。
用左下角垂直翻转工具,垂直翻转,再接上电源和地,就可以点亮了(下图)。
如果是做左移显示,可再左旋90°。
如图:这里可看到,左边引脚是行控制,右边引脚是列控制。
然后就可以画线路图了,点阵就保持上面那个方向。
由于点阵引线较多,特别是以后做24X24点阵,所以布线方式不用连线,而用终端加上网络标号,这样可以使画面简洁明了。
连续标号的快捷画法,我以前有帖子介绍过。
这里还是再啰嗦一下。
proteus有一个很好用的PA T(Property Assignment Tool),即属性分配工具。
可以用来做快捷标注,当然还可以用作其它操作。
再连上其它接线,一个线路图很快就可以作好。
下面,就可以写程序的源文件了。
点击菜单\Source,下拉菜单第一条Add/Remove Source Files,按键New,在跳出的对话框里写上新文件名,如8X8.asm,打开。
提示这个文件不存在,要创建吗?是。
然后点Code Gereration tool小箭头,选ASM51 ,点OK。
然后,菜单\Source,看到多了个8X8.asm,点击,出现proteus自带的汇编编辑器,就可以在里面写代码了。
8x8LED点阵屏仿电梯数字滚动显示说明书
湄洲湾职业技术学院8*8LED点阵屏仿电梯数字滚动显示说明书系部:自动化工程系年级: 10 级专业:电气自动化应用技术姓名:郑沁杰学号: 1001020205导师姓名:郑德山职称:副教授2013 年 05 月 26 日目录1.前言 (1)2.系统设计技术参数要求 (2)3.系统设计 (3)3.1 系统设计总框图 (3)3.2 各模块原理说明 (4)3.3系统原理说明 (5)3.4 系统操作说明 (5)3.5系统操作注意事项 (6)4.参考文献 (7)5. 致谢词 (8)6.附录 (9)6.1元件清单 (9)6.2系统原理图 (10)6.3 PCB原理设计 (11)6.4 系统程序 (11)1.前言LED市场比较好,但是现在市场竞争也比较激烈,和做其他产品差不多。
LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。
在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法。
本文设计的是一个用8x8的点阵LED图文显示屏,图形或文字显示有静止、移入移出显示方式。
LED点阵显示屏作为一种新兴的显示器件,是由多个独立的LED发光二极管封装而成. LED点阵显示屏可以显示数字或符号, 通常用来显示时间、速度、系统状态等。
文章给出了一种基于MCS-51单片机的8×8 点阵LED显示屏的设计方案。
包括系统具体的硬件设计方案,软件流程图和部分汇编语言程序等方面。
在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。
它用高亮度发光二极管芯阵列组合后,环氧树脂与塑模封装而成。
具有高亮度,功耗低,引脚少,视角大,寿命长,耐湿,耐冷热,耐腐蚀等特性,LED显示屏以突出的优势成为平板显示的主流产品之一。
LED这一显示产品使用在我们日常的生活中扮演者越来越重要的角色。
汉字点阵显示屏移动显示设计资料汇总
16 16模块在PROTEUS中的构成Proteus中的8*8LED点阵系列分红、绿、蓝等不同颜色,其共阴还是共阳?默认行引脚在上还是列引脚在上?等等问题要在使用前先予以判断,具体方法如下图Proteus仿真16*16LED点阵显示汉字Proteus中只有5×7和8×8等LED点阵,并没有16×16LED点阵,而在实际应用中,要良好地显示一个汉字,则至少需要16×16点阵。
下面我们就首先介绍使用8×8点阵构建16×16点阵的方法,并构建一块16×16LED点阵,用于本例的显示任务。
首先,从Proteus元件库中找到“MATRIX-8X8-RED”元器件,并将四块该元器件放入Proteus文档区编辑窗口中。
此时需要注意,如果该元器件保持初始的位置(没有转动方向),我们要首先将其左转90°,使其水平放置,那么此时它的左面8个引脚是其行线,右边8个引脚是其列线(当然,如果你是将右转,则右边8个引脚是行线)。
然后我们将四个元器件对应的行线和列线分别进行连接,使每一条行线引脚接一行16个LED,列线也相同。
并注意要将行线和列线引出一定长度的引脚,以便下面我们使用。
连接好的16×16点阵如下图连接成如上图的16×16点阵只是第一步,这样分开的数块并不能达到好的显示效果,下面我们要将其进一步组合。
组合实际上很简单,首先选中如上图中右侧的两块8×8点阵,然后拖动并使其与左侧的两块相并拢,如下图我们可以看到原来的连线已经自动隐藏了,至于线上的交点,我们不要去动。
然后,我们再来最后一步,选中下侧的两块点阵,并拖动使其与上侧的两块并拢,最后的效果如下图可以看到,原来杂乱的连线现在已经几乎全部隐藏了,一块16×16的LED点阵做成了。
需要注意,做成的LED点阵的行线为左侧的16个引脚,下侧的16个引脚为其列线,而且其行线为高电平有效,列线为低电平有效。
LED点阵滚动显示屏
淮阴师范学院物理与电子电气工程学院课程设计报告学生姓名学号班级2007级8班专业电气工程及其自动化题目24×48LED点阵滚动显示屏指导教师2010 年 6 月一、设计指标用18个8×8的LED点阵块组合成24×48的LED显示屏,并且可以在屏幕上循环滚动显示一组汉字。
二、设计方框图三、元器件介绍AT89C51单片机:AT89C51提供以下功能,4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时器/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM、定时/计数器、串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件直到下一个硬件复位。
MATRIX-8×8-GREEN:8×8的LED绿色点阵74LS138:3线-8线译码器。
该译码器有3位二进制输入A、B、C,它们共有8种状态的组合,即可译出8个输出信号Y0~Y7,输出为低电平有效。
此外还有E1、E2、E33个使能端,为电路功能的扩展提供方便。
74LS595:8位串行输入三态并行输出锁存器。
Q1~7 是并行数据输出口,即数据寄存器的数据输出口;Q7'串行输出口,其应该接SPI总线的MISO接口;ST_CP 数据寄存器的时钟脉冲输入口;SH_CP 移位寄存器的时钟脉冲输入口;OE非,输出使能端;MR非,芯片复位端;DS串行数据输入端。
三、设计原理1、各功能模块电路的设计(用Proteus仿真)(1)列控制电路六组74LS138用于控制LED点阵显示屏的48列,E1引脚为3线-8线译码器的输出使能端,由P1.0~P1.5端口控制。
A、B、C为3线-8线译码器的输入端,信号由单片机的P2.0~P 2.2端口给出。
16X16汉字点阵显示屏移动显示设计
毕业设计(论文)题目:16*16点阵汉字显示设计年级:1011电子专业:应用电子技术学生姓名:指导教师:X2012年11 月20 日摘要本设计使用AT89C52芯片作为主控制模块,利用简单的外围电路来驱动16*16点阵LED显示屏。
设计分为三个模块:单片机控制模块.输出显示模块,译码器74HC154 与三极管驱动的驱动模块。
单片机控制模块以单片机为核心,以软件KEIL编程实现信号输出,以驱动16*16 LED点阵显示块为目的。
另一方面显示屏广泛的应用于医院、火车站、银行等公共场所,因此本设计有很强的现实实用性。
关键字:单片机汉字显示屏控制模块驱动模块软件编程目录第一章绪论 (1)1.1 单片机的概念及其特点 (3)1.1.1 单片机 (3)1.1.2 单片机的特点 (3)1.2 单片机的发展概况及其分类 (3)1.2.1单片机的发展概况 (3)1.2.2 单片机的分类 (4)1.3 单片机的应用领域及其发展趋势 (4)1.3.1 单片机的应用领域 (4)1.3.2单片机的发展趋势 (6)1.4LED简介 (6)1.5 电子显示屏 (7)第二章系统整体方案 (8)2.1 需要实现的功能 (8)2.2 系统软件的设计 (10)第三章系统硬件电路的设计 (11)3.1 单片机系统及外围电路 (11)3.1.1 单片机的内部结构 (11)3.1.2 AT89C52芯片介绍 (11)3.1.3 单片机系统外围电路 (12)3.2 驱动电路 (13)3.2.1 74HC154芯片简介 (13)3.2.2 驱动电路的构成 (14)3.3 16*16LED显示屏电路和原理 (15)第四章系统程序的设计 (17)4.1流程图 (17)4.2 系统主程序 (18)第五章调试及性能分析 (21)5.1 软件调试 (21)5.2 性能分析 (22)结论 (23)致谢 (24)参考文献 (25)第一章绪论单片微型计算机(single chip microcomputer)简称单片机,它是为各类专用控制器而设计的通用或专用微型计算机系统,高密度集成了普通计算机微处理器,一定容量的RAM和ROM以及输入/输出接口,定时器等电路于一块芯片上构成的。
16X16LED点阵屏滚动显示说明书
湄洲湾职业技术学院16X16LED点阵屏滚动显示说明书系别:自动化工程系年级:10级专业:电气自动化姓名:小容学号:1001010114 导师姓名:蔡小明职称:讲师2013年 5 月 28 日1.前言 (1)2.系统设计技术参数要求 (3)3.系统设计 (4)3.1系统设计总体框图 (5)3.2系统各模块说明 (6)3.3系统总原理图说明 (7)3.4印刷电路板的制作图 (7)3.5硬件调试 (7)3.5.1系统操作注意事项 (7)3.5.2调试所用设备及过程 (8)3.5.3测试结果分析与结论 (8)参考文献 (9)致谢词 (10)附录 (11)附录1元件清单 (12)附录2系统电路总图 (13)在微型计算机技术使用上,单片机主要用与工业测控,如家用电器,计算机外围设备,工业智能化仪表,机器人,生产过程的自动控制,农业,化工,军事,航空航天等领域等,都有着巨大的作用。
作为21世纪的工科大学生,不仅要熟练地使用通用微机进行各种数据处理,还要把计算机技术运用到本专业领域或相关领域,即具有“开发”能力。
新世纪的工科大专院校的大学生既要掌握通用微机,又要掌握单片机,所以学习单片机这一门学科对我们的学习很重要。
大家都知道,现在市面上已出现很多有关点阵显示器的商品,如广告活动字幕机、股票显示板、活动布告栏等。
它的优点是可按需要的大小、形状、单色、或彩色来组合,可与微处理器连接,做各种广告栏文字或图形变化。
因此可知汉字显示系统在人民的生活当中是何等的重要,也是研究的课题之一。
16*16点阵LED字符显示器系统在工业、各种比赛场合及日常生活应用中占有十分重要的地位,多年来,研究此项目的工程技术人员曾为简化电路、提高可靠性、降低成本,付出了很大的努力,做出不少成绩。
如今,美观、价廉、体积小、高可靠性8*8点阵LED字符显示器的出现,为这一领域的技术打开了新的天地。
LED字符显示器发发展到今天已经从模拟化、分立化迈进数字化、集成化LED系统。
LED点阵显示仿真由浅入深之8X8,16X16,24X24LED点阵流动显示
一直以来,对LED点阵显示很感兴趣,特别是流动点阵显示。
论坛里有不少例子,可是在我的电脑上大多无法正常运行。
有的一运行就S机,能运行的,也是字符不清。
于是,自己动手。
先试作了8X8点阵。
8X8的点太少,只适合数字显示,从0 ~9流动,效果还不错。
有了8X8的经验,对流动显示的原理已经了解,又试了16X16的,觉得也不难。
但16X16的点仍嫌少了,又做了个24X24的,汉字漂亮。
动画可能效果差些,软件运行显示效果好多了。
一、8X8初学点阵仿真,常点不亮LED 。
首先,可能是点阵的极性没有正确的接线。
下面的简单方法可判断点阵的逻辑引脚。
运行proteus,在编辑区里放上一个8X8LED,如MA TRIX-8x8-GREEN。
在某些引脚上接上电源和地,试试能不能点亮。
8X8默认是上下引脚,按习惯接法,上面接电源,下面接地,不亮(图左)。
用左下角垂直翻转工具,垂直翻转,再接上电源和地,就可以点亮了(图右)。
如果是做左移显示,可再左旋90°这里可看到,左边引脚是行控制,右边引脚是列控制。
然后就可以画线路图了,点阵就保持上面那个方向。
由于点阵引线较多,特别是以后做24X24点阵,所以布线方式不用连线,而用终端加上网络标号,这样可以使画面简洁明了。
连续标号的快捷画法,我以前有帖子介绍过。
这里还是再啰嗦一下。
proteus有一个很好用的PA T(Property Assignment Tool),即属性分配工具。
可以用来做快捷标注,当然还可以用作其它操作。
再连上其它接线,一个线路图很快就可以作好。
下面,就可以写程序的源文件了。
点击菜单\Source,下拉菜单第一条Add/Remove Source Files,按键New,在跳出的对话框里写上新文件名,如8X8.asm,打开。
提示这个文件不存在,要创建吗?是。
然后点Code Gereration tool小箭头,选ASM51 ,点OK。
然后,菜单\Source,看到多了个8X8.asm,点击,出现proteus自带的汇编编辑器,就可以在里面写代码了。
16×16点阵移动显示
16×16点阵移动显示大家好,本电路是课程设计的核心内容,为了简洁,直入主题吧!电路原理图:程序:#include <A T89x51.H>#define uchar unsigned char#define uint unsigned intuchar yid,h; //YID为移动计数器,H为行段计数器。
uint zimuo; //字模计数器uchar code hanzi[]; //汉字字模uchar BUFF[18]; //缓存void in_data(void); //调整数据void rxd_data(void);//发送数据void sbuf_out(); //16段扫描unsigned code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; //16行段码/********************************************/void main(void){uchar i,d=2;yid=0;zimuo=0;while(1){while(yid<16) //数据移位。
{for(i=0;i<d;i++) //移动速度{sbuf_out();}yid++; //移动一步}yid=0;zimuo=zimuo+32; //后移一个字,if(zimuo>=1056) //总数减7个字。
zimuo=0;}}/********************************/void sbuf_out(){for(h=0;h<16;h++)//16行扫描{in_data(); //调整数据rxd_data(); //串口发送数据P1=0x7f; //关闭显示。
P1_7=1; //锁存为高,595锁存信号P1=sw[h]; //送段码}}/******************************************************/void in_data(void){char s;for(s=8;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器{BUFF[2*s+1]=hanzi[zimuo+32*s+2*h];//把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中BUFF[2*s]=hanzi[zimuo+1+32*s+2*h];// 把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中}}/*******************************************************/void rxd_data(void) //串行发送数据{char s;uchar inc,tempyid,temp;if(yid<8)inc=0;elseinc=1;for(s=0+inc;s<16+inc;s++)//发送8字节数据{if(yid<8)tempyid=yid;elsetempyid=yid-8;temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));//h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
点阵屏的移动显示/*--------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,0x 24,0x06,0x04,0x0A,0x14,0x12,0x24,0x62,0xC4,0x02,0x04,0x02,0x04,0x02,0x04,0x0A,0 x14,0x04,0x08/*"羽",0*/};code unsigned char yi[32]={0x7E,0xF8,0x12,0x48,0x0A,0x28,0x12,0x18,0x22,0x28,0x1F,0xF0,0x11,0x 10,0x1F,0xF0,0x11,0x10,0x1F,0xF0,0x08,0x20,0x7F,0xFC,0x08,0x20,0xFF,0xFE,0x18,0x3 0,0x60,0x0C/*"翼",0*/};code unsigned char dian[32]={0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0x F8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0x FE,0x00,0x00/*"电",0*/};code unsigned char zi[32]={0x00,0x00,0x3F,0xF0,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x 00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x 00,0x02,0x00/*"子",0*/};code unsigned char gong[32]={0x00,0x00,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x 00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x 00,0x00,0x00/*"工",0*/};code unsigned char zuo[32]={0x08,0x80,0x0C,0x80,0x09,0x00,0x13,0xFE,0x12,0x80,0x34,0x88,0x50,0x FC,0x90,0x80,0x10,0x80,0x10,0x84,0x10,0xFE,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x 80,0x10,0x80/*"作",1*/};code unsigned char shi[32]={0x02,0x00,0x01,0x00,0x3F,0xFE,0x20,0x04,0x40,0x08,0x3F,0xFC,0x04,0x 00,0x08,0x20,0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xF E,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的出现,否则显示出乱}j=64;while(j--); //每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度SCK=0; //SCK=1; //将最后一行数据移出}void display_time(unsigned int timer) //指定时间扫描显示{unsigned char i;while(timer--){ //当timer=1时,大约1秒时间i=130;while(i--)display();}}void displaymove(unsigned char *lp,unsigned char c,unsigned char timer)//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,//timer是移动的速度{unsigned char i=0,j=0,ia=0;unsigned int tmp=0,timerc=0;unsigned char tmp2[16];c*=2; //因一个汉字由32字节组成,而移位显示,要分开半个汉字16字节处理,因此将这里乘以2for(i=0;i<16;i++)tmp2[1]=0; //将缓冲区清0,while(c){ //循环处理if(lp!=0){ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份for(i=0;i<16;i++){tmp2=lp[i*2+tmp]; //取半个汉字点阵数据,16字节}if(tmp) //当tmp为1时,表时一个字数组处理完成,将地址转到下一个字lp+=32;}//--------------tmp=8; //变量再次利用while(tmp){ //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲ia=0; //做为点阵数组的元素for(i=0;i<16;i++){//移动是16行同时移,因此要处理16个字节date[ia]<<=1; //移当前显示缓冲的前半行字节if(date[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理date[ia]++;ia++;date[ia]<<=1; //移当前显示缓冲的后半行字节if(tmp2&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理date[ia]++;ia++;tmp2<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位}tmp--;timerc=timer; //处理完16行,调用显示函数更新点阵while(timerc--) //循环做为处理的速度,即移动的速度display();}//----------c--; //移完一半,进入下一半或下一个汉字,直到结束}}void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer)//上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度{unsigned char i=0,j=0,ia=0;unsigned int tmp=0,timerc=0;if(din){ //判断移动方向,向下ia=32; //要移入第一个汉字的数组元素i=16; //行索引while(i--){ //逐行处理j=30;while(j){j--;date[j+2]=date[j]; //将上一行的内容复制到下一行,每两行内容相隔四个字节,复制15行}if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入date[0]=0;date[1]=0;}else{ //否则,取字数组处理ia--;date[1]=lp[ia];ia--;date[0]=lp[ia];}timerc=timer; //处理完16行,调用显示函数更新点阵while(timerc--) //循环做为处理的速度,即移动的速度display();}else{ //移动方向,向上ia=0; //向上移动,移入汉字从低位开始for(i=0;i<16;i++){ //处理16行for(j=0;j<30;j++) //将下一行的内容复制到上一行,每两行内容相隔四个字节,复制15行date[j]=date[j+2];if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入date[30]=0;date[31]=0;}else{ //否则,取字数组处理date[30]=lp[ia];date[31]=lp[ia+1];ia+=2;}timerc=timer; //处理完16行,调用显示函数更新点阵while(timerc--) //循环做为处理的速度,即移动的速度display();}}}void delay(unsigned int a) //延时{while(a--);}。