Write_Cmd(0x38);//功能设置8位双行显示5*7点阵 Write_Cmd(0x0F);//开关显示设置 Write_Cmd(0x06);//输入方式设置,光标从左向右移动,内容不移动 } void main(){ unsigned char Code1[]="I LOVE MCU!";unsig

液晶显示屏是不停闪烁的,而且一次只能显示一个图案。显示屏上显示12345也是每次在一个位置上显示一个数字,不停的显示五次,由于计算速度快,及人眼暂留现象,使人感觉上显示的是12345。现在,你如果需要动画效果,需要从底层做起

char i;while(1){ P0=0xff;LATCH1=1;LATCH1=0;P0=wei[i];//取显示数据 LATCH2=1;LATCH2=0;P1=seg[i]; //取段码 //LATCH2=1;LATCH2=0;delay(200); //扫描间隙延时 i++;if(8==i)i=0;} }

按行取模可以向上移动,按列取模才可以向左移动。以按列取模为例,每个字的字模表中第1,2字节送LED屏第一列显示,依次显其余15列。假如显示0.5秒(时间可以调),再取字模的第3,4字节,还送LED屏第一列显示,依此

void delay1ms(unsigned int ms);//延时ms函数声明(可根据实际情况更改)unsigned char code led0[]={};//字码表,你自己把你要显示的字码放进去就可以了 void main(){ unsigned char w,i;while(1){ //显示0 w

1、并不是字真在移动,只是每次显示的图像不一样的,连续显示16次出来就是移动。比如上下移动,有个函数能显示一个字模数组。把“西”的整个字的字模放到这个数组显示的是西字,把“安”放进去就是安字。把西字16行的

MOVX @DPTR,A MOV A,#0FFH ;关闭LED行显示 MOV DPTR,#CSr1 MOVX @DPTR,A MOV DPTR,#CSr2 MOVX @DPTR,A D: MOV R5,#00H ;设定汉字表格初始值 MOV R4,#01H ;设定列扫描初始值,从第一列开始 DISP

怎样用C语言实现LED点阵显示汉字 年 的移动代码

1、双击桌面上的led字幕设置软件,打开并进入软件界面。2、新建一个节目,点击界面左上角的“+节目”。3、 新建的节目已经完成。选中,然后再单击节目旁边的“字幕”,如下图所示。4、可以看到,新建的节目下,创建了新的

1、首先需要设置屏参。2、在弹出的对话框中输入密码:(默认密码:888)。3、设置屏幕扫描配置如下图所示。4、点击对话框中下方位置的“字幕”。5、这时会出现下面的黑色编辑区域,在里面输入需要的内容即可,然后选择字体大小

1 -- "连续左移"2 -- "连续上移"3 -- "连续下移"4 -- "往下覆盖"5 -- "往上覆盖"6 -- "翻白显示"7 -- "闪烁显示"8 停留时间不要太长。或永远停留 就是不要用,《立即打出》就可以了。

关于“LED显示屏显示三个屏字”的排版,以下是一个例子:1.将三个屏字并排显示。这是最简单的排版方式,三个屏字在视觉上处于同一水平线上,直观且简洁。2.“屏”字采用横向排列,而“字”字采用纵向排列。这种排版方式

LED点阵显示屏采用16×16共256个象素的点阵,可通过万用表检测发光二极管的方法测试判断出该点阵的引脚分布。 我们把行列总线接在单片机的I/0口,然后把上面分析到的扫描代码送入总线,就可以得到显示的汉字了。但是若将LED点阵的行列端口

在LED显示汉字,怎么做到可以三个汉字循环显示?怎么添加代码?

1、并不是字真在移动,只是每次显示的图像不一样的,连续显示16次出来就是移动。比如上下移动,有个函数能显示一个字模数组。把“西”的整个字的字模放到这个数组显示的是西字,把“安”放进去就是安字。把西字16行的

/***从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

uchar DisBuff[7];uchar code numtab1[]={ //字序已更改,num*2 num*2+1 这更要注意了,为了方便一般把字序改动了 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF

你这个单片机是带I2C接口的 那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442 你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的

首先,从Proteus元件库中找到“MATRIX-8X8-RED”元器件,并将四块该元器件放入Proteus文档区编辑窗口中。此时需要注意,如果该元器件保持初始的位置(没有转动方向),我们要首先将其左转90°,使其水平放置,那么此时它的左面

单片机16*16LED点阵怎样让文字从上到下显示出来 求程序

for(m=0;m<8;m++) //重复显示8次 { temp=0;// 不加此条,流动飞快 for(num=n;num<16+n;num++){ WriteByte(tab[2*num+1]);WriteByte(tab[2*num+0]);P1=temp;ST_CP=0;ST_CP=1;delay_ms(1);tem

//void Jump_Word(uchar a) 立即跳显示一个字或一张图案//void M_Word(uchar a) 卷帘出显示一个字或一张图案//void M_Words(number) 显示几个交换的字//void UP_Run(number) 向上滚屏n个字//void L_Removeout(number)

单片机显示16*16汉字 我想用单片机汇编语言编一个显示汉字的程序,用LED点阵实现。汉字的编码不知怎样得到,有没有一种这样的转换工具将汉字转换成对应的编码。HANZI:DB##H,##H,##H,..象这样的编码,对与C 我想用单片机汇编语言

while(1){ P1=i;P2=led[32*j+2*i];P3=led[32*j+2*i+1];delay();i++;if(i==16)i=0;if(time_50ms==20){ time_50ms=0;j++;if(j==2)j=0;} } } int_T0() interrupt 1 { TH0=0X3C;TL0=

{0x00,0x01,0x04,0x02,0x1C,0x0C,0xC0,0x3F,0x1C,0xC0,0x02,0x09,0x02,0x16,0x92,0x60,0x4A,0x20,0x82,0x2F,0x02,0x20,0x0E,0x24,0x00,0x22,0x90,0x31,0x0C,0x20,0x00,0x00},/*"您",2

AJMPMAIN ORG0030H MAIN:MOVDPTR,#TAB;字码表初址赋值 MOVR1,#00H;列控制码 MOVR4,#96;移动" "及"机电工程系"6个字符,共96列 CM:MOVR5,#5;每屏反复显示5次 MOVR3,#16;列数 C1:MOVR2,#0;取码指针 C16:

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,0

请您用汇编语言设计一个用单片机控制16*16led点阵显示一个汉字程序,谢谢了!很紧急!

8*8=64 这个64就是64bit.一个汉字2个字节(B),一个字节B就是8bit,共16个bit。64/16=4 这个4就是4个字节(B)。

START: NOP LOP2: MOV R4,#8 MOV R2,#0 LOP1: MOV P0,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,@A+DPTR MOV P0,A MOV DPTR,#TABB MOV A,R2 MOVC A,@A+DPTR MOV P1,A INC R2 LCALL DELAY DJNZ R4

MAIN:MOV R4,#8 MOV R2,#0 LOOP:MOV P0,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,@A+DPTR SETB P1.1 MOV P0,A CLR P1.1 MOV DPTR,#TABB MOV A,R2 MOVC A,@A+DPTR SETB P1.3 MOV P0,A CLR P

用汇编语言完全可以实现。第一步:先制作字库,少量汉字可以利用画笔工具,在画笔上写上16*16的汉字(最好是宋体),在放大功能下查看每个像素,黑色为1,白色为0,按照列或行依次读取。一个汉字的点阵用32个字节表示。第

点阵显示出汉字就是要点亮出相应的二极管。如果你用地是8*8的点阵,要显示出“电子设计”出来,你得把“电”、“子”、“设”、“计”对应的字符表格写出来。看你的点阵是共阳、还是共阴的。简单说动态显示的原理就是,

8*8LED点阵用汇编语言写汉字的问题

行驱动电路: 单片机P1口低4位输出的行号经4/16线译码器4515译码后生成1 6条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16列的LED进行显示,按每一LED器件20 mA电流计算,16个LED同时发光时,需要320 mA电流,选用

//这是16*16点阵 显示一个字的代码。。。 临时写的。。。include include define IOdata //数据口定义 define uchar unsigned char sbit row0 //0行 定义 sbit row1 //1行 定义 sbit c

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,

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,0

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++);} }} } 上面显示“电气自动化”汇编有点难。必须得练。帮我加分 采纳哦
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语 言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号 (Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指 令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应 的不同平台之间不可直接移植。 许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会 提供宏,它们也被称为宏汇编器。 汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应 用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇 编语言。
很简单,构造一个“吴”的点阵,用9号DOS系统功能调用显示一下就行了。 (网页是不等宽字体,下面这个程序中的数据在网页上看不齐,程序运行显示出来是齐的) .model small .data wu db ' ', 0dh ,0ah db ' 0000000 ', 0dh, 0ah db ' 0 0 ', 0dh, 0ah db ' 0000000 ', 0dh, 0ah db ' ', 0dh, 0ah db ' 000000000 ', 0dh, 0ah db ' 0 ', 0dh, 0ah db ' 0000000000000 ', 0dh, 0ah db ' 0 ', 0dh, 0ah db ' 0 0 ', 0dh, 0ah db ' 0 0 ', 0dh, 0ah db ' 0 0 ', 0dh, 0ah db ' 0 00 ', 0dh, 0ah db ' ', 0dh, 0ah, '$' .code .startup mov ah, 9 mov dx, offset wu int 21h .exit end
由于单片机没有停机指令,所以可以设置系统程序不断的循环执行上述显示效果。总结本文设计的一个室内用16x16的点阵LED图文显示屏,能够在目测条件下LED
硬件资源: 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
如果是想一起显示四个字母,把所有的LED共阴共阳,用单片机做个简单的程序,控制其通断就可以了。如果是想单个显示,则需要把你想显示的单体字母共阴共阳,不过这个程序麻烦点,要控制好几个字母电源通断的时序。当然,如果你c语言过关的话,可以变更复杂的程序,变幻一下闪烁的顺序和频率,效果会更好! 题外话:用来追MM不错~
刚好,我上个星期写了个向上滚动的,字有点自恋,我就不改了 上程序 #include #include #define uchar unsigned char #define uint unsigned int sbit DZ_ds=P2^0; // 595 串行口 sbit DZ_sh=P2^1; // 串行输入时钟端口 sbit DZ_st=P2^2; // 并行输出时钟端口 uchar DisBuff[7]; uchar code numtab1[]={ //字序已更改,num*2 num*2+1 这更要注意了,为了方便一般把字序改动了 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xff,0x7f,0xff,0x7f,0x03,0x7f,0xfb,0x03,0xfa,0xfb,0xb6,0xf7,0xd5,0xbf,0xeb,0xbf, 0xef,0xbf,0xd7,0x5f,0xdb,0x5f,0xba,0xef,0x7e,0xef,0xfd,0xf7,0xfb,0xfb,0xf7,0xfd, 0xFF,0xFF,0xFF,0xFF, //欢 0xff,0xff,0x80,0x03,0xff,0xef,0xe0,0x6f,0xef,0x6f,0xef,0x6f,0xe0,0x6f,0xff,0xef, 0x00,0x01,0xff,0xef,0xe0,0x6f,0xef,0x6f,0xef,0x6f,0xe0,0x6f,0xff,0xaf,0xff,0xcf, 0xFF,0xFF,0xFF,0xFF, //哥 0xe0,0x0f,0xef,0xef,0xe0,0x0f,0xef,0xef,0xe0,0x0f,0xff,0xff,0x00,0x01,0xdd,0xff, 0xc1,0x07,0xdd,0x77,0xc1,0x6f,0xdd,0xaf,0xd0,0xdf,0x0d,0xaf,0xbd,0x77,0xfc,0xf9, 0xFF,0xFF,0xFF,0xFF, //最 0xff,0xff,0x06,0x03,0xf6,0xfb,0xf6,0xfb,0xf6,0x03,0x87,0xdf,0xbf,0xdf,0xbc,0x01, 0xbd,0xdd,0x85,0xdd,0xf4,0x01,0xf7,0xdf,0xf7,0xdb,0xf7,0xdd,0xa8,0x01,0xdf,0xfd, 0xFF,0xFF,0xFF,0xFF, //强 0xef,0xff,0xee,0x03,0xee,0xfb,0xee,0x03,0xe6,0xfb,0xaa,0x03,0xaf,0xff,0xaf,0xff, 0x6e,0x03,0xef,0xdf,0xef,0xdf,0xec,0x01,0xef,0xdf,0xef,0xdf,0xef,0xdf,0xef,0xdf, 0xFF,0xFF,0xFF,0xFF, //悍 0xfe,0xff,0xfe,0xff,0xfd,0x7f,0xfd,0x7f,0xfd,0x7f,0xfb,0xbf,0x03,0x81,0xbf,0xfb, 0xcf,0xe7,0xf7,0xdf,0xf7,0xdf,0xee,0x6f,0xe9,0xaf,0xe7,0xcf,0xdf,0xf7,0xff,0xff, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }; /*********************************** -功能描述: 串行数据输入 -函数属性:点阵扫描延时 ***********************************/ void write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DZ_ds=(dat&0x80); // ds 数据送 DZ_sh=0; _nop_(); _nop_(); DZ_sh=1; // 数据送入595 dat<<=1; } } void write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DZ_ds=(dat&0x80); // ds1 数据送 DZ_sh=0; _nop_(); _nop_(); DZ_sh=1; // 数据送入595 dat<<=1; } } void main() { uchar num ,i,x,y,j,temp,k; while(1) { for(y=0;y<1;y++) { for(num=0;num<16;num++) { write_byte(~numtab1[num*2+i]); write_byte(~numtab1[num*2+1+i]); P1=num; DZ_st=0; _nop_(); _nop_(); DZ_st=1; } } if(++x==8) { x=0; if(++k==50) k=0; } i+=2; if(i==246) { i=0; } } } 里面可能有一些没有必要的定义和变量,因为我程序不止这一个功能,可能没删彻底,不懂再问,我天天在学校
不知道你的硬件是怎么接的,还有用了什么芯片.全部用7219吗?,我用7219做过数码管的.做点阵也是可以的
一般是要应用软件实现的,有一款show电子资讯发布系统,很强大,可以播室外全彩屏,图文视频都可以,最牛的是它可以多点联网同步实现,而且可以像电视一样编辑节目单什么,很好用!不过是收费的哦!!!
1、并不是字真在移动,只是每次显示的图像不一样的,连续显示16次出来就是移动。比如上下移动,有个函数能显示一个字模数组。把“西”的整个字的字模放到这个数组显示的是西字,把“安”放进去就是安字。把西字16行的后15行字模信息接上安的第1行(一共就是16行)放到一起作为一个字模数组显示出来就是下移了一格,把西后14行接安的前2行(共16行)放到一起作为一个字模数组显示出来就是下移了两格,依次排下去到16次的时候就完整下移一个字了。左右一样的,把“西”每行的后15列接上“安”每行的第一列作为一个数组显示就是左移一位,同理依次移下去16次一个字的左移就实现这个效果了。 2、例程: #include//sbit A=P2^0;//sbit B=P2^1;//sbit C=P2^2;//sbit select=P2^3;sbit clk=P3^0; //595串行时钟端sbit da=P3^1; //595串行数据端sbit enable=P3^2;/************************************字库**********************************************/unsigned char code stable[]={/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x40,0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x06,0x42,0x01,0xFE,0x02,0x42,0x04,0x42,0x08,0x42,0x10,0x42,0x30,0x42,0x60,0x42,0x20,0x40,0x00,0x00,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x40,0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x06,0x42,0x01,0xFE,0x02,0x42,0x04,0x42,0x08,0x42,0x10,0x42,0x30,0x42,0x60,0x42,0x20,0x40,0x00,0x00,/*-- 文字: 快 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x70,0x00,0x00,0xFF,0xFF,0x00,0x08,0x80,0xB0,0x40,0x88,0x30,0x88,0x0E,0x88,0x01,0xFF,0x06,0x88,0x08,0x88,0x30,0x88,0x60,0xF8,0xC0,0x80,0x40,0x80,0x00,0x00,/*-- 文字: 乐 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x20,0x00,0x18,0x40,0x0C,0xFC,0x07,0x44,0x12,0x44,0x20,0x44,0x40,0x46,0x3F,0xFA,0x00,0x42,0x00,0x43,0x02,0x43,0x0C,0x42,0x38,0x40,0x10,0x00,0x00,0x00,/*-- 文字: ! --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0xDF,0xFC,0xDF,0xFC,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 欢 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x14,0x10,0x24,0x4C,0x44,0x43,0x84,0x43,0x64,0x2C,0x1C,0x20,0x20,0x10,0x18,0x0C,0x0F,0x03,0xE8,0x06,0x08,0x18,0x08,0x30,0x28,0x60,0x18,0x20,0x08,0x00,0x00,/*-- 文字: 迎 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x40,0x20,0x41,0x1F,0xCE,0x20,0x04,0x40,0x00,0x47,0xFC,0x42,0x04,0x41,0x02,0x40,0x02,0x5F,0xFC,0x40,0x04,0x42,0x04,0x44,0x04,0x43,0xFC,0x40,0x00,0x00,0x00,/*-- 文字: 来 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x00,0x20,0x80,0x10,0x84,0x10,0x84,0x08,0x94,0x04,0xA4,0x02,0xC4,0xFF,0xFF,0x01,0x84,0x02,0xC4,0x04,0xB4,0x08,0x94,0x18,0x84,0x30,0x84,0x10,0x80,0x00,0x00,/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x20,0x04,0x20,0x42,0x22,0x82,0x22,0x7F,0xFE,0x01,0x21,0x01,0x21,0x10,0x20,0x10,0x20,0x08,0xFF,0x07,0x20,0x1A,0x22,0x21,0xAC,0x40,0x20,0xF0,0x20,0x00,0x00,/*-- 文字: 的 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x7F,0xF8,0x10,0x8C,0x10,0x8B,0x10,0x88,0x3F,0xF8,0x00,0x40,0x00,0x30,0x00,0x8F,0x03,0x08,0x26,0x08,0x40,0x08,0x20,0x08,0x1F,0xF8,0x00,0x00,0x00,0x00,/*-- 文字: 空 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x10,0x40,0x0C,0x40,0x84,0x41,0x44,0x41,0x24,0x41,0x14,0x41,0x05,0x7F,0x06,0x41,0x04,0x41,0x14,0x41,0x24,0x41,0x44,0x40,0x84,0x40,0x14,0x00,0x0C,0x00,0x00,/*-- 文字: 间 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFF,0xF8,0x00,0x01,0x00,0x06,0x00,0x00,0x07,0xF0,0x04,0x92,0x04,0x92,0x04,0x92,0x04,0x92,0x07,0xF2,0x40,0x02,0x80,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x40,0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x06,0x42,0x01,0xFE,0x02,0x42,0x04,0x42,0x08,0x42,0x10,0x42,0x30,0x42,0x60,0x42,0x20,0x40,0x00,0x00,};/*************************************************************************************** 行显示子程序 实质是给当前行中的所有列传送两字节的数据 ***************************************************************************************/void hang_disp(unsigned char temp1,unsigned char temp2){ unsigned char i; for(i=0;i>1; } enable=0;enable=1;enable=0; /****595并行输出使能****/}/*************************************************************************************** 清行子程序 如果没有清行程序,该行显示完转到下一行时595的输出还没有变,还是上一行的数据 ,因为程序中是先选定行,再向595传数据的,所以下一行开始时有一段时间是显示合一行的内容的,这段时间就是向595传两个字节数据的时间。/***************************************************************************************/void hang_clear(){ unsigned char i; for(i=0;i<16;i++) { da=0; /***595的输出连接的是点阵的阴极,所以让595输出高电平,可以使得该行的LED熄灭****/ clk=0;clk=1;clk=0; } enable=0;enable=1;enable=0;}/***************************************************************************************//***************************************************************************************/unsigned int count=0;unsigned char move=0;void disp(){ unsigned char i; unsigned int j; count++; for(i=0;i<16;i++) { P2=i; /*****选定行*****/ //hang_disp(stable[2*(i+move)],stable[2*(i+move)+1]); /***从字库中取数据****/ hang_disp(~stable[2*(i+move)],~stable[2*(i+move)+1]); /***从字库中取数据再取反,能实现反显****/ for(j=0;j<10;j++); /***显示和清零间加以延时,以便显示明显,可以自行调节,也可以去掉***/ hang_clear(); } if(count==10) /***调节移动的速度***/ { count=0; move++; if(move==192) /***调节移动的字数***n=move/16***/ { move=0; } } }/***************************************************************************************//***************************************************************************************/main(){ while(1) { disp(); }}
#include//单片机头文件 void delay1ms(unsigned int ms);//延时ms函数声明(可根据实际情况更改) unsigned char code led0[]={};//字码表,你自己把你要显示的字码放进去就可以了 void main() { unsigned char w,i; while(1) { //显示0 w=0x01; //行变量为第一行 for(i=0;i<8;i++) { P1=w; //行数据送P1口 P0=led0[i]; delayms(1); //列数据送P0口 w<<=1; //向下移动一行 } } } void delay1ms(unsigned int ms) { unsigned int i,j; for(i=0;i<ms;i++) for(j=0;j<110;j++) }