给你说说思路吧 你说是逐行扫描的,如果想实现上下滚动,你的字模应该是横向取模,8*8的字模是16个字节,你把每个汉字的字模都连在一起,在程序运行时,你的程序中要开辟一个显示缓冲区(16个字节的,跟你的屏幕显示
--RAM,能容下四个字节,再稍稍多上十个、八个,就足够了。--可以说,对 RAM,并没有什么要求。
单片机对LED显示屏的控制过程是先读后写。按LED点阵片在屏幕上的排列顺序,单片机先对第1排的第1片LED点阵片的列驱动锁存器,写入从外部数据存储器读得的字模数据,接着对第2片、第3片……直到这一排的最后一片都写完
输入显示内容:你先在你的电脑软件里输入你想要显示的字比如显示一个“人”字,以及显示方式比如滚动,保存后电脑里的软件会把这些信息翻译成对应的代码并下载到屏幕的存储器里面存起来。(代码就是二进制的一大串数字,机器
单片机制作led显示屏,怎么让字滚动,思路是什么
LED显示器是用发光二极管构成的显示器。构成方式有两大类:一是笔段字符式,一般又有三种:7段(/8段)数码管、15段(/17段)数码管和6段符号显示器;二是点阵字符式,一般有5×7、5×8、8×8和16×16等若干种
可左移和静态显示,程序如下:include
if(++i==8) i=0; //每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0;if(++Num_Index==10) Num_Index=0; //显示下一个数字 } break;case 1:P0=~xdat[xi];P1=0xff;P1
该电路所设计的电子屏可显示10个汉字,需要40个8×8 LED点阵模块,可组成16×160的矩形点阵。由于AT89C52仅有8k存储空间,而显示的内容由PC机控制,因此不可能预先把需要显示的内容做成点阵存在单片机中,而只能由PC机即时地把所需显示的点阵
一般建议用2片3-8译码器做片选信号(控制16个口),然后再用两个P口(也是16脚)进行数据传输,这样就能实现16*16的数据显示了,建议PROTUES仿真,网上这样的例子很多,但仿真时可能效果不如实际开发板上效果好。这里有个
基于单片机的LED点阵显示设计
首先你要搞清楚点阵显示原理。8*8点阵要显示一个画面,通常采用扫描的形式。点阵内部发光阵列每一行的阴极连在一起,引出一条共阴线;每一纵向阳极连在一起,引出一条共阳线。这样8*8点阵就共有8条共阴线和8条共阳线。
8*8点阵是动态扫描的 静态显示也是动态扫描的结果。比如说下面这个程序:include
可亮度也当然有所下降.如只显固定少数的几个字符号就只做一个相应的码表,查表可是51机的强项了如要想随意都显可就要做字库,这在编程时也要先想好,
LED点阵的核心原理跟4位LED数码管一样,都是需要行列扫描的。仔细查一下点阵的管脚,不是顺序排列,把字体做成数组,直接把数组一个一个字节的发送到端口上(你没有说明P0和P2那个是行,那个是列,其中一个直接发,一个
如果你要"L"向左移,那下一帧就从2开始2,3,4,5,6,7,8,(程序设定超过8时为00h,简单点就是如果你点阵“屏”是8*8的,那你在后面加补8个00h,16*16就补32个,这样你移动N*8(或N*16)的字幕都是
做51单片机点阵LED滚动屏,如8×8的,我要显示一个L,那是不是要把L在滚动过程中的每个状态做出数据表
具体的LED显示屏控制电路如图1所示。整个电路由单片机89C52、点阵数据存储器6264、列驱动电路ULN2803、行驱动电路TIP122、移位寄存器4094及附属电路组成。该电路所设计的电子屏可显示10个汉字,需要40个8×8 LED点阵模块,可组成16×160的
1、一片AT89S51单片机2、由4个8*8点阵LED模块组成一个16X16点阵LED3、4个按键开关(功能预留)4、一个REST手动复位按键 注意:本电路板耗电较大,正常工作时LM7805稳压器比较烫手,有条件的客户可以加装散热器或者直接用5V/1A开关电源供电
8*8不能显示汉字(除非一些简单的),要显示汉字起码也要16*16的。这是一个16*16的电路原理图。希望可以帮到你………
基于51单片机的16×16点阵屏流动显示目录一,制作所需器材二,STC89C52简介三,点阵的简介四,程序五,演示六,总结一.制作所需器材1.单片机开发扳一块;2.16*16LED点阵一块;3.杜邦线若干;返回二.STC89C52简介STC89C52是S
AJMP BEGIN ORG 0030H BEGIN:MOV R0,#8 MAIN:MOV A,R0 MOV R2,#00H MOV SP,#60H MOV R3,A MOV R4,#16 MOV DPTR,#WORDTAB START:JNB P1.0,SLOW JNB P1.1,SOON MOV R1,#00H SCAN8:MOV A,R1 SWAP
at89c51单片机led显示屏工作原理AT89C51单片机LED显示屏的工作原理是:1、首先,将AT89C51单片机与LED显示屏连接,将单片机的数据总线与LED显示屏的数据总线连接,将单片机的地址总线与LED显示屏的地址总线连接,将单片机的控制信号与
基于51单片机的led点阵显示屏设计原理与电路图
include
每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。以显示“ | ” 从右向左移为例,第1 屏,右边第1 列亮1ms后灭,第2 屏,第2 列亮。。。8 屏显示后,完成“| ”左移。
显示汉字的话。要想所有汉字都能显示。估计8*8的点阵你要用四个。这样才能显示的更加完美一点。至于左右上下滚动这都不难。建议你先将一个点阵学好。看你后面的补充感觉又像是用的128*64的中文液晶,不知道你究竟要用什么
液晶显示屏是不停闪烁的,而且一次只能显示一个图案。显示屏上显示12345也是每次在一个位置上显示一个数字,不停的显示五次,由于计算速度快,及人眼暂留现象,使人感觉上显示的是12345。现在,你如果需要动画效果,需要从底层做起
单片机51,LED点阵如何使点阵上显示的字会左右移动,或上下移动?
1、静态显示:对于静态显示,可以直接利用IO口将对应的数字编码发送到数码管的段选引脚上。将P0口设置为0x3f,可以显示数字0。2、动态显示:对于动态显示,有两种常见的方法。一种是提高刷新频率,使得人眼无法分辨,产生显示
你到底几个数码管,是静态显示还是动态显示,两个数码管的话,可以将其存入数组中,一次取两个就行 uchar table[14]={1,4,4,5,5,2,2,6,6,2,2,1} 然后用两个for循环 for(i=0;i<14;i+=2){ f
请问,你是问“keil51数码管动态怎么显示学号后四位”这个问题吗?该动态显示学号后四位方法如下:1、定义一个包含四位学号后四位的段码表table。2、使用display函数来选通不同的数码管,并发送对应的段码,实现动态显示
下面是使用AT89S51单片机控制4位一体数码管轮流显示1234的程序代码:```c include
include
这是四位数码管从右从左流动显示,像滚动字幕一样的。用不着矩阵按键哪。其实程序很简单,没那么复杂。程序如下 include
1.共阴极:就是将八段数码管的阴极(负极)接地在一起,需要高电平点亮。如下图所示 2.共阳极:就是将八段数码管的阳极(正极)接(+5v)在一起,需要低电平点亮。如下图所示 3.数码管的具体
keil51单片机数码管滚的显示
void rxd_data(void) //串行发送数据 { char s; uchar inc,tempyid,temp; if(yid<8) inc=1; //左移=0,右移时=1 else inc=0; //左移=1,右移时=0 for(s=0+inc;s<13+inc;s++) //发送8字节数据 { if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF[s]>(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。 //Yanglomng 左移右移之分!改> // temp=255-temp; TXD_data(temp); //SBUF=temp;//把BUFF中的字节从大到小移位相或后发送输出。 //while(!TI);TI=0; //等待发送中断 } }你这个单片机是带I2C接口的 那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442 你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的数据没有写进去 我给你一个模拟的看看 #include<reg51.h> #include <Intrins.h> #define uchar unsigned char #define uint unsigned int sbit pcf8563_scl=P0^5;//时钟频率 sbit pcf8563_sda=P0^4;//串行数据传输脚 bit busy=0; uchar sg;//时高位 uchar sd;//时低位 uchar fg;//分高位 uchar fd;//分低位 uchar mg;//秒高位 uchar md;//秒低位 uchar hou=0; uchar min=0; uchar sec=0; uchar subadd;//地址 uchar dat;//数据 uchar number; void start_pcf8563();//开始数据 void send_pcf8563_byte();//发送 void stop_pcf8563();//结束数据 void receive_pcf8563_byte();//接收 void spit_time();//分别计算时、分、秒的各位数字 void spit_time()//分别计算时、分、秒的各位数字 { sg=(int)hou/10; sd=(int)hou%10; fg=(int)min/10; fd=(int)min%10; mg=(int)sec/10; md=(int)sec%10; } void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节 { uchar aa; pcf8563_scl=0; for(aa=0;aa<8;aa++) { if((bb&0x80)==0x80) { pcf8563_sda=1; } else { pcf8563_sda=0; } pcf8563_scl=1; pcf8563_scl=0; bb=bb<<1; } _nop_(); _nop_(); pcf8563_sda=1; pcf8563_scl=1; busy=0; if(pcf8563_sda) { busy=1; } else { _nop_(); _nop_(); pcf8563_scl=0; busy=0; } } void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据 { start_pcf8563(); Send_pcf8563_byte(0xa2); if(!busy) { Send_pcf8563_byte(subadd); if(!busy) { Send_pcf8563_byte(dat); } } stop_pcf8563(); } void read_pcf8563() //读当时的时,分,钞 { start_pcf8563(); Send_pcf8563_byte(0xa2); if(!busy) { Send_pcf8563_byte(0x02); if(!busy) { start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); sec=number&0x7f; start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); min=number&0x7f; start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); hou=number&0x3f; } } stop_pcf8563(); } void receive_pcf8563_byte() //从PCF8563接受一个字节 {uchar cc; pcf8563_sda=1; number=0; for(cc=0;cc<8;cc++) { number<<=1; pcf8563_scl=0; pcf8563_scl=1; _nop_(); _nop_(); number= number|pcf8563_sda; } pcf8563_scl=0; _nop_(); _nop_(); } void start_pcf8563() //开启PCF8563IIC { pcf8563_sda=1; pcf8563_scl=1; pcf8563_sda=0;//SCL为高,SDA执行一个下跳 pcf8563_scl=0;//SCL为低,嵌住数据线 } void stop_pcf8563() //关闭PCF8563IIC { pcf8563_sda=0; pcf8563_scl=1; pcf8563_sda=1;//SCL为高,SDA执行一个上跳 pcf8563_scl=0;//SCL为低,嵌住数据线 } void main(void) { write_pcf8563(0x02,sec); //写钞 write_pcf8563(0x03,min); //写分 write_pcf8563(0x04,hou); //写时 while(1) { read_pcf8563();//读当前时间 spit_time(); //切换时间,为显示做准备 } } 如果还是不行,你把你的代码给我看看,看我能不能看出来
ORG 0000H AJMP BEGIN ORG 0030H BEGIN: MOV R0,#8 MAIN: MOV A,R0 MOV R2,#00H MOV SP,#60H MOV R3,A MOV R4,#16 MOV DPTR,#WORDTAB START: JNB P1.0,SLOW JNB P1.1,SOON MOV R1,#00H SCAN8: MOV A,R1 SWAP A MOV P3,A SWAP A INC A MOV R1,A MOV A,R2 MOVC A,@A+DPTR CJNE A, #0DDH,NEXT AJMP MAIN NEXT: MOV P2,A INC R2 MOV A,R2 MOVC A,@A+DPTR MOV P0,A INC R2 LCALL DELAY1400 MOV P0,#00H MOV P2,#00H DJNZ R4,SCAN8 MOV R4,#16 DJNZ R3,SCAN16 AJMP END16 SCAN16: MOV A,R2 CLR C SUBB A,#32 MOV R2,A AJMP START END16: INC DPTR INC DPTR MOV A,R2 CLR C SUBB A,#32 MOV R2,A MOV A,R0 MOV R3,A AJMP START SLOW: LCALL DELAY20000 DEC R0 JB P1.0,$ AJMP BACK SOON: LCALL DELAY20000 INC R0 JB P1.1,$ AJMP BACK BACK: LCALL DELAY20000 AJMP START DELAY1400: ;误差 0us MOV R6,#7FH DL0: MOV R7,#04H DJNZ R7,$ DJNZ R6,DL0 RET DELAY20000: ;误差 0us MOV R6,#0D7H DL1: MOV R7,#2DH DJNZ R7,$ DJNZ R6,DL1 NOP NOP RET WORDTAB: DB 00H,1FH,80H,20H,40H,40H,20H,40H,10H,40H,08H,40H,04H,20H,02H,10H; DB 02H,10H,04H,20H,08H,40H,10H,40H,20H,40H,40H,40H,80H,20H,00H,1FH; TAB:;结束码 DB 0DDH END
LED显示器是用发光二极管构成的显示器。构成方式有两大类:一是笔段字符式,一般又有三种:7段(/8段)数码管、15段(/17段)数码管和6段符号显示器;二是点阵字符式,一般有5×7、5×8、8×8和16×16等若干种点阵结构。为了适应不同电路的需要,根据构成LED显示器的发光二极管公共极的极性,有共阴极和共阳极两种形式。对共阴极数码管,公共阴极接地,当各段阳极上的电平为高电平时,该段接通亮,电平为0时,该段关断不亮。对共阳极数码管则刚好相反,高电平时不亮,低电平时亮。这种器件根据显示数位分类,可以分为一位、双位和多位LED显示器,一位LED显示器就称作LED数码管,两位以上的一般就称作LED显示器。 要实现LED的汉字显示在进行、列的扫描的同时还要对其进行供电,因为每行16个二极管点亮电流很大,普通芯片的输出电流远不能满足。下面为你提供实例参考 以16×16显示器为例,你可以用并行扩展芯片8255实现点阵的行扫描,8255可以将单片机一个8位并行I/O口扩展成16位(8255的PA口、PB口同时使用);列扫描的16位可以用两个TTL门74LS164(8位移位寄存器),74LS164再接ULN2803以对电流放大后再接16×16点阵。74LS164的移位触发端A、B可以接上一片的相邻输出端,Q1或Q7这样实现能实现多个芯片连续移位,以实现显示屏汉字从右到左或从左到右的移动显示功能。 由于百度知道不能插入图片,所以不提供图片了,将具体引脚接法告诉你:8255的D0--D7数据输入端接单片机P2.0--P2.7(任一并行I/O口),A0接P2.0,A1接P2.1,/WR接单片机的/WR,/RD接高电平,如果单片机资源足够,则片选端/CS接低电平;74LS164芯片的触发端A、B接到一起,与CK脚、CLK脚、随意接到单片机的I/O上。
1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 00h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 1 1 1 0 0 3ch 0 0 0 0 0 0 0 0 00h 00 00 7e 02 02 02 00 00 你取模是按行取,你可以尝试按列取 取成00h,00h,7eh,02h,02h,02h,00h,00h 当显示一静态"L"时, 假设由左向右扫描输出的话指针顺序是1,2,3,4,5,6,7,8。 如果你要"L"向左移,那下一帧就从2开始2,3,4,5,6,7,8,(程序设定超过8时为00h,简单点就是如果你点阵“屏”是8*8的,那你在后面加补8个00h,16*16就补32个,这样你移动N*8(或N*16)的字幕都是向左“消失”,因为最后那8(或32)个00,刚好能填满你的屏(消失)) 再下一帧就从3开始,如比类推。 当然还可以设成循环模式如 1,2,3,4,5,6,7,8 2,3,4,5,6,7,8,1 3,4,5,6,7,8,1,2 4,5,6,7,8,1,2,3 ...................... 程序我就不给你写了,你自己好好想想咯,外加我是用C的。。汇编不熟。希望能帮到你。
不用的,你可以让它的位置相对移动就行了。没必要把所有状态都做出来。那样太浪费存储空间了。只需要用代码来控制实现就行了。
51和led点阵一般要用到动态扫描的方式,也就是显示的画面不是一下子就把整个画面的内容全部显示出来,而是逐行显示的,只不过显示的频率超过了50HZ 甚至更高,所以我们看起来是“不晃眼”的。也就是说,屏幕显示是由行显示组成的(即子程序)。行显示再细分就是有位显示组成,不过行显示就不用逐位显示了。其实行显示就是串入并出,即行显示是一下子就显示出来的。 我给你传一份资料你参考一下。。。。。。
LED显示器是用发光二极管构成的显示器。构成方式有两大类:一是笔段字符式,一般又有三种:7段(/8段)数码管、15段(/17段)数码管和6段符号显示器;二是点阵字符式,一般有5×7、5×8、8×8和16×16等若干种点阵结构。为了适应不同电路的需要,根据构成LED显示器的发光二极管公共极的极性,有共阴极和共阳极两种形式。对共阴极数码管,公共阴极接地,当各段阳极上的电平为高电平时,该段接通亮,电平为0时,该段关断不亮。对共阳极数码管则刚好相反,高电平时不亮,低电平时亮。这种器件根据显示数位分类,可以分为一位、双位和多位LED显示器,一位LED显示器就称作LED数码管,两位以上的一般就称作LED显示器。 要实现LED的汉字显示在进行、列的扫描的同时还要对其进行供电,因为每行16个二极管点亮电流很大,普通芯片的输出电流远不能满足。下面为你提供实例参考 以16×16显示器为例,你可以用并行扩展芯片8255实现点阵的行扫描,8255可以将单片机一个8位并行I/O口扩展成16位(8255的PA口、PB口同时使用);列扫描的16位可以用两个TTL门74LS164(8位移位寄存器),74LS164再接ULN2803以对电流放大后再接16×16点阵。74LS164的移位触发端A、B可以接上一片的相邻输出端,Q1或Q7这样实现能实现多个芯片连续移位,以实现显示屏汉字从右到左或从左到右的移动显示功能。 由于百度知道不能插入图片,所以不提供图片了,将具体引脚接法告诉你:8255的D0--D7数据输入端接单片机P2.0--P2.7(任一并行I/O口),A0接P2.0,A1接P2.1,/WR接单片机的/WR,/RD接高电平,如果单片机资源足够,则片选端/CS接低电平;74LS164芯片的触发端A、B接到一起,与CK脚、CLK脚、随意接到单片机的I/O上。
啊我之前做了个数码管的时钟所以差不错,主程序一直循环读键盘,然后定时器中断写数字,按钮里面改参数,让定时器引用就行了
修改延时时间,记住是每个字停留的时间