点阵移动方法集锦
点阵屏的移动显示

点阵屏的移动显示/*--------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--);}。
点阵左移显示原理

点阵左移显示原理点阵左移显示是一种常见的显示技术,它通过依次改变点阵中的像素点的亮灭状态,从而实现图像或文字的左移显示效果。
这种显示原理广泛应用于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);}}。
LED点阵移动

目录第一章设计内容和要求 (1)1.1总体设计要求 (1)1.2具体要求 (1)1.3方案 (1)第二章系统的硬件设计与实现 (2)2.1电路设计框图 (2)2.2系统硬件概述 (2)2.3主要电路的设计 (2)2.3.1AT89C52单片机 (2)第三章软件设计 (7)3.1字母数字编码 (7)3.2程序流程图 (9)第四章系统调试 (10)4.1硬件测试 (10)4.2软件测试 (10)第五章设计小结 (11)参考文献 (12)附录一元器件清单 (13)附录二程序清单 (14)附录三原理图 (16)附录四实物图 (17)设计任务书 (18)第一章设计内容和要求1.1总体设计要求本系统采用单片机AT89C52为LED显示屏的控制核心,制造一种简单的8×8显示屏,能够在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字稳定、清晰无串扰,图形或文字显示有静止、移入移出等显示方式。
本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。
1.2具体要求1.运用单色或双色LED显示动态画面;2.运用单片机和LED字符显示器完成设计;3.焊接电路板;4.下载程序进行调试,完成报告.1.3方案本设计思路是:利用单片机对整个系统进行总体控制,进行显示所要显示的字符。
显示方式为:逐字滚动显示。
显示字模数据由单片机输入显存,点阵的点亮过程有程序控制,点阵采用单色显示,该显示器电路的特点是:点阵的动态显示过程占用时间比较短,亮度比较高。
根据设计要求,初步确定设计方案如下:1. 选择AT89C52单片机(晶振频率为f=11.0592MHZ)作为整个系统的核心器件,对整个系统进行总体控制,发送并时时处理系统信息。
2.通过编程滚动显示:“A B C 0 1 2 3 4 5 6 7 8 9”。
3. 扫描信号连接到单片机的P0口,显示信号连接到单片机的P2口。
4.点阵的点亮过程有程序控制,由驱动电路完成,点阵采用单色显示,其中驱动电路采共阴型高态扫描、高态显示信号的驱动电路。
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点阵书写屏图像拖移方法

的处 理 、对 圈 内图 像 坐标 点 的处 理 和 显 示 图像数 1 图像 圈定 点 的处 理 :把 圈上 的 点 按 照 行 )对
进 行排 序 ,取 出列 坐 标的最 大值 和最 小值 。
单片机 处理 图像拖移 的详 细方法 和相 关程序 ,该 程序结 构简 单 ,实用性 、可读 性强 ,可使 用 量大且不定 量的数据处 理编程 。
关键词 : 动态数组 ;指针 ;图像拖移 ;单片机 中图分类号 :T 3 2 1 P0 . 文献标识码 :A 文章编号 :1 0-0 ( 0 1 1 - -o3 -0 9 1 4 2 1 ) (I 0 3 ) l5 3
2 )对 圈 内图 像 坐 标 点 的处 理 :上 一 步取 出的
行 和列 坐 标 的最 大值 和 最小 值 可 以构成 一 个矩 形 , 把矩 形 内的地 址进 行坐 标化并 存入 数组 。
3 )显示 图 像 数 据移 动 :上 述两 步 执 行 后 ,光
笔触 及屏 上 的第一 点 (l 1 x ,y )定为基 准 点 ,第二 点 (2 2 x , )为 结 束 点 ,随 着光 笔移 动 ,而 前 面 被 y
睁 _ 叫 争 争 一 ∈
+
《 一— } @_ - 《 . — r . @一r 1 @ r 日 r {
@ @ @ ・@ — H { @ { @ r 『 r r 卜 @ @ @ ・@ 一0 }@ ‘ ・@ r 『 f r F
争 Ct 一 — —一■叫f — +l一 ④一 『 _ 粤 @
圈 中 的 点跟 随基 准 点移 动 ,当单 片机 处 理 速 度 比
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<8)inc=0;else inc=1;
for(s=0+inc;s<=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;
点阵的横向移动例题

点阵的横向移动例题题目:一个点阵的横向移动,相当于把点阵沿垂直方向复制一份并放在水平方向上,然后拿掉最左边的那份。
例如,对于点阵(1 2 3 4 5),横向移动1个单位后得到(2 3 4 5)。
现在给出一个长度为(2n+1) 的点阵,其中第(i) 个点在复平面上的坐标为((i, x_i)((i) 是下标,从0 开始))。
如果这个点阵经过若干次横向移动后能变为另一个点阵,那么这两个点阵的并集在复平面上形成的区域面积的最小值不小于(\frac{n^2}{4})。
给定两个长度为(2n+1) 的点阵,其中第(i) 个点在复平面上的坐标分别为((i, x_i) 和((i, y_i)。
我们需要证明这两个点阵的并集在复平面上形成的区域面积的最小值不小于(\frac{n^2}{4})。
证明:设两个点阵经过若干次横向移动后能变为同一个点阵,那么存在整数(k_1, k_2, \ldots, k_m)((m) 是某个自然数),使得对任意(i)((0 \leq i \leq 2n)),都有(x_{i+k_1} = y_{i+k_2})。
考虑任意一个长度为(n+1) 的子区间([a, b])((0 \leq a < b \leq n))。
由于(x_i = y_{i+k}) 对任意(i) 都成立,因此在这个子区间上,两个点阵的并集在复平面上形成的区域面积的最小值不小于(\frac{(b-a)^2}{4})。
对于任意两个不同的子区间([a_1, b_1]) 和([a_2,b_2]),如果它们没有公共的顶点,那么这两个子区间的并集在复平面上形成的区域面积的最小值不小于(\frac{(b_1-a_1)^2}{4} + \frac{(b_2-a_2)^2}{4})。
因此,对于任意长度为(n+1) 的子区间,都有对应的子区间的并集在复平面上形成的区域面积的最小值不小于(\frac{n^2}{4})。
所以,两个点阵的并集在复平面上形成的区域面积的最小值不小于(\frac{n^2}{4})。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我的空间有程序,你去看看,有十几种移动方法屏幕点阵数的话也可以随时改动的/*************呈现各种显示效果的函数集****************/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);}}。