最新点阵 左移 上移 右移 下移 下拉 等花样显示
- 格式:doc
- 大小:32.50 KB
- 文档页数:9
点阵屏的移动显示/*--------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);}}。
点阵左移上移右移下移下拉等花样显示#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();}}。
一、设计依据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点阵屏,我用四块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点阵的奇数行偶数列的点点亮的功能。
#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();}}。