点阵屏的移动显示

合集下载

8x8LED点阵屏仿电梯数字滚动显示说明书

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点阵屏从上向下滚动显示

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时钟芯片的板载接口,可以实现时间、万年历、温度的实时滚动显示。留有备份电池接口实现掉电信息不丢失、时间不乱。设置八个轻触按钮,方便操作,预留有功能按钮可通过编程实现不同的操作
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

点阵屏的移动显示/*--------16*16点阵屏的移动显示------------*/#include &lt;reg51.h&gt;#include &lt;intrins.h&gt;#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/*&quot;羽&quot;,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/*&quot;翼&quot;,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/*&quot;电&quot;,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/*&quot;子&quot;,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/*&quot;工&quot;,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/*&quot;作&quot;,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/*&quot;室&quot;,2*/};void main(void) //主入口函数{unsigned char i=0,j=0;for(i=0;i&lt;32;i++)date=yu;//将&quot;羽&quot;复制到显示缓存while(1){display_time(2); //显示约2秒displaymove(yi,6,7);//将从&quot;翼&quot;开始的六个汉字从右向左移动display_time(1); //等持约1秒displaymovetb(1,0,10); //将点阵上显示的内容向下以10的速度移出,补上0,即清空显示屏display_time(1); //等待1秒displaymovetb(0,yu,10); //将&quot;羽&quot;字以10的速度向上移动displaymovetb(0,yi,10); //将&quot;翼&quot;字以10的速度向上移动displaymovetb(0,dian,10); //将&quot;电&quot;字以10的速度向上移动displaymovetb(0,zi,10); //将&quot;子&quot;字以10的速度向上移动displaymovetb(0,gong,10); //将&quot;工&quot;字以10的速度向上移动displaymovetb(0,zuo,10); //将&quot;作&quot;字以10的速度向上移动displaymovetb(0,shi,10); //将&quot;室&quot;字以10的速度向上移动displaymovetb(0,0,10); //以10的速度向上清空display_time(1); //等待1秒displaymovetb(1,yu,10); //将&quot;羽&quot;字以10的速度向下移动}}void display()//显示{unsigned char i,ia,j,tmp; //定义变量DATE_OUT=0XFF; //置位高电平做准备AB=0;//将行数据位清0,准备移位for(i=0;i&lt;16;i++){ //循环输出16行数据SCK=0; //为行移位做准备SCLT=0; //为列锁存做准备for(ia=2;ia&gt;0;){ //每行16个点,循环位移两个字节ia--; //循环两次tmp=~date[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成,//电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据for(j=0;j&lt;8;j++){ //循环两次,每次移一个字节,SCLH=0; //为列移位做准备DATA=tmp&amp;0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位tmp&gt;&gt;=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&lt;16;i++)tmp2[1]=0; //将缓冲区清0,while(c){ //循环处理if(lp!=0){ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份for(i=0;i&lt;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&lt;16;i++){//移动是16行同时移,因此要处理16个字节date[ia]&lt;&lt;=1; //移当前显示缓冲的前半行字节if(date[ia+1]&amp;0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理date[ia]++;ia++;date[ia]&lt;&lt;=1; //移当前显示缓冲的后半行字节if(tmp2&amp;0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理date[ia]++;ia++;tmp2&lt;&lt;=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&lt;16;i++){ //处理16行for(j=0;j&lt;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--);}。

相关文档
最新文档