we2=1;P0=xdat[i];we2=0;if(++i==8) i=0; //每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0;if(++Num_Index==10) Num_Index=0; //显示下一个数字 } break;case 1
1.首先用字模提取软件提取“大”字的字模。软件网上很多,用“字模提取”关键字可以搜到。也可以用EXCEL在8x8上方框上自己写一个“大字”,然后有标记的为1,没标记的为0,那么一行下来有8位既一个节,总共8行,共8个
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-
1.最简方案——利用延时函数:进入主函数后,初始化LED,设置一个延时初始值,然后进入while循环,里边只做四件事,打开LED,利用键盘返回值作延时函数参数,关闭LED,利用键盘返回值作延时函数参数。2.精确解决方案——定时器
主循环程序中,j 循环结束别加延时,那个delay(250);删掉。j 循环一次只是显示一屏,应再循环显示n屏,再 i 循环,调这个n大小,就是调滚动的速度。你现在是,一屏只显示一次,又加延时250,这等于黑屏了250的延时
另外如果你的51还要执行别的运算,应尽量减少它们的时间,也就是让51的绝大部分时间都在驱动LED“显示”。如果还不行,那就只能在LED驱动一侧加锁存器了。
我用51单片机串行通信方式去控制一块8×8LED点阵屏,显示的时候,文字闪烁厉害……
系统设计采用Windows操作系统下,开启文本编辑窗口,客户区内像素点采用与实际LED点阵显示屏像素点相同,功能类似Word文档编辑工具,包括编辑模块、绘图模块、文字编辑模块、颜色控制模块、显示效果加载模块、预览模块、信息下载模块。1、编辑模块
信息显示与光电技术。。。不信我也没关系,只能遗憾的提示你一下:如果是20个字的话1602就够了,要有很好效果的话12864是个不错的选择,可是要“基于网络”比较困难,至少要1355控制器的320*240 参考资料:sspu的我
整个电路由单片机89C52、点阵数据存储器6264、列驱动电路ULN2803、行驱动电路TIP122、移位寄存器4094及附属电路组成。该电路所设计的电子屏可显示10个汉字,需要40个8×8 LED点阵模块,可组成16×160的矩形点阵。由于AT89C52仅有8k存储空间,
显示32x32点阵的方法和显示16x16点阵的方法是一样的;16x16点阵就是要在同一行或者同一列中连续读取并输出2字节数据;同理,32x32点阵就是要在同一行或者同一列中连续读取并输出4字节数据;至于字节数据是先输出低位或者
8x8的点阵太小,很难正常显示一个汉字,通常,会使用4个8x8的点阵即16x16的点阵来显示一个汉字。单片机在通过点阵显示汉字的时候,需要用到如下技术手段:1、汉字取模 汉字取模,即把汉字对应16x16点阵的图形用16进制数来
10个32*32点阵汉字要64个字节。算法是按位算的。一个点阵的点位就需要字节里面的一个位来表示。32*32=1024,即需要1024B。如果8位是一个字节(8051一类的单片机),那么就需要1024/8=128字节。如果是16位为1字节,就
能存多少汉字关键看你的显示需要多大的汉字,例如16*16的汉字一个汉字需要32字节来存储,32*32汉字一个汉字需要128字节来存储,由于存储器还需要存储程序,因此,必须是剩余的空间来存储需要的汉字,你可以先存几个汉字的信息进去
根据51单片机的内存大小来设计一块32×32的点阵LED显示电路,请问可以存储多少汉字?
单片机16*16LED点阵移动问题 #include"reg52.h"#defineuintunsignedint#defineucharunsignedcharsbitlclk1=P2^0;sbitlclk2=P2^1;sbitlclk3=P2^2;sbitlclk4=P2^3;sbithclk1=P2^4;sbithclk2=P2^5;voidled(ucharn);v #
工作原理分析: 从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。16×16的点阵共有256个发光二极
基于51单片机的16×16点阵屏流动显示目录一,制作所需器材二,STC89C52简介三,点阵的简介四,程序五,演示六,总结一.制作所需器材1.单片机开发扳一块;2.16*16LED点阵一块;3.杜邦线若干;返回二.STC89C52简介STC89C52是S
逐行显示。快速的轮流显示 16 行。人眼,有暂留效应,即可看到全部的 16 行。
多建一个缓冲区,将移位的数据从缓冲区读出加入到显示字符的最后一位,前面的数据移动一位,移动那一位数据加在前一位数据的最后一位。缓冲区的数据移完后再加入,一般是8位的数据。也就是说移8次加载一次数据到缓冲区
求51单片机16*16的点阵汉字移动原理
驱动三极管为16个9012,用万能板焊接。二 软件设计单片机方的程序设计 单片机在LED点阵汉字显示系统中主要负责数据的接收、存储和扫描显示 LED点阵屏三大主要功能。串行移动的子程序设计 这是一个通用子程序,在显示子程序中都要被调用,功能
51单片机驱动1616LED点阵显示动画汉字(汇编程序)http://wenku.baidu.com/view/a1a08f05cc1755270722085a.html 基于51单片机控制的LED点阵显示屏(c 语言)http://wenku.baidu.com/view/aa7092dbd15abe23482f4df6.html 51
Proteus中只有5×7和8×8等LED点阵,并没有16×16LED点阵,而在实际应用中,要良好地显示一个汉字,则至少需要16×16点阵。下面我们就首先介绍使用8×8点阵构建16×16点阵的方法,并构建一块16×16LED点阵,用于本例的显示任务。首先,
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位 lcd_wcom(0x01); //清屏 } void main() //主函数 { uchar n,m=0;lcd_init(); //液晶初始化 lcd_wcom(0x80); //显
1、汉字取模 汉字取模,即把汉字对应16x16点阵的图形用16进制数来描述,形成可以用于驱动显示的数据。例如下图,的汉字“中”该字的16x16点阵图形中,每行有16个像素,可以编码为2个字节,每8个像素,对应一个字节的高
基于51单片机的16×16点阵屏流动显示目录一,制作所需器材二,STC89C52简介三,点阵的简介四,程序五,演示六,总结一.制作所需器材1.单片机开发扳一块;2.16*16LED点阵一块;3.杜邦线若干;返回二.STC89C52简介STC89C52是S
include"at89x51.h"unsigned char code led[]={0x10,0x04,0x10,0x03,0xD0,0x00,0xFF,0xFF,0x90,0x00,0x18,0x1D,0xF7,0x13,0x14,0x11,0x54,0x15,0x94,0x19,0x14,0x51,0x14,0x91,0xF6,0x7F,0x04,
51单片机用汇编语言驱动16*16点阵显示“机电工程系”汉字
很简单/*16*16点阵屏的显示*/ #include #include #define DATAOUT P2 //指定P2口做为输出 sbit DATA=DATAOUT^0; //列数据输出位 sbit SCLH=DATAOUT^1; //列扫描时钟位 sbit SCLT=DATAOUT^2; //列数据锁存位 sbit AB=DATAOUT^4; //行数据输出位 sbit SCK=DATAOUT^5; //行扫描时钟位 unsigned char lhj[32];//32字节RAM做为16*16点阵屏显示缓存 void display();//做为点阵扫描函数,将显示缓存的数据输出到点阵屏 void displayS(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);//延时子函数 code unsigned char lin[32]={0x04,0x20,0x04,0x20,0xff,0xfe,0x04,0x20,//汉字"英"的点阵数据。汉字点阵数据,可用汉字库点阵生成软件获得 0x01,0x00,0x1f,0xf0,0x11,0x10,0x11,0x10, 0x11,0x10,0xff,0xfe,0x01,0x00,0x02,0x80, 0x04,0x40,0x08,0x30,0x10,0x1c,0x20,0x08}; code unsigned char yang[32]={//达 0x00,0x00,0x40,0x80,0x30,0x80,0x10,0x80, 0x0f,0xfc,0x00,0x80,0x00,0x80,0xe0,0x80, 0x21,0x40,0x21,0x20,0x22,0x18,0x24,0x0c, 0x28,0x08,0x50,0x02,0x8f,0xfc,0x00,0x00}; code unsigned char dian[32]={//通 0x40,0x00,0x27,0xf8,0x20,0x90,0x00,0x60, 0x07,0xf8,0x04,0x48,0xe7,0xf8,0x24,0x48, 0x24,0x48,0x27,0xf8,0x24,0x48,0x24,0x68, 0x24,0x50,0x50,0x00,0x8f,0xfe,0x00,0x00}; code unsigned char zi[32]={//讯 0x40,0x00,0x27,0xf8,0x31,0x08,0x21,0x08, 0x01,0x08,0xf1,0x08,0x17,0xe8,0x11,0x08, 0x11,0x08,0x11,0x08,0x11,0x08,0x11,0x0a, 0x15,0x0a,0x19,0x0a,0x11,0x04,0x00,0x00}; code unsigned char LY[32]={//图案数据 0x00,0x00,0x30,0x00,0x30,0x20,0x30,0x30, 0x30,0x18,0x30,0x0C,0x30,0x06,0x3F,0x7F, 0x3F,0x7F,0x00,0x06,0x00,0x0C,0x00,0x18, 0x00,0x30,0x00,0x20,0x00,0x00,0x00,0x00}; void main(void) //主入口函数 { unsigned char i=0,j=0; for(i=0;i<32;i++) lhj[i]=LY[i];//将图案数据复制到显示缓存 while(1){ displayS(2); //显示图案约2秒 displaymove(lin,4,7);//将从"英"开始的四个汉字从右向左移动 displayS(1); //等持约1秒 displaymovetb(1,0,10); //将点阵上显示的内容向下以10的速度移出,补上0,即清空显示屏 displayS(1); //等待1秒 displaymovetb(0,lin,10); //达"达"字以10的速度向上移动 displaymovetb(0,yang,10); //将"通"字以10的速度向上移动 displaymovetb(0,dian,10); //将"讯"字以10的速度向上移动 displaymovetb(0,zi,10); //将"子"字以10的速度向上移动 displaymovetb(0,0,10); //以10的速度向上清空 displayS(1); //等待1秒 displaymovetb(1,LY,10); //将"图案"以10的速度向下移动 } } void display()//显示 { unsigned char i,ia,j,tmp; //定义变量 DATAOUT=0XFF; //置位高电平做准备 AB=0; //将行数据位清0,准备移位 for(i=0;i<16;i++){ //循环输出16行数据 SCK=0; //为行移位做准备 SCLT=0; //为列锁存做准备 for(ia=2;ia>0;){ //每行16个点,循环位移两个字节 ia--; //循环两次 tmp=~lhj[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成, //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据 for(j=0;j<8;j++){ //循环两次,每次移一个字节, SCLH=0; //为列移位做准备 DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位 tmp>>=1; //将数据缓冲右移一位,为下次输出做准备 SCLH=1; //将DATA上的数据移入寄存器 } //移入单字节结束 } //移入两个字节结束 DATAOUT|=0X24; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像 //SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳) //SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始 AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位, //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱 } j=64; while(j--); //每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度 SCK=0; // SCK=1; //将最后一行数据移出 } void displayS(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字节处理,因此将这里乘以2 for(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[i]=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个字节 lhj[ia]<<=1; //移当前显示缓冲的前半行字节 if(lhj[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理 lhj[ia]++; ia++; lhj[ia]<<=1; //移当前显示缓冲的后半行字节 if(tmp2[i]&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理 lhj[ia]++; ia++; tmp2[i]<<=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--; lhj[j+2]=lhj[j]; //将上一行的内容复制到下一行,每两行内容相隔四个字节,复制15行 } if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入 lhj[0]=0; lhj[1]=0; } else{ //否则,取字数组处理 ia--; lhj[1]=lp[ia]; ia--; lhj[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行 lhj[j]=lhj[j+2]; if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入 lhj[30]=0; lhj[31]=0; } else{ //否则,取字数组处理 lhj[30]=lp[ia]; lhj[31]=lp[ia+1]; ia+=2; } timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } } } void delay(unsigned int a) //延时 { while(a--); } 有字模软件修改你想要显示的字,程序要字模改动别告诉我你不懂#include unsigned int code hang[][32]={/*电 CB5E7 */ 0x01,0x80,0x01,0x80,0x01,0x80,0x3F,0xFC,0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x31,0x8C, 0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x31,0x8C,0x01,0x83,0x01,0x83,0x00,0xFF,0x00,0x00, /*气 CC6F8 */ 0x0C,0x00,0x0C,0x00,0x1F,0xFF,0x18,0x00,0x30,0x00,0x6F,0xFC,0x00,0x00,0x1F,0xF8, 0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0F,0x00,0x0F,0x00,0x07,0x00,0x03, /*自 CD7D4 */ 0x01,0x80,0x01,0xC0,0x03,0x00,0x1F,0xFC,0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C, 0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C, /*动 CB6AF */ 0x00,0x30,0x00,0x30,0x7F,0x30,0x00,0x30,0x00,0xFE,0xFF,0xB6,0x18,0x36,0x18,0x36, 0x36,0x36,0x33,0x36,0x6F,0xE6,0xFF,0x66,0x60,0xC6,0x01,0x9E,0x03,0x0C,0x00,0x00, /*化 CBBAF */ 0x0C,0xC0,0x0E,0xC0,0x0C,0xCC,0x18,0xCE,0x18,0xDC,0x38,0xF8,0x78,0xF0,0xD8,0xE0, 0x19,0xC0,0x1B,0xC0,0x1E,0xC0,0x18,0xC6,0x18,0xC6,0x18,0xC6,0x18,0x7E,0x00,0x00,} unsigned char lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0XFF}; main() {unsigned int i,j,k,m; while(1) {for(m=0;m<10;m++) for(k=0;k<100;k++) {for (i=0;i<8;i++) {P1=0XFF;P0=0XFF; P3=hang[m][i*2];P2=hang[m][i*2+1]; P1=lie[i];P0=0XFF; for(j=0;j<500;j++);} for (i=0;i<8;i++) {P1=0XFF;P0=0XFF; P3=hang[m][i*2+16];P2=hang[m][i*2+17]; P1=0xff;P0=lie[i]; for(j=0;j<500;j++);} }} } 上面显示“电气自动化”汇编有点难。必须得练。帮我加分 采纳哦
硬件资源: 1、一片AT89S51单片机2、由4个8*8点阵LED模块组成一个16X16点阵LED3、4个按键开关(功能预留)4、一个REST手动复位按键 注意:本电路板耗电较大,正常工作时LM7805稳压器比较烫手,有条件的客户可以加装散热器或者直接用5V/1A开关电源供电(跳过7805稳压器) 工作原理分析: 从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。16×16的点阵共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,1 6×16的点阵需要256/8=32个锁存器。这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。 因此在实际应用中的显示屏都不采用这种设计,而采用另一种称为动态扫描的显示方法。动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器。具体就1 6×16的点阵来说,把所有同l行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第1行发光管亮灭的数据并锁存,然后选通第l行使其燃亮一定的时间,然后熄灭;再送出第2行的数据并镇存,然后选通第2行使其燃亮相同的时间,然后熄灭;-…?第16行之后,又重新燃亮第1行,腹轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形了。 采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。从控制电路到列驱动器的数据传输可以采用并行方式或串行方式。显然,采用并行方式时,从控制电路到列驱动器的线路数量大,相应的硬件数目多。当列数很多时,并行传输的方案是不可取的。 采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长.在行扫描周期确定的情况下,留给行显示的时间就太少了,以致影响到LED的亮度。 解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行各列数据的同时,传送下一行的列数据。为了达到重叠处理的目的,列数据的显示就需要具有锁存功能。经过上述分析,可以归纳出列驱动器电路应具备的主要功能。对于列数据准备来说,它应能实现串人并出的移位功能;对于列数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路三部分单片机系统及外围电路: 单片机采用89C51或其兼容系列的芯片,采用24MHz或更高频率的晶振,以获得较高的刷新频率,使显示更稳定。单片机的串口与列驱动器相连,用来送显示数据。P1口低4位与行驱动器相连,送出行选信号;P1.5~P1.7口则用来发送控制信号。PO和P2口空着,在有必要时可以扩展系统的ROM和RAM。列驱动电路: 列驱动电路由集成电路74HC595构成。它具有一个8位串人并出的移位寄存器和一个8位输出锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。 它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI是串行数据的输入端。引脚SCK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI的下一个数据打人最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK是输出锁存器的打人信号,其上升沿将移位寄存器的输出打人到输出锁存器。引脚G是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则为高阻态。SCLR信号是移位寄存器的靖0输入端,当其为低时移位寄存器的输出全部为o。由于SCK和RCK两个信号是互相独立的,所以能够做到输人串行移位与输出锁存互不干扰。芯片的输出端为QA~QH.最高位QH可作为多片74HC595级联应用时,向上一级的级联输出。但因QH受输出锁存器打人控制,所以还从输出锁存器前引出了QH’,作为与移位寄存器完全同步的级联输出。行驱动电路: 单片机P1口低4位输出的行号经4/16线译码器4515译码后生成1 6条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16列的LED进行显示,按每一LED器件20 mA电流计算,16个LED同时发光时,需要320 mA电流,选用三极管8550作为驱动管可满足要求。系统程序的设计 显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED显示屏的扫描显示工作。显示驱动程序由定时器T0中断程序实现。系统应用程序完成系统环境设置(初始化)、显示效果处理等工作,由主程序来实现。 从有利于实现较复杂的算法(显示效果处理)和有利于程序结构化考虑,显示屏程序适宜采用c语言编写。显示驱动程序: 显示驱动程序在进人中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率的稳定,1/16扫描显示屏的刷新率(帧频)计算公式如下:刷新率(帧频)=1/16×T0溢出率=1/16×fosc/12(65536—to) 其中fosc为晶振频率,to为定时器T0初值(工作在16位定时器模式)。 然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打人输出锁存器并锁存,然后再输出新的行号,重新打开显示。图7.4 显示驱动程序流程图系统主程序: 系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后向上滚动显示“单片机是工业中最基础的运用......”。由于单片机没有停机指令,所以可以设置系统程序不断地循环执行上述显示效果。装配图片以下是部分源程序,不完整,仅供参考,这是完整的资料。; **********************************; * *; * 单个16*16点阵电子屏字符显示器 *; * AT89C52 12MHZ晶振 *; **********************************;显示字用查表法,不占内存,字符用16*16共阳LED点阵,;效果:向上滚动显示19个字,再重复循环。;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00-0FH)。;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。;************;;中断入口程序;;************;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHLJMP INTT0ORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;************;; 初始化程序 ;;************;;;;************;; 主程序 ;;************;;START: MOV 20H,#00H ;清标志,00H为第16行开始扫描标志,01为1帧扫描结束标志MOV A,#0FFH ;端口初始化MOV P1,AMOV P2,AMOV P3,AMOV P0,ACLR P1.6 ;串行寄存器打入输出端控制位MOV TMOD,#01H ;使用T0作16位定时器,行扫描用。MOV TH0,#0FCH ;1ms初值(12MHZ)MOV TL0,#18HMOV SCON,#00H ;串口0方式传送显示字节MOV IE,#82H ;T0中断允许,总中断允许MOV SP,#70HMAIN: LCALL DIS1 ;显示准备,黑屏,1.5秒MOV DPTR,#TABLCALL MOVDISP ;向上滚动显示一页(8个字)INC DPHLCALL MOVDISP ;向上滚动显示一页(8个字)INC DPHLCALL MOVDISP ;向上滚动显示一页(8个字)AJMP MAIN;;;********************;; 多字滚动显示子程序 ;;********************;;每次8个字,入口时定义好DPTR值;MOVDISP: MOV B,#00H ;向上移动显示,查表偏址暂存(从00开始)DISLOOP: MOV R3,#07H ;移动速度DISMOV: MOV R2,#00H ;第0行开始MOV R1,B ;SETB TR0 ;开扫描(每次一帧)WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16毫秒为1帧,每行1毫秒)AJMP WAITMOVDISMOV1: DJNZ R3,DISMOV ;1帧重复显示(控制移动速度)INC B ;显示字的下一行(每行2字节)INC B ;MOV A,R1 ;R1为0,8个字显示完JZ MOVOUT ;AJMP DISLOOP ;MOVOUT: RET ;移动显示结束;;;*****************;; 单字显示子程序 ;;*****************;;显示表中某个字DIS1: MOV R3,#5AH ;静止显示时间控制(16MS*#=1.6秒)DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00-0FH)MOV DPTR,#TAB ;取表首址MOV R1,#00H ;查表偏址(显示第一个字)SETB TR0 ;开扫描(每次一帧)WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束AJMP WAIT11DIS111: DJNZ R3,DIS11RET;;;************;; 扫描程序 ;;************;;注意省略了一部分;***************;; 扫描文字表 ;;***************;;TAB: DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;黑屏DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 单 --DB 0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFHDB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;-- 文字: 片 --DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0EFHDB 0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;-- 文字: 机 --DB 0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,0FFHDB 0FFH,0FFH,0F0H,00FH,0F7H,0EFH,0F0H,00FH,0F7H,0EFH,0F0H,00FH,0FFH,0FFH,000H,001H ;-- 文字: 是 --DB 0FEH,0FFH,0F6H,0FFH,0F6H,007H,0F6H,0FFH,0EAH,0FFH,0DCH,0FFH,0BFH,001H,0FFH,0FFHDB 0FFH,0FFH,0C0H,003H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH ;-- 文字: 工 --DB 0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,000H,001H,0FFH,0FFH,0FFH,0FFHDB 0FBH,0BFH,0FBH,0BFH,0FBH,0BFH,0FBH,0BBH,0BBH,0B9H,0DBH,0B3H,0DBH,0B7H,0EBH,0AFH ;-- 文字: 业 --DB 0E3H,0AFH,0EBH,09FH,0FBH,0BFH,0FBH,0BFH,0FBH,0BBH,000H,001H,0FFH,0FFH,0FFH,0FFHDB 0FEH,0FFH,0FEH,0FFH,0DEH,0F7H,0C0H,003H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 中 --DB 0DEH,0F7H,0C0H,007H,0DEH,0F7H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH;DB 0FEH,0FFH,0FEH,0FFH,0DEH,0F7H,0C0H,003H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 中 --DB 0DEH,0F7H,0C0H,007H,0DEH,0F7H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFHDB 0E0H,00FH,0EFH,0EFH,0E0H,00FH,0EFH,0EFH,0E0H,00FH,0FFH,0FFH,000H,001H,0DDH,0FFH ;-- 文字: 最 --DB 0C1H,003H,0DDH,077H,0C1H,0AFH,0DCH,0DFH,0C1H,0AFH,01DH,071H,0FCH,0FBH,0FDH,0FFHDB 0F7H,0DFH,0F7H,0DFH,080H,003H,0F7H,0DFH,0F0H,01FH,0F7H,0DFH,0F0H,01FH,0F7H,0DFH ;-- 文字: 基 --DB 000H,001H,0F7H,0DFH,0EEH,0E7H,0C0H,011H,03EH,0FBH,0FEH,0FFH,080H,003H,0FFH,0FFHDB 0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,000H,001H,0FCH,07FH,0FCH,0BFH,0FAH,0BFH,0FAH,0DFH ;-- 文字: 本 --DB 0F6H,0EFH,0EEH,0E7H,0D0H,011H,03EH,0FBH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FFH,0FFHDB 0EFH,07FH,0EFH,07FH,0DFH,07FH,083H,003H,0BAH,0FBH,0BAH,0FBH,0B9H,0FBH,083H,07BH ;-- 文字: 的 --DB 0BBH,0BBH,0BBH,09BH,0BBH,0DBH,0BBH,0FBH,083H,0FBH,0BBH,0D7H,0BFH,0EFH,0FFH,0FFHDB 0FEH,0FFH,0FFH,07FH,0C0H,003H,0DFH,0FFH,0DDH,0FFH,0DEH,0F7H,0CFH,073H,0D7H,037H ;-- 文字: 应 --DB 0DBH,06FH,0DBH,06FH,0D9H,0DFH,0BBH,0DFH,0BFH,0BFH,0A0H,001H,07FH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0E0H,003H,0EFH,07BH,0EFH,07BH,0EFH,07BH,0E0H,003H,0EFH,07BH,0EFH,07BH ;-- 文字: 用 --DB 0EFH,07BH,0E0H,003H,0EFH,07BH,0EFH,07BH,0DFH,07BH,0DFH,07BH,0BFH,06BH,07FH,077HDB 0FDH,0FFH,0FEH,0FFH,0FFH,07FH,000H,001H,0FDH,0FFH,0FDH,0FFH,0FCH,00FH,0FDH,0EFH ;-- 文字: 方 --DB 0FBH,0EFH,0FBH,0EFH,0F7H,0EFH,0F7H,0EFH,0EFH,0EFH,0DFH,06FH,03FH,09FH,0FFH,0FFH;DB 0FDH,0FFH,0FEH,0FFH,0FFH,07FH,000H,001H,0FDH,0FFH,0FDH,0FFH,0FCH,00FH,0FDH,0EFH ;-- 文字: 方 --DB 0FBH,0EFH,0FBH,0EFH,0F7H,0EFH,0F7H,0EFH,0EFH,0EFH,0DFH,06FH,03FH,09FH,0FFH,0FFHDB 0FFH,05FH,0FFH,067H,0FFH,06FH,080H,003H,0FFH,07FH,0FFH,07FH,0FFH,07FH,0C1H,07FH ;-- 文字: 式 --DB 0F7H,0BFH,0F7H,0BFH,0F7H,0BFH,0F4H,0DFH,0E3H,0DDH,08FH,0EDH,0DFH,0F5H,0FFH,0FBHDB 0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H,0B7H ;-- 文字: 我 --DB 0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH,0FDHDB 0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H,003H ;-- 文字: 爱 --DB 0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH,0FBHDB 0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 单 --DB 0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFHDB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;-- 文字: 片 --DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0EFHDB 0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;-- 文字: 机 --DB 0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,0FFHDB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;黑屏DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;END
拼一下就行
首先,你说的内存这个概念就不正确,按常规来说你说的内存应该是指FLASH程序存储器吧.下面就按此概念来说. 能存多少汉字关键看你的显示需要多大的汉字,例如16*16的汉字一个汉字需要32字节来存储,32*32汉字一个汉字需要128字节来存储,由于存储器还需要存储程序,因此,必须是剩余的空间来存储需要的汉字,你可以先存几个汉字的信息进去,然后吧程序调试好后看剩余多少空间,按上述的计算参数就可以得出你要的数据. 不过我建议你,在需要显示的汉字比较多的情况下,最好是外加一个EEPROM或者是FLASH存储器来做汉字库,这样比单纯的增加MCU的资源来的划算.
可以看看网络上关于LED点阵开发案例,利用视觉暂留原理扫描LED显示。单片机问题或许我可以帮助。
5ms×8=40ms(25次/秒),这只是人眼视觉暂留的下限。 我觉得你至少应该提高4~5倍的刷新速度才行(例如每行显示1ms)。 另外如果你的51还要执行别的运算,应尽量减少它们的时间,也就是让51的绝大部分时间都在驱动LED“显示”。 如果还不行,那就只能在LED驱动一侧加锁存器了。
你好,你那个U2是什么器件?请说明一下。或者把这个仿真文件直接发过来,实现比较快。