最新点阵 左移 上移 右移 下移 下拉 等花样显示

合集下载

点阵屏的移动显示

点阵屏的移动显示

点阵屏的移动显示/*--------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显示屏、数码显示器、液晶显示屏等各种显示设备中。

点阵左移显示的原理可以简单描述为以下几个步骤:1. 初始化点阵:首先,需要初始化一个点阵图形,点阵是由一系列的像素点组成的矩阵,每个像素点可以表示亮或暗两种状态。

在左移显示之前,需要将点阵图形加载到显示设备的内存中。

2. 移动像素点:接下来,通过改变点阵中像素点的亮灭状态,实现图像或文字的左移显示效果。

通常,左移显示是通过逐列移动像素点来实现的。

首先,将第一列的像素点向左移动一位,然后将第二列的像素点向左移动一位,依次类推,直到将最后一列的像素点向左移动一位。

这样,整个点阵图形就向左移动了一列。

3. 刷新显示:左移显示过程中,需要不断地刷新显示设备的屏幕,以及时显示点阵图形的变化。

刷新显示可以通过改变像素点的亮灭状态来实现,当像素点从暗变为亮时,显示设备对应的像素点会显示出亮的状态;当像素点从亮变为暗时,显示设备对应的像素点会显示出暗的状态。

通过逐列移动像素点并及时刷新显示,就能够实现图像或文字的左移显示。

点阵左移显示原理的关键在于对像素点的控制。

在点阵中,每个像素点都有一个对应的控制电路,通过改变控制电路的状态,可以改变对应像素点的亮灭状态。

常见的控制电路有两种:共阳极(CA)和共阴极(CC)。

在共阳极的控制电路中,当控制电路为低电平时,对应像素点亮;当控制电路为高电平时,对应像素点暗。

而在共阴极的控制电路中,当控制电路为高电平时,对应像素点亮;当控制电路为低电平时,对应像素点暗。

通过控制每个像素点的控制电路,就可以实现点阵左移显示的效果。

点阵左移显示技术具有很多优点。

首先,它可以实现高度可视化的显示效果,使得图像或文字更加生动鲜明。

其次,它具有较低的成本和较高的可靠性,适用于各种规模和类型的显示设备。

点阵移动方法集锦

点阵移动方法集锦

我的空间有程序,你去看看,有十几种移动方法屏幕点阵数的话也可以随时改动的/*************呈现各种显示效果的函数集****************/void flash_bai(uchar *flash_word,uchar flash_heard,uchar number,uchar sdu,uchar state){register uchar i,j,l;for(i=0;i<number;i++){for(j=0;j<16;j++){for(l=0;l<8;l++){if(j<8){dispram[l*4+1]=dispram[l*4+1]&0xff<<j|(flash_word[(flash_heard+i)*32+l*4]>>( 7-j));dispram[l*4+2]=dispram[l*4+2]&0xff>>j|(flash_word[(flash_heard+i)*32+l*4+3] <<(7-j)&0x10);}else{dispram[l*4]=dispram[l*4]&0xff<<(j-7)|flash_word[(flash_heard+i)*32+l*4]>>(15-j); dispram[l*4+1]=flash_word[(flash_heard+i)*32+l*4]<<(j-7)|(flash_word[(flash_h eard+i)*32+l*4+1]>>(15-j));dispram[l*4+2]=flash_word[(flash_heard+i)*32+l*4+2]<<(15-j)|(flash_word[(flas h_heard+i)*32+l*4+3]>>(j-7));dispram[l*4+3]=(dispram[l*4+3]&0xff>>(j-7))|flash_word[(flash_heard+i)*32+l* 4+3]<<(15-j);}}delay(sdu*SPEED);}delay(state*SPEED);}}/*******************霓虹灯效果************************/void flash(uchar *flash_word,uchar flash_heard,uchar number,uchar sdu,uchar state){register uchar i,j,k,l;for(i=0;i<number;i++){for(j=0;j<=16;j++){for(k=17;k>j;k--){for(l=0;l<16;l++){if(j>8){dispram[l*2]=1<<(8-k+j)|(flash_word[(flash_heard+i)*32+l*2]&0xff>>(16-j));dispram[l*2+1]=flash_word[(flash_heard+i)*32+l*2+1];}else{dispram[l*2]=1<<(8-k+j);dispram[l*2+1]=1<<(16-k+j)|(flash_word[(flash_heard+i)*32+l*2+1]&0xff>>(8-j) );}}delay(sdu*SPEED);}for(k=17;k>j;k--){for(l=0;l<16;l++){if(j>8){dispram[l*2]=1<<(k-8)|(flash_word[(flash_heard+i)*32+l*2]&0xff>>(16-j));}else{dispram[l*2]=1<<(k-8);dispram[l*2+1]=1<<k|(flash_word[(flash_heard+i)*32+l*2+1]&0xff>>(8-j));}}delay(sdu*SPEED);}}delay(state*SPEED);}}/*******************跳动的米奇*********************/void miqi_jump(void){register uchar jump_i;while((receive[1]&0x0f)<2)//{switch (timer/3650){case 0:for(jump_i=0;jump_i<16;jump_i++){dispram[jump_i*2] = word1[11][jump_i*2]<<1|word1[11][jump_i*2+1]>>7; dispram[jump_i*2+1] = word1[11][jump_i*2+1]<<1;//左移}break;case 1:for(jump_i=0;jump_i<15;jump_i++){dispram[jump_i*2+2] = word1[11][jump_i*2];dispram[jump_i*2+3] = word1[11][jump_i*2+1];}dispram[0] = 0;dispram[1] = 0;break;//下移case 2:for(jump_i=0;jump_i<16;jump_i++){dispram[jump_i*2+1] = word1[11][jump_i*2+1]>>1|word1[11][jump_i*2]<<7; dispram[jump_i*2] = word1[11][jump_i*2]>>1;}break;//右移case 3:for(jump_i=0;jump_i<15;jump_i++){dispram[jump_i*2] = word1[11][jump_i*2+2];dispram[jump_i*2+1] = word1[11][jump_i*2+3];}dispram[30] = 0;dispram[31] = 0;break;//上移case 4: for(jump_i=0;jump_i<15;jump_i++){dispram[jump_i*2+2] = word1[11][jump_i*2]<<1|word1[11][jump_i*2+1]>>7; dispram[jump_i*2+3] = word1[11][jump_i*2+1]<<1;//左移}dispram[0] = 0;dispram[1] = 0;break;//下移case 5: for(jump_i=0;jump_i<16;jump_i++){dispram[jump_i*2+1] =word1[11][jump_i*2+3]>>1|word1[11][jump_i*2+2]<<7;dispram[jump_i*2] = word1[11][jump_i*2+2]>>1;}dispram[30] = 0;dispram[31] = 0;break;//上移case 6: for(jump_i=0;jump_i<15;jump_i++){dispram[jump_i*2+3] = word1[11][jump_i*2+1]>>1|word1[11][jump_i*2]<<7; dispram[jump_i*2+2] = word1[11][jump_i*2]>>1;}dispram[0] = 0;dispram[1] = 0;break;case 7: for(jump_i=0;jump_i<16;jump_i++){dispram[jump_i*2] = word1[11][jump_i*2+2]<<1|word1[11][jump_i*2+3]>>7; dispram[jump_i*2+1] = word1[11][jump_i*2+3]<<1;//左移}dispram[30] = 0;dispram[31] = 0;break;default:for(jump_i=0;jump_i<32;jump_i++)dispram[jump_i] = word1[11][jump_i];}}}/********从wordsp的第OpenDheard个字开始开门效果显示number个字**********///用数组更加节省空间void Open_door(uchar wordsp[][32],uchar OpenDheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(k=0;k<number;k++){for(j=1;j<9;j++){for(i=0;i<16;i++){dispram[i*2]=dispram[i*2]&0xff<<j|wordsp[OpenDheard+k][2*i]&0xff>>(8-j); dispram[i*2+1]=dispram[i*2+1]&0xff>>j|wordsp[OpenDheard+k][1+2*i]&0xff<<( 8-j);}delay(sdu*SPEED);}delay(state*TIME);}}/********从wordsp的第CloseDheard个字开始关门效果显示number个字**********///用数组更加节省空间void Close_door(uchar wordsp[][32],uchar CloseDheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(k=0;k<number;k++){for(j=1;j<9;j++){for(i=0;i<16;i++){dispram[i*2]=dispram[i*2]&0xff>>j|wordsp[CloseDheard+k][2*i]&0xff<<(8-j); dispram[i*2+1]=dispram[i*2+1]&0xff<<j|wordsp[CloseDheard+k][1+2*i]&0xff>> (8-j);}delay(sdu*SPEED);}delay(state*TIME);}}/********从wordsp的第Far_Awayheard个字开始两边拉开显示number个字**********///用数组更加节省空间void Far_Away(uchar wordsp[][32],uchar Far_Awayheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(k=0;k<number;k++){for(j=1;j<9;j++){for(i=0;i<16;i++){dispram[i*2]=dispram[i*2]<<j|wordsp[Far_Awayheard+k][2*i]&0xff>>(8-j); dispram[i*2+1]=dispram[i*2+1]>>j|wordsp[Far_Awayheard+k][1+2*i]&0xff<<(8-j);}delay(sdu*SPEED);}delay(state*TIME);}}/********从wordsp的第Close_Toheard个字开始两边合拢显示number个字**********///用数组更加节省空间void Close_To(uchar wordsp[][32],uchar Close_Toheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(k=0;k<number;k++){for(j=1;j<9;j++){for(i=0;i<16;i++){dispram[i*2]=dispram[i*2]&0xff>>j|wordsp[Close_Toheard+k][2*i]<<(8-j); dispram[i*2+1]=dispram[i*2+1]&0xff<<j|wordsp[Close_Toheard+k][1+2*i]>>(8-j );}delay(sdu*SPEED);}delay(state*TIME);}}/****************卷帘出显示number个字***************///用指针更加节省空间void M_Words(uchar *wordsp,uchar MWheard,uchar number,uchar sdu,uchar state){register uchar i,j;for(j=0;j<number;j++)for(i=0;i<32;i++){dispram[i]=wordsp[(MWheard+j)*32+i];if(i%2)delay(sdu*SPEED);}delay(state*TIME);}}/************从UP_Pullp的第UP_Pullheard个字向上拉出number个字***************///用数组更加节约空间void UP_Pull_Word(uchar UP_Pullp[][32],uchar UP_Pullheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(i=0;i<number;i++){for(j=0;j<16;j++){for(k=0;k<15-j;k++){dispram[k*2]=dispram[(k+1)*2];dispram[k*2+1]=dispram[(k+1)*2+1];}dispram[30-2*j]=UP_Pullp[UP_Pullheard+i][(15-j)*2];dispram[31-2*j]=UP_Pullp[UP_Pullheard+i][(15-j)*2+1];delay(sdu*SPEED);}delay(state*TIME);}}/*********从UPp的第UPheard个字向上滚屏number个字***************/ //用数组更加节约空间void UP_Run_Word(uchar UPp[][32],uchar UPheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(i=0;i<number;i++){for(j=0;j<16;j++)for(k=0;k<15;k++){dispram[k*2]=dispram[(k+1)*2];dispram[k*2+1]=dispram[(k+1)*2+1];}dispram[30]=UPp[UPheard+i][j*2];dispram[31]=UPp[UPheard+i][j*2+1];delay(sdu*SPEED);}delay(state*TIME);}}/*********从Down_Pullp的第Down_Pullheard个字向下拉出number个字***************///用数组更加节约空间void Down_Pull_Word(uchar Down_Pullp[][32],uchar Down_Pullheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(i=0;i<number;i++){for(j=0;j<16;j++){for(k=15;k>j;k--){dispram[k*2]=dispram[(k-1)*2];dispram[k*2+1]=dispram[(k-1)*2+1];}dispram[2*j]=Down_Pullp[Down_Pullheard+i][2*j];dispram[2*j+1]=Down_Pullp[Down_Pullheard+i][2*j+1];delay(sdu*SPEED);}delay(state*TIME);}}/*********从Downp的第UPheard个字向下滚屏number个字***************/ //用指针更加节约空间void Down_Run_Word(uchar *Downp,uchar UPheard,uchar number,uchar sdu,uchar state){register uchar i,j,k;for(i=0;i<number;i++){{for(k=15;k>0;k--){dispram[k*2]=dispram[(k-1)*2];dispram[k*2+1]=dispram[(k-1)*2+1];}dispram[0]=Downp[(UPheard+i)*32+(15-j)*2];dispram[1]=Downp[(UPheard+i)*32+(15-j)*2+1];delay(sdu*SPEED);}delay(state*TIME);}}/**********从LRp的第LRheard个字左移出显示number个字************///用指针更加节约空间void L_Removeout_Word(uchar *LRp,uchar LRheard,uchar number,uchar sdu,uchar state){register uchar i,j,k,l;for(i=0;i<number;i++){for(j=0;j<2;j++)for(k=0;k<8;k++){for(l=0;l<16;l++){dispram[l*2]=dispram[l*2]<<1|dispram[l*2+1]>>7;dispram[l*2+1]=dispram[l*2+1]<<1|LRp[(i+LRheard)*32+l*2+j]>>(7-k);}delay(sdu*SPEED);}delay(state*TIME);}}/**********从L_Pullp的第L_Pullheard个字左拉出显示number个字************/ //用指针更加节约空间void L_Pull_Word(uchar *L_Pullp,uchar L_Pullheard,uchar number,uchar sdu,uchar state){register uchar i,j,k,l;for(i=0;i<number;i++){for(j=0;j<2;j++){for(l=0;l<16;l++){if(j==0){dispram[l*2]=dispram[l*2]<<1|dispram[l*2+1]>>7;dispram[l*2+1]=(dispram[l*2+1]&0xff<<(k+1))<<1|L_Pullp[(i+L_Pullheard)*32+l *2+1]&0xff>>(7-k);}else{dispram[l*2]=(dispram[l*2]&0xff<<(k+1))<<1|L_Pullp[(i+L_Pullheard)*32+l*2]& 0xff>>(7-k);dispram[l*2+1]=L_Pullp[(i+L_Pullheard)*32+l*2+1];}}delay(sdu*SPEED);}delay(state*TIME);}}/****************卷帘出黑屏***************/void M_Black(void){register uchar i;for(i=0;i<32;i++){dispram[i]=0x00;if(i%2)delay(5*SPEED);}}/**********从RRp的第RRheard个字右移出显示number个字************///用指针更加节约空间void R_Removeout_Word(uchar *RRp,uchar RRheard,uchar number,uchar sdu,uchar state){register uchar i,j,k,l;for(i=0;i<number;i++){for(j=2;j>0;j--)for(k=0;k<8;k++){for(l=0;l<16;l++){dispram[l*2+1]=dispram[l*2+1]>>1|dispram[l*2]<<7;dispram[l*2]=dispram[l*2]>>1|RRp[(i+RRheard)*32+l*2+j-1]<<(7-k);}delay(sdu*SPEED);}delay(state*TIME);}}。

任务三 点阵显示屏移位显示数字

任务三  点阵显示屏移位显示数字

( )移位显示驱动程序的编写 ( 33 ) LED点阵硬件驱动程序
COL2=0;//字模数据输出选通 DATAPORT=(zm[dzbuf[3]][i]>>mc)|(zm[dzbuf[4]][i]<<(8mc));//第四个字模的数据 COL3=1; COL3=0;//字模数据输出选通 DATAPORT=row%256;//点阵扫描上屏 ROW0=1; ROW0=0;//扫描线输出选通 DATAPORT=row/256;//点阵扫描下屏 ROW1=1; ROW1=0;//扫描线输出选通 delay(20);//短延时 row=row<<1;//改变行扫描线 } DATAPORT=0xff;//拉高数据 }
3、程序说明
(1)程序中设立了数字字符的字模索引数组szindex[],该数组的内容 就是对应的数字字模在二维数组中的行编号。函数通过搜索索引来查 找对应的字符的字模并返回其编号,这样定位字符的字模不仅不易出 错,而且函数的通用性强、调用方便了。这种方法也适用于对汉字等 字符的搜索。 (2)查找字符串并送显示缓冲区子函数get_char( )中,调用C51库函 数strlen()来计算要显示的字符串的长度。字符上加入引号表示是它一 个字符串,字符串使用szindex[i]!=0来判断字符串是否搜索到最后。循 环中使用j=(j+1)%len是为了当字符递增到最后一个字符后能够返回第 一个字符。 (3)变量count的值决定了要显示字符串的位置,其递增的速度决定 了字符移动的速度。
项目四led点阵屏广告牌制作任务三任务三led点阵显示屏移位显示数字任务要求任务要求任务分析任务分析硬件电路的硬件电路的设计与搭建设计与搭建软件编写软件编写任务实施任务实施使用yl236单片机实训考核装置显示模块中的led点阵显示屏单元上电后点阵显示屏向左移位循环显示123456780其中数字的点阵大小为816

点阵 左移 上移 右移 下移 下拉 等花样显示讲解学习

点阵 左移  上移 右移 下移 下拉 等花样显示讲解学习

点阵左移上移右移下移下拉等花样显示#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define sudu 20/***各种声明的声明*****/sbit LAT_port=P2^0;sbit CLK_port=P2^1;sbit DI_port=P2^2;sbit G_port=P2^3;sbit A_port=P2^4;sbit B_port=P2^5;sbit C_port=P2^6;sbit D_port=P2^7;uchar move; //上移下移用的全局变量uchar temp; //缓冲用的uchar han;uchar zi;uchar code ziku[]={0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,};uchar code ziku1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/};uchar BUF[4];/***子函数申明****/void delay(uint t);void xie595(uchar dat);void hangxuan(uchar han);void huanchong();void zhuanhuanzuoyi();void zhuanhuanyouyi();/***延时****///void delay(uint t){while(t--) ;}/****595输入函数****///void xie595(uchar dat){uchar i;CLK_port=0;for(i=0;i<8;i++){if((dat&0x80)!=0)DI_port=1;elseDI_port=0;CLK_port=1; //上升沿输入数据CLK_port=0;dat<<=1;}}/*******行扫描程序*******///void hangxuan(uchar han){switch(han){case 0:A_port = 0; B_port = 0; C_port = 0;D_port = 0;break;case 1:A_port = 1; B_port = 0; C_port = 0;D_port = 0;break;case 2:A_port = 0; B_port = 1; C_port = 0;D_port = 0;break;case 3:A_port = 1; B_port = 1; C_port = 0;D_port = 0;break;case 4:A_port = 0; B_port = 0; C_port = 1;D_port = 0;break;case 5:A_port = 1; B_port = 0; C_port = 1;D_port = 0;break;case 6:A_port = 0; B_port = 1; C_port = 1;D_port = 0;break;case 7:A_port = 1; B_port = 1; C_port = 1;D_port = 0;break;case 8:A_port = 0; B_port = 0; C_port = 0;D_port = 1;break;case 9:A_port = 1; B_port = 0; C_port = 0;D_port = 1;break;case 10:A_port = 0; B_port = 1; C_port = 0;D_port = 1;break;case 11:A_port = 1; B_port = 1; C_port = 0;D_port = 1;break;case 12:A_port = 0; B_port = 0; C_port = 1;D_port = 1;break;case 13:A_port = 1; B_port = 0; C_port = 1;D_port = 1;break;case 14:A_port = 0; B_port = 1; C_port = 1;D_port = 1;break;case 15:A_port = 1; B_port = 1; C_port = 1;D_port = 1;break;}}/*****缓冲****************/void huanchong(){uchar i;for(i=0;i<2;i++){BUF[i*2+1]=ziku[zi*32+i*32+han*2+1]; //右半部分屏的数据BUF[i*2]=ziku[zi*32+i*32+han*2]; //左半部分屏数据}}/*********左右转换********/void zhuanhuanzuoyi() //向左子函数{uchar wy;if(move<8){wy=move;temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy)); //右半屏的数据处理准备移动的屏左移(8-wy)位;看得见的右移wy位xie595(temp);temp=((BUF[1]<<(8-wy))|(BUF[0]>>wy)); //左半屏同上xie595(temp);}else{wy=(move-8);temp=((BUF[3]<<(8-wy))|(BUF[2]>>wy)); //同上xie595(temp);temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy));xie595(temp);}}void zhuanhuanyouyi() //向右子函数统统同上方向改变{uchar wy;if(move<8){wy=move;temp=((BUF[0]>>(8-wy))|(BUF[1]<<wy));xie595(temp);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);}else{wy=(move-8);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);temp=((BUF[2]>>(8-wy))|(BUF[3]<<wy));xie595(temp);}}/***一般显示***********/void yiban(){zi=0;han=0;LAT_port=0; // 锁住595G_port=1; //138 不使能for(zi=0;zi<4;zi++) //多少个字循环多少次{uint i;for(i=0;i<2000;i++) //刷屏N 次{xie595(ziku[zi*32+han*2+1]);xie595(ziku[zi*32+han*2]);LAT_port=1;//上升沿595输出数据LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;//关屏han++;if(han==16)han=0;}}}/**********下拉******/void xiala(){uint i,j=0;uint k;zi=0;han=0;LAT_port=0;G_port=1;for(k=0;k<64;k++) //一个字要16 {for(i=0;i<sudu*15;i++) //{xie595(ziku[zi*32+han*2+1]); //先写高位xie595(ziku[zi*32+han*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;if(han>j)han=0;}j++;if(j>15){G_port=1;j=0;delay(50000);zi++;if(zi==4)zi=0;}}}/*********上移***********/void shangyi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=0;han=0;for(j=0;j<(zi+1)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku[zi*32+han*2+1+move*2]);//......xie595(ziku[zi*32+han*2+move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi++;if(zi==4)zi=0;}}}/*********下移***********/void xiayi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=4;han=0;for(j=0;j<(zi+2)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku1[zi*32+han*2+1-move*2]);xie595(ziku1[zi*32+han*2-move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi--;if(zi<0)zi=4;}}}/*******左移***************/void zuoyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++){for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanzuoyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}/********右移**********/void youyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++) //移动16次置0{for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanyouyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}void main(){while(1){yiban();delay(30000);xiala();delay(30000);shangyi(); //各种调用delay(30000);xiayi();delay(30000);zuoyi();delay(30000);youyi();}}。

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

一、设计依据16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。

每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。

每次显示一行后再显示下一行。

本设计是利用实验仪上的16×16 LED点阵显示器,编写显示英文、汉字字符程序并进行显示,最好能移动显示。

要求在本设计过程中,通过设计合适的硬件电路及对应的软件,实现上述的控制过程,同时写出合格的课程设计说明书。

二、要求及主要内容1.硬件电路设计(1)完成89C51应用系统设计(晶振电路,上电复位电路等)(2)利用单片机I/O口或以扩展锁存器的方式控制点阵显示。

掌握单片机与16×16点阵块之间接口电路的设计方法。

2.程序设计掌握单片机与16×16点阵块之间接口电路的设计方法及编程要求完成主程序的设计及对应的子程序设计。

3.选芯片, 元件按设计连线4.完成子程序调试5.完成总调试三、途径和方法综合运用单片机和电子电路相关知识,实现本次设计。

进行程序设计时先画流程图再进行程序设计。

子程序调试按以下步骤进行:(1)实验板与PC机联机。

(2)利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。

要求编制程序实现汉字点阵循环显示。

点阵时钟摘要LED点阵显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。

它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。

并广泛的应用于公交汽车,码头,商店,学校和银行等公共场合的信息发布和广告宣传。

LED显示屏经历了从单色,双色图文显示屏到现在的全彩色视频显示屏的发展过程,自20世纪八十年代开始,LED显示屏的应用领域已经遍布交通、电信、教育、证券、广告宣传等各方面。

LED点阵显示屏可以显示数字或符号,通常用来显示时间、速度、系统状态等。

文章给出了一种基于MCS-51单片机的16×16 点阵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();}}。

订购产品技术要求

订购产品技术要求

订购产品技术要求1、产品样式要求图2、外观要求灯箱面板须采用耐用耐腐蚀防损坏的亚克力阳光板(样式见上图),整体厚度不低于55mm,箱体整体采用高强度抗腐蚀防静电铝合金件,要求通风降温,无火灾、电器等安全隐患,并在箱体上方安装圆孔挂钩。

如下图所示:LED显示屏不能有漏光孔点。

面板不得有漏光孔点。

面板与数码显示屏须贴合紧密、严实,不得有漏光缝隙。

LED显示屏与框架贴合紧密、严实,不得有漏光缝隙。

3、设备尺寸要求外部尺寸:高500mm,宽370mm,整体厚度55mm显示区域尺寸:字幕区域长325mm,宽于75mm奖池金额显示区域:长255mm,高80mm4、主要使用功能要求具有正面静态图案,且通过LED背光的方式点亮,可用于体育彩票的宣传;具有奖池公告区域,可用于大乐透当前奖池金额显示,可自动获取奖池金额;具有文字信息区域,可用于显示下发公告的营销及宣传内容,可自行选择和设置,可实现滚动播放。

5、后台管理功能要求1)网络后台管理功能可查询、汇总、打印各销售网点电子公告连线和使用情况统计。

有对应的各级人员管理权限,管理权限包括但不限于查询、信息发布、报表察看等功能。

工作人员每天可随时察看设备在线使用情况统计表。

2)后台管理平台可实时从中国体彩网抓取奖池信息数据,自动更新公告牌显示信息,无需人工干预。

3)平台具有完善的审核和防范机制,防止非法信息通过电子公告牌散布。

6、主要产品配置要求1)数码显示模组采用4位红光贴片LED数码显示,可实时显示奖池金额,显示单位为亿元,奖池金额低于1亿元时,小数点前只显示零,如0.30,而不是00.30。

2)信息滚动屏模组LED点阵为16(纵向)*80(横向)点。

可显示下发的文字信息(不少于5个汉字),支持无线网络连接。

3)内置SIM卡支持2G/3G/4G等无线通讯连接,可以实时自动接收奖池累计总额数值信息。

7、技术参数要求1)背光LED发光二极管2)数码显示模组3)信息滚动屏4)屏体规格5)关键部件技术参数。

点阵屏显示原理及实验详解讲解

点阵屏显示原理及实验详解讲解

点阵屏显示原理及实验详解讲解标题:LED点阵屏学习攻略共享资料LED点阵屏学习攻略在经历了将近一个学期断断续续的点阵屏学习后,最后终于在AVR平台下完成了128*32点阵屏的无闪烁显示。

现把整个学习过程总结如下:无论是51单片机还是AVR单片机,点阵屏的显示原理是一样的,所以首先从51讲起。

说明:以下所有试验如无特殊说明均在Keil uVision3 + Proteus 6.9 SP5下仿真完成。

一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C52、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。

在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。

在这里请大家牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。

2.在选择完以上三个元件后,我们开始布线,具体如下图:这里P2是列选,P3连接38译码器后作为行选。

选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。

3.下面让我们把它点亮,先看一个简单的程序:(将奇数行偶数列的点点亮,效果如下图)下面是源代码:/************8*8LED点阵屏显示*****************/#includevoid delay(int z) //延时函数{int x,y;for(x=0;x<z;x++)< p="">for(y=0;y<110;y++);}void main(){while(1){P3=0; //行选,选择第一行P2=0x55; //列选,即该行显示的数据delay(5); //延时/*****下同*****/P3=2; //第三行P2=0x55;delay(5);P3=4; //第五行P2=0x55;delay(5);P3=6; //第七行P2=0x55;delay(5);}}上面的程序实现了将此8*8点阵的奇数行偶数列的点点亮的功能。

LED点阵屏左移

LED点阵屏左移
//*********************************************************************************
//***********横向取模,左边为高位*****************
//***********每个汉字共32字节*********
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//*******************************以上字码用作黑屏**********************************
}
}
/*******************发送一行的子函数************************/
void sendoneline(void)
{char s;uchar inc;
if(col&lt;8)inc=0;else inc=1;
for(s=0+inc;s&lt;=15+inc;s++) //s=2*要显示的数字-1
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
sbit temp10=temp1^0;
sbit temp11=temp1^1;
sbit temp12=temp1^2;

点阵显示

点阵显示

MOV HEX, A
RET
ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H
DB 46H
在这个程序中, 查表指令MOVC A, @A+PC到表格首地 址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。
3、点阵结构
8*8点阵内部结构图
8*8点阵引脚

跟我做
1、准备器件 2、焊接电路板 3、编写简单程序 4、建立单片机控制点阵系统
电路原理图
跟我总结
1、通过并行口控制点阵显示需 要哪些基本电路 2、动态扫描显示原理在显示系 统中的应用
课后任务
• 1、编写实训报告:总结实训过程遇到的 问题、解决方法和收获 • 2、若是16×16的点阵,硬件、软件需如 何修改和设计? • 3、若要按照特定样式显示(如上移、左 移等)
指令系统中, 有两条查表指令: MOVC A, @A+PC MOVC A, @A+DPTR
例 一个十六进制数存放在内部 RAM 的 HEX单元的低 4 位中, 将其转换成ASCII码并送回 HEX单元。
十六进制 0~9的ASCII码为 30H~39H, A~F的ASCII
码为41H~46H, ASCII码表格的首地址为ASCTAB。编程如下: ORG 1000H HEXASC: MOV A, HEX ANL A, #0FH ADD A, #3 MOVC A, @A+PC ;
1-5 点阵显示
项目引入
• 点阵显示在各种会议、路牌、广告 等场合应用非常广泛
会议上主席台上方的电子横幅

LED点阵显示仿真----由浅入深之8X8,16X16,24X24LED点阵流动显示

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自带的汇编编辑器,就可以在里面写代码了。

16×16点阵LED电子显示屏设计报告_单片机课程设计报告

16×16点阵LED电子显示屏设计报告_单片机课程设计报告

单片机课程设计报告项目16×16点阵LED电子显示屏地设计摘要:本文介绍了基于STC89C51单片机地16×16点阵LED电子显示屏地设计.分别介绍了显示屏显示地基本原理,硬件设计、控制方法及其程序地实现.经过调试和分析,本设计基本满足了题目设计地要求.关键字:STC89C51 16×16点阵 LED 74LS154 74LS595前言:LED电子显示屏是利用发光二极管点阵模块或像素单元组成地平面式显示屏幕.他具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点.并广泛用于公交汽车、码头、商店、学校和银行等公共场合用于信息地发布和广告宣传.自20世纪八十年代开始,LED电子显示屏地应用领域已经遍布了交通、电信、教育、广告宣传等各方面.LED电子显示屏发展较快,其无论在成本和产生地社会效益等方面都有其独特地优势.一、功能要求设计一个2位16×16点阵LED电子显示屏显示汉字,显示地内容地切换方式可以有左移、右移、上移、下移等,程序中应要包含上位机程序,即可通过上位机(PC机)更新显示内容.二、方案论证2.1 LED驱动显示方案大屏幕显示广泛应用于各个领域,动态大屏幕显示系统显示地文字,数字,图形等生动逼真,立体感强.用单片机驱动LED点阵有很多方法,按显示方式分,有静态显示和动态(扫描)显示,按译码方式可分硬件译码和软件译码之分.静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示地数据送出后就不再管,直到下一次显示数据需要更新时再传送一次新数据,显示数据稳定,占用很少地CPU时间.动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用地CPU时间多.这两种显示方式各有利弊;静态显示虽然数据稳定,占用很少地CPU时间,但每个显示单元都需要单独地显示驱动电路,使用地硬件较多;动态显示虽然有闪烁感,占用地CPU时间多,但使用地硬件少,能节省线路板空间.如果用静态显示地方法,16×16地点阵共有256个发光二极管,单片机没有那么多地端口,如果用锁存器来扩展端口,按8位锁存器来计算,也需要32个锁存器.两位显示就需要64个锁存器.因此在实际应用中地显示屏几乎都不采用静态显示,而是采用动态扫描地显示方法.本次设计地要求是2位地16×16点阵显示,采用动态显示,扫描电路就可以实现多行地同名列共用一套列驱动器.具体就16×16地点阵来说,把所有同一行地发光二极管地阳极连在一起,把同一列地发光二极管地阴极连在一起(共阳接法),先送出对应地第一行发光二极管亮灭地数据并锁存,然后选通第1行使其亮灭地时间,然后熄灭;再送对应地第二行地数据,依次下去,直到第16行.整个来回地时间只要能够达到每秒24次以上,由于人眼地视觉暂留现象,就可以看到显示在屏幕上地稳定地图像了.2.2数据传输和显示方案采用扫描方式进行显示时,每行一个行驱动器,各行地同名列共用一个列驱动器.显示数据通常存储在单片机地存储器中,按8位一个字节地形式顺序排放.显示时要把一行中各列地数据都传送到相应地列驱动器上,这就存在着一个显示数据传输地问题.从控制电路到列驱动器地数据传输可以采用并行方式或串行方式.显然,采用并行方式时,从控制电路到列驱动器地线路数量大,相应地硬件数目多.当列数很多时,并行传输地方案不可取.采用串行传输地方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面比较经济.但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行地各列数据都已传输到位后,这一行地各列才能并行地进行显示.这样,对于一行地显示过程就可以分解为列数据传输和列数据显示两个部分.解决串行传输中列数据传输和列数据显示地时间矛盾问题,可以采用重叠处理地方法.即在显示本行各列数据地同时,传送下一行地列数据.为了达到重叠处理地目地,列数据地显示就需要具有锁存地功能.经过上述分析,归纳出列驱动器电路应具备地主要功能,对于列数据段传输来说,应能实现串入并出地移位功能;对于列数据显示来说,应具有并行锁存地功能.综上所述,本次设计采用动态扫描方式驱动LED显示,采用串入并出地方法实现数据传输和采用并行锁存地方法实现数据显示.2.3系统整体方案框图经过分析,给出系统电路原理框图如图1-1.三、系统硬件电路设计硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路三部分. 3.1单片机系统及其外围电路本次设计采用单片机STC89C51,使用11.0592MHZ地晶振.单片机地串口与列驱动器相连,用来送显示数据.P1口低4位与行驱动器相连,送出行选信号;P1.5~P1.7口则用来送控制信号.P0和P2空着,在有必要时可以扩展系统地ROM和RAM.设计地显示界面可显示2个汉字,需要8个8×8 LED点阵模块,组成16×32地矩形点阵.3.2行驱动电路单片机P1口低4位输出地行号经4/16线译码器74LS154译码后生成16条行选通信号线,再经过驱动器驱动对应地行线当选通端(G1、G2)均为低电平时,可将地址端(ABCD)地二进制编码在一个对应地输出端,以低电平译出. 若将G1 和G2 中地一个作为数据输入端,由 ABCD 对输出寻址,54/74154 还可作1 线-16 线数据分配器.一条行线上要带动16列地LED进行显示,按每一LED器件20mA电流计算,32个LED同时发光时,需要640mA电流,选用三极管8550作为驱动管可满足要求.3.3列驱动电路列驱动器由集成电路74HC595构成.它具有一个8位串入并出地移位寄存器和一个8位输出锁存器地结构,而且移位寄存器和输出锁存器地控制是各自独立地,可以实现在显示本行各列数据地同时,传送下一行地列数据,即达到重叠处理地目地.引脚SI为串行数据输入端,与单片机串口RXD(P3.0)相连,用来传送数据;引脚SCK为移位寄存器地移位时钟脉冲,与单片机串口TXD(P3.1)相连;引脚SCLR信号是移位寄存器地清0输入端,低电平有效,接与单片机P1.5口;RCLK是输出寄存器地打入信号,与单片机P1.6口相接;四、主要元器件功能介绍4.1 8×8点阵LED结构LED点阵电子显示屏是利用发光二极管点阵模块组成地平面显示屏幕.8×8点阵是最基本地单元模块,由4块8×8点阵可构成一块16×16点阵模块,由8块8×8点阵可构成一块18×32点阵模块.单色8×8点阵外形及结构如图1-3:图1-2 硬件电路原路图图1-3从图1-3中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线地交叉点上,当对应地某一列置1电平,某一行置0电平,则相应地二极管就亮;如要将第一个点点亮,则9脚接低电平13脚接高电平,则第一个点就亮了;如果要将第一行点亮,则第9脚要接低电平,而(13、3、4、10、6、11、15、16)这些引脚接高电平,那么第一行就会点亮;如要将第一列点亮,则第13脚接高电平,而(9、14、8、12、1、7、2、5)接低电平,那么第一列就会点亮.4.2 74LS154芯片介绍74LS154为4线-16线译码器,其管脚图如图1-4所示.引脚A,B,C,D为译码地址输入端,低电平有效;G1,G2为选通端,低电平有效;0-15为输出端,低电平有效.其功能表如图1-5所示.图1-53.3 74LS595芯片介绍74LS595是一个8位串行输入并行输出地移位寄存器和一个8位输出锁存器地结构.74HC595地内部结构如图1-6它地输入端有8个串行移位寄存器,每个移位寄存器地输出都连接一个输出锁存器.引脚SER是串行数据地输入端.引脚SRCLK是移位寄存器是移位时钟脉冲,在其上升沿发生移位,并将SER地下一个数据打入最低位.移位后地各路信号出现在各移位寄存器地输出端.RCLK是输出锁存器地打入信号,其上升沿将移位寄存器地输出打入输出锁存器.引脚E是输出三态门地开放信号,只要当其为低时锁存器地输出才开放,否则为高阻态.SRCLK*是寄存器地清零输入端,当其为低电平时输出全部为零.由于SRCLK和RCLK两个信号是互相独立地,所以能够作到输入串行移位与输出锁存互不干扰.芯片地输出端为Q0——Q7,最高位Q7可以做为多片74LS595级联应用向下级地芯片输入.但因Q7受输出锁存器打控制,所以还从输出锁存器前引出了QT作为级联输出.图1-6五、系统软件设计显示屏软件地主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计地要求显示.根据软件分层次设计地原理,可把显示屏地软件系统分成两大层:第一层是底层地显示驱动程序,第二层是上层地系统应用程序.显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED显示屏地扫描显示工作.显示驱动程序由定时器T0中断程序实现.系统应用程序完成系统环境地设置、显示效果处理等工作,由主程序来实现.5.1 显示驱动程序显示驱动程序在进入中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率地稳定,然后显示驱动程序查询当前燃亮地行号,从显示缓寸区内读取下一行地显示数据,并通过串口发送给移位寄存器.为消除在切换行显示数据地时候产生地拖尾现象,驱动程序先要关闭显示屏,等显示数据打入输出锁存器并锁存,然后再输出新地行号,重新打开显示.图1-7是显示驱动程序地流程图.5.2系统主程序系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口以及显示效果.如、左移、右移等.系统主程序地流程图如图1-8所示.六、调试及性能分析6.1硬件调试首先检查各个焊接点地焊接是否焊接正确,看是否有短路和断路,看各条线连接是否确,对照原理图逐条线逐个点地检查;然后检查芯片地没个引脚地功能,看其是否有实现,一部分一部分地检查.直至检查出错误或保证电路完全正确.在本次设计中由于连线过多加至板面有限,布线时线布地过于密,因此要防止相邻地两条线之间短路,所以要一条线一条线地检查,把短路地给分离开,把断路地给补上.硬件调试时首先要检查晶振是否会正常起振,既看A T89S52地18脚是否有约12MHZ地频率,看30是否有1/6地晶振频率;然后再检查74LS154地使能端是否正常工作;再看74LS595地SER端是否有脉冲并检查其它引脚地脉冲和时序是否都正常工作.最后再检查LED灯地各行和各列是否都连接正确.各部分都调试正常之后就可以进行软件调试了.6.2软件调试软件部分需要调试地分需要调试地主要有显示屏地刷新率及显示效果部分.显示屏地刷新率由定时器T0地溢出率和单片机地晶振频率决定.显示驱动程序在进入中断后首先要对定时器T0重新赋初值,以保证显示屏地刷新率地稳定.定时器T0设定为工作方式1,即16位定时器模式,晶振频率f为11.0592MHZ,通过计算得定时器T0地初值TH0=0XFCH,TL0=0X18H.显示效果处理程序地内容及方法非常广泛,本次采用地是左移、两边对移、和上移. 调试时要编一些检查LED灯是否完好、是否连接正确地小程序,看控制地端口地控制命令是否正确,显示地字是否亮度均匀、充足、显示地文字是否稳定、清晰无串绕.我在做本次设计中,主要是硬件调试,在程序调试时观察字左移显示是否完全显示完.,还在字段间加空格使得显示更加美观,另外显示地延时也要取得恰当.七、设计总结两周地课程设计终于圆满落下帷幕了.经过这次地课程设计,让我更深刻体会到了把理论学习联系到实践应用当中地重要性.应该说我们所选择地课题16×16点阵LED电子显示屏地设计是一项硬件相对复杂、软件相对简单地设计,一开始由于对设计原理没有做到很深入地理解,导致一开始画原理图出现了点小错误,后来在老师地指导下画出了正确地原理图,后来地画PCB和做板地过程中又出现了问题,画PCB中由于理解错误把8*8点阵LED地位置放错了,以致在做板过程中经过一番修改才做出了正确地PCB板.在软件设计时,参考了很多网上搜索地资料,经过无数次地修改和调试,最后确定了这次设计地源程序.总之,经过这次课程设计,让我们地实践动手能力得到了很大地提高,在接下来地学习中,我们应该更多地把学习地理论知识应用到实践当中.参考文献【1】孙育才. 单片微型计算机及其应用. 东南大学出版社 2004【2】李华. MCS-51系列单片机实用接口技术. 北京航空航天大学出版社.1993附录一:完整源程序#include<reg51.h>#define BLKN 4sbit G=0x97。

点阵 左移 上移 右移 下移 下拉 等花样显示讲解学习

点阵 左移  上移 右移 下移 下拉 等花样显示讲解学习

点阵左移上移右移下移下拉等花样显示#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define sudu 20/***各种声明的声明*****/sbit LAT_port=P2^0;sbit CLK_port=P2^1;sbit DI_port=P2^2;sbit G_port=P2^3;sbit A_port=P2^4;sbit B_port=P2^5;sbit C_port=P2^6;sbit D_port=P2^7;uchar move; //上移下移用的全局变量uchar temp; //缓冲用的uchar han;uchar zi;uchar code ziku[]={0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,};uchar code ziku1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/};uchar BUF[4];/***子函数申明****/void delay(uint t);void xie595(uchar dat);void hangxuan(uchar han);void huanchong();void zhuanhuanzuoyi();void zhuanhuanyouyi();/***延时****///void delay(uint t){while(t--) ;}/****595输入函数****///void xie595(uchar dat){uchar i;CLK_port=0;for(i=0;i<8;i++){if((dat&0x80)!=0)DI_port=1;elseDI_port=0;CLK_port=1; //上升沿输入数据CLK_port=0;dat<<=1;}}/*******行扫描程序*******///void hangxuan(uchar han){switch(han){case 0:A_port = 0; B_port = 0; C_port = 0;D_port = 0;break;case 1:A_port = 1; B_port = 0; C_port = 0;D_port = 0;break;case 2:A_port = 0; B_port = 1; C_port = 0;D_port = 0;break;case 3:A_port = 1; B_port = 1; C_port = 0;D_port = 0;break;case 4:A_port = 0; B_port = 0; C_port = 1;D_port = 0;break;case 5:A_port = 1; B_port = 0; C_port = 1;D_port = 0;break;case 6:A_port = 0; B_port = 1; C_port = 1;D_port = 0;break;case 7:A_port = 1; B_port = 1; C_port = 1;D_port = 0;break;case 8:A_port = 0; B_port = 0; C_port = 0;D_port = 1;break;case 9:A_port = 1; B_port = 0; C_port = 0;D_port = 1;break;case 10:A_port = 0; B_port = 1; C_port = 0;D_port = 1;break;case 11:A_port = 1; B_port = 1; C_port = 0;D_port = 1;break;case 12:A_port = 0; B_port = 0; C_port = 1;D_port = 1;break;case 13:A_port = 1; B_port = 0; C_port = 1;D_port = 1;break;case 14:A_port = 0; B_port = 1; C_port = 1;D_port = 1;break;case 15:A_port = 1; B_port = 1; C_port = 1;D_port = 1;break;}}/*****缓冲****************/void huanchong(){uchar i;for(i=0;i<2;i++){BUF[i*2+1]=ziku[zi*32+i*32+han*2+1]; //右半部分屏的数据BUF[i*2]=ziku[zi*32+i*32+han*2]; //左半部分屏数据}}/*********左右转换********/void zhuanhuanzuoyi() //向左子函数{uchar wy;if(move<8){wy=move;temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy)); //右半屏的数据处理准备移动的屏左移(8-wy)位;看得见的右移wy位xie595(temp);temp=((BUF[1]<<(8-wy))|(BUF[0]>>wy)); //左半屏同上xie595(temp);}else{wy=(move-8);temp=((BUF[3]<<(8-wy))|(BUF[2]>>wy)); //同上xie595(temp);temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy));xie595(temp);}}void zhuanhuanyouyi() //向右子函数统统同上方向改变{uchar wy;if(move<8){wy=move;temp=((BUF[0]>>(8-wy))|(BUF[1]<<wy));xie595(temp);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);}else{wy=(move-8);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);temp=((BUF[2]>>(8-wy))|(BUF[3]<<wy));xie595(temp);}}/***一般显示***********/void yiban(){zi=0;han=0;LAT_port=0; // 锁住595G_port=1; //138 不使能for(zi=0;zi<4;zi++) //多少个字循环多少次{uint i;for(i=0;i<2000;i++) //刷屏N 次{xie595(ziku[zi*32+han*2+1]);xie595(ziku[zi*32+han*2]);LAT_port=1;//上升沿595输出数据LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;//关屏han++;if(han==16)han=0;}}}/**********下拉******/void xiala(){uint i,j=0;uint k;zi=0;han=0;LAT_port=0;G_port=1;for(k=0;k<64;k++) //一个字要16 {for(i=0;i<sudu*15;i++) //{xie595(ziku[zi*32+han*2+1]); //先写高位xie595(ziku[zi*32+han*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;if(han>j)han=0;}j++;if(j>15){G_port=1;j=0;delay(50000);zi++;if(zi==4)zi=0;}}}/*********上移***********/void shangyi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=0;han=0;for(j=0;j<(zi+1)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku[zi*32+han*2+1+move*2]);//......xie595(ziku[zi*32+han*2+move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi++;if(zi==4)zi=0;}}}/*********下移***********/void xiayi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=4;han=0;for(j=0;j<(zi+2)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku1[zi*32+han*2+1-move*2]);xie595(ziku1[zi*32+han*2-move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi--;if(zi<0)zi=4;}}}/*******左移***************/void zuoyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++){for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanzuoyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}/********右移**********/void youyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++) //移动16次置0{for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanyouyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}void main(){while(1){yiban();delay(30000);xiala();delay(30000);shangyi(); //各种调用delay(30000);xiayi();delay(30000);zuoyi();delay(30000);youyi();}}。

stm32点阵移动程序

stm32点阵移动程序

此程序是用的flash里面装的字库的方法来做的,可以显示各种字和字符,可以各种移动,左移,右移,上下移动都可以。

以下是该程序的主要代码(所谓的主要代码就是跟移动有关的代码)/*********************************************************************************************** *****程序名称:LedDisplay(void)**输入参数:无**输出参数:无**返回值:无**描述:LED显示板一行显示程序。

此程序读取显示缓存中的数据,并在LED上显示出来。

** 注:此程序显示的字模为纵向取模。

************************************************************************************************ **/void LedDisplay(void){uint16_t offset_addr;uint16_t lenght;uint8_t *data;// #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.// OS_CPU_SR cpu_sr = 0u;// OS_ENTER_CRITICAL();// #endifoffset_addr = (ScanRow / 8) * LED_SET.Width ;LedScanTime = 0;/*关显示(消隐)*/if(!LED_SET.ENMode){LedEn_H(); //关显示}else{LedEn_L();}lenght = LED_SET.Width;/* 输出列数据*/if(!BackFlag){data = Buf0 + offset_addr;while(lenght--){LedOutBit(*data,ScanRow);data ++;}}else{data = Buf1 + offset_addr;while(lenght--){LedOutBit(*data,ScanRow);data ++;}}LedClk_L();LedLat_L(); //锁存数据LedDelay(10);LedLat_H();LedDelay(10);LedLat_L();offset_addr = LedScanTime;/*关显示(消隐)*/if(!LED_SET.ENMode){LedEn_H(); //关显示}else{LedEn_L();}/* 输出行扫描信号*/ScanRow &= 0x0F;LedRow(ScanRow);ScanRow ++; //行+1 if(ScanRow == LED_SET.ScanMode) //16 {ScanRow = 0;if(ScanRow == LED_SET.FirstRow) //如果完成一帧扫描,置标志,扫描完16行{ScanFlag = 1; //只有当ScanFlag = 1时,才能切换显示容}else{ScanFlag = 0;}// #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.// OS_EXIT_CRITICAL();// #endifLedDelay(LED_SET.BlankTime); //消隐时间if(LED_SET.OnOff == ON) //如果显示屏配置为显示,则开显示{if(!LED_SET.ENMode){LedEn_L(); //开显示}else{LedEn_H();}}}void Get_HzMat(unsigned char *code,unsigned char *mat,uint8_t size){unsigned char qh,ql;unsigned char i;unsigned long foffset;#if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3 OS_CPU_SR cpu_sr = 0u;#endifqh = *code;ql = *(++code);if(qh<0x81||ql<0x40||ql==0xff||qh==0xff) //非常用汉字,没有包含在字库for(i=0;i<(size*2);i++){*mat++ = 0x00; //填充满格}return; //结束访问}if(ql<0x7f){ql-=0x40; //注意!}else{ql-=0x41;}qh -= 0x81;foffset = ((unsigned long)190 * qh + ql) * (size * 2);//得到字库中的字节偏移量#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.OS_ENTER_CRITICAL();#endifFlashBusy ^= 1;SPI_FLASH_BufferRead(mat,GBK16_ADDR + foffset,32); //从flash中读取FlashBusy ^= 1;#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.OS_EXIT_CRITICAL();#endif}/*********************************************************************************************** *****程序名称:Show_Char(int16_t row,int16_t col,uint8_t str,uint8_t back)**输入参数:int16_t row 显示行坐标** int16_t col 显示列坐标** uint8_t str 指定字符** uint8_t back 指示写入字模的显示缓存**输出参数:无**返回值:无**描述:在指定位置显示一个16*8字符。

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

一、设计依据16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。

每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。

每次显示一行后再显示下一行。

本设计是利用实验仪上的16×16 LED点阵显示器,编写显示英文、汉字字符程序并进行显示,最好能移动显示。

要求在本设计过程中,通过设计合适的硬件电路及对应的软件,实现上述的控制过程,同时写出合格的课程设计说明书。

二、要求及主要内容1.硬件电路设计(1)完成89C51应用系统设计(晶振电路,上电复位电路等)(2)利用单片机I/O口或以扩展锁存器的方式控制点阵显示。

掌握单片机与16×16点阵块之间接口电路的设计方法。

2.程序设计掌握单片机与16×16点阵块之间接口电路的设计方法及编程要求完成主程序的设计及对应的子程序设计。

3.选芯片, 元件按设计连线4.完成子程序调试5.完成总调试三、途径和方法综合运用单片机和电子电路相关知识,实现本次设计。

进行程序设计时先画流程图再进行程序设计。

子程序调试按以下步骤进行:(1)实验板与PC机联机。

(2)利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。

要求编制程序实现汉字点阵循环显示。

点阵时钟摘要LED点阵显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。

它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。

并广泛的应用于公交汽车,码头,商店,学校和银行等公共场合的信息发布和广告宣传。

LED显示屏经历了从单色,双色图文显示屏到现在的全彩色视频显示屏的发展过程,自20世纪八十年代开始,LED显示屏的应用领域已经遍布交通、电信、教育、证券、广告宣传等各方面。

LED点阵显示屏可以显示数字或符号,通常用来显示时间、速度、系统状态等。

文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。

16x16点阵上下左右可调及点阵显示原理资料

16x16点阵上下左右可调及点阵显示原理资料

16x16点阵上下左右可调及点阵显示原理资料16x16点阵上下左右可调及点阵显示原理#include#include#define uchar unsigned char#define uint unsigned intsbit key0P1^7;uchar i,j,h,temp[4],moshi0;uchar ss,ii,n,num;sbit st_cpP2^0; //74HC595锁存端sbit sh_cpP2^1; //74HC595移位时钟端sbit dsP2^2; //74HC595串行数据端sbit enP2^7; //74HC154使能端uchar table[] //"佳"字代码0x08,0x40,0x08,0x40,0x0B,0xFC,0x10,0x40,0x10,0x40,0x30,0x40,0x3F,0xFE,0x50,0x00,0x90,0x40,0x10,0x40,0x13,0xFC,0x10,0x40,0x10,0x40,0x10,0x40,0x1F,0xFE,0x10,0x00,;//---------延时函数-----------void delayuint twhilet--;void anjianif!key0while!key0;moshi++;ifmoshi4 moshi0;ss0;ii0;i0;n0;void hc595_datuchar dsauchar h;forh0;h8;h++ //列码高8位,循环8次才能将高8位移完sh_cp0; //时钟为0dsdsa&0x80; //取高8位的最高位sh_cp1; //时钟为1, 成上升沿有效移一位dsadsa1; //左移一位void shangyifori0;i16;i++ //扫描行,16行循环16次ifi+ss16temp[0]table[2*i+ss*2] ;temp[1]table[2*i+1+ss*2] ;hc595_dattemp[0];hc595_dattemp[1];st_cp1;//595锁存列码数据P3i; //赋行码en0; //154使能delay100; en1; //154关闭使能st_cp0;//595关闭锁存elseen1;delay150;void xiayifori0;i16;i++ //扫描行,16行循环16次temp[0]table[2*i] ;temp[1]table[2*i+1] ;hc595_dattemp[0];hc595_dattemp[1];st_cp1;//595锁存列码数据P3i+ss%16; //赋行码en0; //154使能delay100;en1; //154关闭使能st_cp0;//595关闭锁存void zuoyiuchar hbit,left;fori0;i16;i++temp[0]table[2*i] ;temp[1]table[2*i+1] ;temp[2]table[2*i+32] ;temp[3]table[2*i+33] ;leftn;//左移位数 for;left0;left-- //移位函数hbittemp[0]&0x80;fornum0;num3;num++temp[num]temp[num]1;temp[num]+temp[num+1]7;temp[3]temp[3]1;ifhbit temp[3]+0x01; hc595_dattemp[0]; //显示函数hc595_dattemp[1];st_cp1;//595锁存列码数据P3i; //赋行码en0; //154使能delay120; en1; //154关闭使能st_cp0;void youyiuchar lbit,left;fori0;i16;i++temp[0]table[2*i] ;temp[1]table[2*i+1] ;temp[2]table[2*i+32] ;temp[3]table[2*i+1+32] ;ifn16 n0;leftn;//左移位数 for;left0;left-- //移位函数lbittemp[1]&0x01;temp[1]temp[1]1;temp[1]+temp[0]7;temp[0]temp[0]1;iflbit temp[0]+0x80; hc595_dattemp[0]; //显示函数hc595_dattemp[1];st_cp1;//595锁存列码数据P3i; //赋行码en0; //154使能delay250; en1; //154关闭使能st_cp0;void initTMOD0x10; //设置T0为计数器,T1为定时器,工作于方式1(16位)TH10Xd8;TL10Xef;ET11;EA1;TR11;void maininit;while1forss0;ss16;ss++ forii0;ii6;ii++ifmoshi0 shangyi;else ifmoshi1 xiayi;else ifmoshi2 zuoyi;else youyi;n++;ifn16 n0;void timer1 interrupt 3TH10Xd8;TL10Xef;anjian;点阵字库的生产原理所有的汉字或者英文都是下面的原理,由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define sudu 20/***各种声明的声明*****/sbit LAT_port=P2^0;sbit CLK_port=P2^1;sbit DI_port=P2^2;sbit G_port=P2^3;sbit A_port=P2^4;sbit B_port=P2^5;sbit C_port=P2^6;sbit D_port=P2^7;uchar move; //上移下移用的全局变量uchar temp; //缓冲用的uchar han;uchar zi;uchar code ziku[]={0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,};uchar code ziku1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/};uchar BUF[4];/***子函数申明****/void delay(uint t);void xie595(uchar dat);void hangxuan(uchar han);void huanchong();void zhuanhuanzuoyi();void zhuanhuanyouyi();/***延时****///void delay(uint t){while(t--) ;}/****595输入函数****///void xie595(uchar dat){uchar i;CLK_port=0;for(i=0;i<8;i++){if((dat&0x80)!=0)DI_port=1;elseDI_port=0;CLK_port=1; //上升沿输入数据CLK_port=0;dat<<=1;}}/*******行扫描程序*******///void hangxuan(uchar han){switch(han){case 0:A_port = 0; B_port = 0; C_port = 0;D_port = 0;break;case 1:A_port = 1; B_port = 0; C_port = 0;D_port = 0;break;case 2:A_port = 0; B_port = 1; C_port = 0;D_port = 0;break;case 3:A_port = 1; B_port = 1; C_port = 0;D_port = 0;break;case 4:A_port = 0; B_port = 0; C_port = 1;D_port = 0;break;case 5:A_port = 1; B_port = 0; C_port = 1;D_port = 0;break;case 6:A_port = 0; B_port = 1; C_port = 1;D_port = 0;break;case 7:A_port = 1; B_port = 1; C_port = 1;D_port = 0;break;case 8:A_port = 0; B_port = 0; C_port = 0;D_port = 1;break;case 9:A_port = 1; B_port = 0; C_port = 0;D_port = 1;break;case 10:A_port = 0; B_port = 1; C_port = 0;D_port = 1;break;case 11:A_port = 1; B_port = 1; C_port = 0;D_port = 1;break;case 12:A_port = 0; B_port = 0; C_port = 1;D_port = 1;break;case 13:A_port = 1; B_port = 0; C_port = 1;D_port = 1;break;case 14:A_port = 0; B_port = 1; C_port = 1;D_port = 1;break;case 15:A_port = 1; B_port = 1; C_port = 1;D_port = 1;break;}}/*****缓冲****************/void huanchong(){uchar i;for(i=0;i<2;i++){BUF[i*2+1]=ziku[zi*32+i*32+han*2+1]; //右半部分屏的数据BUF[i*2]=ziku[zi*32+i*32+han*2]; //左半部分屏数据}}/*********左右转换********/void zhuanhuanzuoyi() //向左子函数{uchar wy;if(move<8){wy=move;temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy)); //右半屏的数据处理准备移动的屏左移(8-wy)位;看得见的右移wy位xie595(temp);temp=((BUF[1]<<(8-wy))|(BUF[0]>>wy)); //左半屏同上xie595(temp);}else{wy=(move-8);temp=((BUF[3]<<(8-wy))|(BUF[2]>>wy)); //同上xie595(temp);temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy));xie595(temp);}}void zhuanhuanyouyi() //向右子函数统统同上方向改变{uchar wy;if(move<8){wy=move;temp=((BUF[0]>>(8-wy))|(BUF[1]<<wy));xie595(temp);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);}else{wy=(move-8);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);temp=((BUF[2]>>(8-wy))|(BUF[3]<<wy));xie595(temp);}}/***一般显示***********/void yiban(){zi=0;han=0;LAT_port=0; // 锁住595G_port=1; //138 不使能for(zi=0;zi<4;zi++) //多少个字循环多少次{uint i;for(i=0;i<2000;i++) //刷屏N 次{xie595(ziku[zi*32+han*2+1]);xie595(ziku[zi*32+han*2]);LAT_port=1;//上升沿595输出数据LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;//关屏han++;if(han==16)han=0;}}}/**********下拉******/void xiala(){uint i,j=0;uint k;zi=0;han=0;LAT_port=0;G_port=1;for(k=0;k<64;k++) //一个字要16 {for(i=0;i<sudu*15;i++) //{xie595(ziku[zi*32+han*2+1]); //先写高位xie595(ziku[zi*32+han*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;if(han>j)han=0;}j++;if(j>15){G_port=1;j=0;delay(50000);zi++;if(zi==4)zi=0;}}}/*********上移***********/void shangyi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=0;han=0;for(j=0;j<(zi+1)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku[zi*32+han*2+1+move*2]);//......xie595(ziku[zi*32+han*2+move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi++;if(zi==4)zi=0;}}}/*********下移***********/void xiayi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=4;han=0;for(j=0;j<(zi+2)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku1[zi*32+han*2+1-move*2]);xie595(ziku1[zi*32+han*2-move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi--;if(zi<0)zi=4;}}}/*******左移***************/void zuoyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++){for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanzuoyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}/********右移**********/void youyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++) //移动16次置0{for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanyouyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}void main(){while(1){yiban();delay(30000);xiala();delay(30000);shangyi(); //各种调用delay(30000);xiayi();delay(30000);zuoyi();delay(30000);youyi();}}。

相关文档
最新文档