本人想做一个51单片机的LED点阵显示,怎么从单片机调用所有汉字

本人想做一个51单片机的LED点阵显示,怎么从单片机调用所有汉字,第1张

1、选一个带汉字库的LED,直接写汉字内码就可以显示汉字了,应该最方便。

2、将国标汉字库转换成LED的汉子库,转换软件可以从供应商求取,也可以自己编一个小程序自己生成。从网上找也可以,很多很多。

通过手机或遥控、通过u盘、通过串口线。

led显示屏改字软件下载可通过三种方法来改字,分别是:

1、通过手机或遥控来改字,这种方式是最简单的方式,可以编辑短信就可以发送和更改广告字幕了。

2、通过u盘改字,用led显示屏附带的软件在电脑上制作好了,然后软件里面有个下载到U盘,把设置参数和内容保存到发U盘里面就可以了,更改节目时直接用U盘拷贝内容拿到led显示屏上更换就行。

3、通过串口线来改字,连接led显示屏和电脑,然后新建或者打开一个文件。打开显示屏控制软件,将屏参设置好,这个需要输入密码,主要是两块设置,第一个是时间,时间有多种格式,选好后,默认出现在左上角;可以拉开放大,调整。第二个就是内容,选字幕,可以对要的字进行精确编辑,点击发送就可以。

LED显示屏又叫电子显示屏或者飘字屏幕,是由LED点阵和LEDPC面板组成,通过红色、蓝色、白色、绿色LED灯的亮灭来显示文字、、动画、视频。可以根据不同场合的需要做出不同的调节。

LED不是字体没有这个字体,LED只是一种现实形式,它可以把任意字体显示出来,你说的应该是叫点阵字,用成排的LED显示出来的字

如何在C程序中显示12或16点的点阵汉字

郭胜德

在许多c程序设计中,要用到汉字进行提示或人机交互,而现行的turbo c集成开发环境不是汉化的,如何编制能显示汉字的c程序呢?

下面的方法可以帮你在西文环境下显示汉字。这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。

由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。

内码转换成区位码方法如下:

qh=c1-0xa0 wh=c2-0xa0

其区位码就是:

qw=qh*0xff+wh

该汉字在字库中离起点的位置是:

offset=(94*(qh-1)+(wh-1))*32l

程序例:

#include 〈graphicsh〉

#include 〈stdioh〉

#include 〈fcntlh〉

#include 〈ioh〉

#include 〈stdlibh〉

#include 〈conioh〉

#define row 1 //纵坐标放大倍数

#define col 2 //横坐标放大倍数

void main()

{

int x,y;

char *s=〃汉字显示程序〃;

file *fp;

char buffer[32]; //buffer用来存储一个汉字

register m,n,i,j,k;

unsigned char qh,wh;

unsigned long offset;

int gd=detect,gm; //图形屏幕初始化

initgraph(&gd,&gm,〃 〃);

if ((fp=fopen(〃hzk16〃,〃rb〃))==null)

//打开汉字库,该字库可以在ucdos中找到

{ printf(〃can´t open haz16,please add it〃);

getch(); closegraph(); exit(0);

}

x=20; y=100; //显示位置设置

while(*s)

{ qh=*(s)-0xa0; //汉字区位码

wh=*(s+1)-0xa0;

offset=(94*(qh-1)+(wh-1))*32l; //计算该汉字在字库中偏移量

fseek(fp,offset,seek_set);

fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)

for (i=0;i〈16;i++) //将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字

for(n=0;n〈row;n++)

for(j=0;j〈2;j++)

for(k=0;k〈8;k++)

for(m=0;m〈col;m++)

if (((buffer[i*2+j]〉〉(7-k))&0x1)!=null)

putpixel(x+8*j*col+k*col+m,y+i*row+n,green);

s+=2; //因为一个汉字内码占用两个字节,所以s必须加2

x+=30;

}

getch();

closegraph();

}

上述程序在turbo c 20编译系统下运行成功,它可以将汉字放大显示,读者可以将它改成函数用在您的程序中显示汉字。

GBA上的范例:

// 首先你要有HZK12的字库,写个程序把它里面每个数据传换成h文件里的unsigned char,定义一个

// 大数组const u8 ZKDATA[]

void CDraw::DrawHZText(char str,int x,int y,u8 color)

{

char buffer; // buffer用来存储一个汉字

char s=str;

register int i,j,k;

unsigned char qh,wh;

unsigned long offset;

while(s)

{

qh=(s)-0xa0;

wh=(s+1)-0xa0;

offset=(94(qh-1)+(wh-1))24l;

buffer=(char)(ZKDATA+offset);

for(i=0;i<12;i++)

for(j=0;j<2;j++)

for(k=0;k<8;k++)

if(((buffer[i2+j]>>(7-k))&0x1)!=0)

SetPixel(x+8j+k,y+i,color);

s+=2;

x+=12;

}

}

一般是要应用软件实现的,有一款show电子资讯发布系统,很强大,可以播室外全彩屏,图文视频都可以,最牛的是它可以多点联网同步实现,而且可以像电视一样编辑节目单什么,很好用!不过是收费的哦!!!

控制系统里面设置,有的有这个选项,勾上就可以循环,没有这个选项的一般都过调整文字的播放时间,使之循环播放,总之,基本上所有的控制系统都有这个功能。建议多多看下你显示屏供应商给你提供的使用说明书。

t;

#include "toppich"

unsigned int num=0;

void LED4_display(unsigned int i);

void PIC18F_High_isr(void);/中断服务函数声明/

void PIC18F_Low_isr(void);

#pragma code high_vector_section=0x8

/高优先级中断响应时,会自动跳转到0x8处/

/利用预处理器指令#pragma code来指定后面的程序在ROM中的起始地址为0x08,/

/它是告诉连接器定位到特定的代码段,HIGH_INTERRUPT_VECTOR 是该特定代码段的段名/

void high_vector (void)

{

_asm goto PIC18F_High_isr _endasm/通过一条跳转指令(汇编指令),跳转到中断服务函数(中断服务程序)处/

}

#pragma code low_vector_section=0x18

/低优先级中断响应时,会自动跳转到0x18处/

void low_vector (void)

{

_asm goto PIC18F_Low_isr _endasm

}

#pragma code

/这条语句不是多余的,它是告诉连接器回到默认的代码段,/

/如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。/

/而18f4520lkr文件里定义了向量区地址最多到0x29,所以如果没加此句通常会报错/

/---高优先级中断服务程序---/

#pragma interrupt PIC18F_High_isr

/利用预处理器指令#pragma interrupt来声明后面的函数是低优先级中断服务函数(中断服务程序),/

/注意:关键字是interrupt,和低优先级中断时不同/

/一旦指定后面的函数是低优先级中断服务程序,系统在进入该函数时,会自动保护现场,退出前自动恢复现场,/

/同时中断服务程序执行完毕后,会自动返回断点,/

/中断服务函数前必须加该语句/

void PIC18F_High_isr (void)

{

TMR0H=0X67;/TMR0置初值,先写高字节,后写低字节/

TMR0L=0X69;

num++;

if (num>9999) num=0;

INTCONbitsTMR0IF=0;/TMR0溢出标志清零/

}

/---低优先级中断服务程序---/

#pragma interruptlow PIC18F_Low_isr

/注意:关键字是interruptlow,和高优先级中断时不同/

void PIC18F_Low_isr (void)

{

}

void main(void)/主函数/

{

RCONbitsIPEN=1; /使能中断优先级/

toppic_init();/TOPPIC开发板初始化/

T0CON=0b00000101;/TMR0设置:停止运行、16位定时,预分频1:64/

TMR0H=0X67;/TMR0置初值,先写高字节,后写低字节/

TMR0L=0X69;

INTCONbitsTMR0IE=1;/允许Timer0溢出中断/

T0CONbitsTMR0ON=1;/启动TMR0/

INTCONbitsGIE=1;/开全局中断/

while(1)

{

LED4_display(num);/完成4位数码管的一次动态扫描/

}

}

/0-F共阴字形码表/

const rom uchar DB[17]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 ,

0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,

0x39 , 0x5e , 0x79 , 0x71 , 0x00};

void LED4_display(unsigned int i)

{

unsigned int a,bit1000,bit100,bit10,bit1;

a=i;

bit1000=a/1000;//提取千位

a=a%1000;

bit100=a/100;//提取百位

a=a%100;

bit10=a/10;//提取十位

bit1=a%10;//提取个位

COL4=0;

PORTD=DB[bit1];

COL1=1; //个位的位选

delayms(5);/延时5mS/

COL1=0;

PORTD=DB[bit10];

COL2=1; //十位的位选

delayms(5);/延时5mS/

COL2=0;

PORTD=DB[bit100];

COL3=1; //百位的位选

delayms(5);/延时5mS/

COL3=0;

PORTD=DB[bit1000];

COL4=1; //千位的位选

delayms(5);/延时5mS/

}

另外,虚机团上产品团购,超级便宜

LED显示屏作为户外大屏的领导者,显示性能以高清,色彩丰富,高亮度,维护简单等特点,受到市场青睐。而汉字是最常用文字之一。下面给大家展示LED显示屏汉字的设计过程及方案。

LED显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。它具有发光率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。并广泛的用于公交汽车、商店、体育场馆、车站、学校、银行、高速公路等公共场所的信息发布和广告宣传。LED显示屏发展较快,本文讲述了基于AT89C51单片机16×16LED汉字点阵滚动显示的基本原理、硬件组成与设计、程序编写与调试、Proteus软件仿真等基本环节和相关技术。

1 硬件电路组成及工作原理

本产品采用以AT89C51单片机为核心芯片的电路来实现,主要由AT89C51芯片、时钟电路、复位电路、列扫描驱动电路(74HCl54)、16×16LED点阵5部分组成,如图1所示。其中,AT89C51是一种带4kB闪烁可编程可擦除只读存储器(Falsh Programmable and Erasable Read OnlyMemory,FPEROM)的低电压、高性能CMOS型8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,工业标准的MCS一5l指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,能够进行1 000次写/擦循环,数据保留时间为10年。他是一种高效微控制器,为很多嵌人式控制系统提供了一种灵活性高且价廉的方案。因此,在智能化电子设计与制作过程中经常用到AT89C51芯片。时钟电路由AT89C5l的18,19脚的时钟端(XTAI l及XTAL2)以及12 MHz晶振X、电容C2、C3组成,采用片内振荡方式。复位电路采用简易的上电复位电路,主要由电阻R,R2,电容C,开关K组成,分别接至AT89C51的RST复位输入端。LED点阵显示屏采用16×16共256个象素的点阵,可通过万用表检测发光二极管的方法测试判断出该点阵的引脚分布。

我们把行列总线接在单片机的I/0口,然后把上面分析到的扫描代码送入总线,就可以得到显示的汉字了。但是若将LED点阵的行列端口全部直接接入89S5 1单片机,则需要使用32条I/0口,这样会造成I/0口资源的耗尽,系统也再无扩充的余地。因此,我们在实际应用中只是将LED点阵的16条行线直接接在P0口和P2口,至于列选扫描信号则是由4—16线译码器74HCl54来选择控制,这样一来列选控制只使用了单片机的4个I/O口,节约了很多I/O口资源,为单片机系统扩充使用功能提供了条件。考虑到P0口必需设置上拉电阻,我们采用47 kΩ排电阻作为上拉电阻。汉字扫描显示的基本过程是这样的:通电后由于电阻R,电容c1的作用,使单片机的RST复位脚电平先高后低,从而达到复位;之后,在C、C3、X以及单片机内部时钟电路的作用下,单片机89C51按照设定的程序在P0和P2接口输出与内部汉字对应的代码电平送至LED点阵的行选线(高电平驱动),同时在P11,P12,P13,P14接口输出列选扫描信号(低电平驱动),从而选中相应的象素LED发光,并利用人眼的视觉暂留特性合成整个汉字的显示。再改变取表地址实现汉字的滚动显示。

2 汉字的点阵显示原理及字库代码获取方法

我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。即国标汉字库中的每一个字均由256点阵来表示。我们可以把每一个点理解为一个象素,而把每一个字的字形理解为一幅图像。事实上这个汉字屏不仅可以显示汉字,也可以显示在256象素范围内的任何图形。如查用8位的AT89C51单片机控制,由于单片机的总线由8位,一个字需要拆分为2个部分。

为了弄清楚汉字的点阵组成规律,首先通过列扫描方法获取汉字的代码。汉字可拆分为上部和下部,上部由8×16点阵组成,下部也由8×16点阵组成。本例通过列扫描方法首先显示左上角的第一列的上半部分,即第0列的P00~P07口,方向为P00到P07,显示汉字“我”时,为全灭,第一列的下半部分也为全灭。第二列的上半部分P06、点亮,由上往下排列,为:PO0灭,PO1灭,P02灭PO3灭,PO4灭,P05灭,P06亮,P07灭。即二进制00000010,转换为十六进制为02h。上半部第二列完成后,继续扫描下半部的第二列,为了接线的方便,我们仍设计成由上往下扫描,即从P27向P20方向扫描,从图3可以看到,这一列P23亮,即为00001000,十六进制则为08h。依照这个方法转向第三列、第四列,……,直至第十六列的扫描,一共扫描32个8位,可以得出汉字“我”的扫描代码为:

00H,02H,08H,06H,28H,02H,24H,22H

0FCH,3FH,24H,2 1H,20H,10H,3CH,08H

0E2H,07H,20H,0AH,0E4H,11H,0A8H,20H

20H,30H,00H,00H,00H,00H,00H,00H

由这个原理可以看出,无论LED显示屏显示何种字体或图像,都可以用这个方法来分析出他的扫描代码从而显示在屏幕上。上述方法虽然能够让我们弄清楚汉字点阵代码的获取过程,但是依靠人工方法获取汉字代码是一件非常繁琐的事情。为此,我们经常采用字库软件查找字符代码,软件打开后输入汉字,点“检取”,十六进制数据的汉字代码即可自动生成,把我们所需要的竖排数据复制到程序中即可。

可见,汉字点阵显示一般有点扫描、行扫描和列扫描3种。为了符合视觉暂留要求,点扫描方法的扫描频率必须大于16×64—1 024 Hz,周期小于1 ms即可。行扫描和列扫描方法的扫描频率必须大于16×8一128 Hz,周期小于78 ms即可,但是一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。

3 在Keil环境中程序设计与调试

软件程序主要由开始、初始化、主程序、字库组成。

在keil软件中完成程序编写、调试和编译之后,生成能让单片机运行的Hex文件。

4 运用Proteus软件仿真LED汉字显示屏

Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机外围电路或没有单片机参与的其它电路的工作情况,也能仿真单片机CPU的工作情况。因此在仿真和程序调试时,是从工程的角度直接看程序运行和电路工作的过程和结果。从某种意义上讲Proteus仿真,基本接近与工程应用。本次基于AT89C51单片机16×16LED汉字滚动显示屏的设计已运用Proteus软件仿真实现。

虽然本设计只使用了一块16×16LED点阵,电路简单,但是已经包涵了LED汉字滚动显示屏的电路基本原理、基本程序和Proteus软件仿真,只要扩展单片机的10接口,并增加一些LED点阵和相关芯片,就能设计出更大面积、更多花样的LED显示屏。因此本文对同类设计具有一定的理论和实践参考价值。

国内LED显示屏的汉字滚动是常见的播放方式之一,只要扩展单片机的IO接口,就可以增加LED显示屏的点阵,随着LED点阵的增加,显示屏的面积就可以自动增加。当设计汉字,需要针对显示屏的面积来做最合适的设计。

能把带字库12864液晶显示汉字了,程序如下,以供参考

显示三屏汉字,每屏显示三秒,来回循环显示

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

#define lcd_data P0

uchar code table1[]="钟山风雨起苍黄毛""百万雄师过大江泽""亦将剩勇追穷寇东""不可沽名学霸王七";

uchar code table2[]="学习技术天天向上""努力学习才有提高""总结经验不断前进""电子设计一路领先";

uchar code table3[]="爱一个人难却还爱""交结朋友可路更宽""诚实守信加油努力""成功做人成功做事";

sbit lcden=P2^7;

sbit rd=P2^6;

sbit wr=P2^5;

sbit psb=P3^2; //并/串方式选择

void delay(uint z) //延迟函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--)

;

}

void write_com(uchar com) //写指令

{

rd=0;

wr=0;

lcden=0;

P0=com;

delay(5); //这个延迟函数必须要有,因为读数据时当E为高时,数据必须保持稳定

lcden=1;

lcden=0;

}

void write_date(uchar date) //写数据

{

rd=1;

wr=0;

lcden=0;

P0=date;

delay(5); //这个延迟必须要有

lcden=1;

lcden=0;;

}

void write_word(uchar add) //用指针

{

uchar i;

write_com(0x80); //从第一行开始显示

for(i=0;i<64;i++) //一个汉字占两个字节

{

write_date(add);

add++; //指针加,指向下一个字节

}

}

void init() //初始化

{

psb=1; //设置并口方式

write_com(0x 0c); //显示状态 整体显示开

write_com(0x01); //游标左移

write_com(0x30); //功能设定基本指令 *** 作

write_com(0x10); //游标左移

}

void main()

{

init();

while(1)

{

write_word(table1);

delay(3000); //每一屏显示秒钟

write_word(table2);

delay(3000);

write_word(table3);

delay(3000);

}

}

我那时候用的是吴鉴鹰单片机开发板,各方面还是不错的。

从刚开始接触单片机,到现在已经有4年的时间了,在这期间学习和使用了51单片机、飞思卡尔单片机,LPC2138,PIC16F887等系列的单片机,每接触一款单片机,都会经历熟悉其基本开发,然后将其用于项目中的过程,对于如何学习一款单片机,自己做了如下的总结。

大家都知道,51单片机是最容易入门的,不仅因为其编程简单,更重要的是网上的资料非常丰富。所以一般学习单片机开发的都将51单片机作为入门开发的首选。我学习51单片机的时候是采用这样的一个步骤进行学习的:

第一步(熟悉的过程):买了一款51单片机开发板,然后就开始了我的学习之旅,刚开始的时候没有去看视频教程,而是对着一本实验教材进行学习,那本实验教材的名字记不清楚了,但是其内容就是围绕单片机的LED灯进行控制,将51单片机内部的各个功能部件全部都使用到了,这样就能使我在很短的时间内,通过控制LED灯的亮、灭熟悉了51单片机的内部的各种资源,这时对51单片机也就没有感到陌生了。所以,个人觉得,学习单片机,要从实验入手,先熟悉单片机再说,开发语言开始使用的是C语言。

第二步(进阶的过程):有了第一步的基础之后,接下来的便是进阶的过程,当时,我看的是郭天祥十天学会单片机的视频教程,因为这个教程从基础到复杂的编程慢慢深入,讲的比较的全面,而且也生动,所以那一阶段,也是我学习单片机进步最快的阶段,每次听课的时候,按照上面的实验,以及课堂上面调试程序时出现的一些问题,自己认真的在电脑上进行调试,并分析产生故障的原因,让我有了一定的开发基础。在看完了视频教程之后,后面又对基础的知识进行了下补习,主要是看单片机原理性的教材,因为有些细节性的东西还是要从教材上面获得。

第三步(项目实战的阶段):学习单片机的时候,虽然也编写了一些程序,但是那些都是一些很小的模块程序,并没有起到综合应用的目的,所以在这之后,我和另外一个学习硬件的同学一起组成了一个小的团队,进行项目实践开发,那时候,实验室的条件比价好,有很多的器件可以自己使用。所以,我们就设计了我们的第一个作品,基于单片机的液体点滴监控系统。做这个系统时,就将以前单片机所学的知识,做了一个综合的应用,包括有LCD1602控制,串口的控制等。

经过以上三个步骤的学习之后,对于51单片机的开发基本上就算入门了。而对于其他类型的单片机,如飞思卡尔单片机,LPC2148 ARM7单片机,PIC16F887等,虽然每个系列的功能不一样,但是最基本的编程思想还是一样的,不同的可能就是编译器,程序下载的软件等差别,所以有了51单片机的开发基础之后,学习其他单片机所采用的方法就是一个差异化的学习,学习各种单片机不同的地方,这样,就能很快的熟悉一款新的型号的单片机。

如在学习PIC16F887这个系列的单片机时,我首先做的工作不是去阅读数据手册,而是先拿着DEMO代码,在编译软件中编译、链接、生成HEX文件,然后将其下载到开发板中跑起来,这个过程主要就是学习其软件的基本 *** 作,有了这个基础之后,就能自己进行编程、测试。之后就是熟悉其编程的模式,所谓其编程模式,就是寄存器的控制,中断程序的编写,熟悉了这个 *** 作,也就能控制其他的功能模块了,如串口的控制、I2C硬件控制器的控制。这些基本的开发熟悉了之后,接下来便是学习差异的部分,例如PIC单片机C语言中,其堆栈深度不能超过8级,超过了之后,将会使得程序出现跑飞的现象。而且内存的分配完全要靠自己来控制,分成了4个BANK的数据,BANK0,BANK1,BANK2,BANK3 等。这些就是每个系列单片机所独有的一些东西,这些东西需要详细的了解,因为它们可能为你的编程带来很大的便利。

以上就是我学习单片机的总结,如果大家有更好的学习方法,希望大家能够提出来,一起讨论,共同进步。

#include"at89x51h"

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,0x11,0x00,0x01,

0x00,0x00,

0x04,0x04,0x04,0x02,0x04,

0x01,0xC4,0xFF,0x3F,0x00,

0x04,0x20,0x04,0x10,0x04,

0x08,0xE4,0x3F,0x04,0x42,

0x1F,0x41,0x84,0x40,0xC4,

0x40,0x06,0x40,0x04,0x70,

0x00,0x00};

unsigned char i=0,j=0,time_50ms=0;

delay();

main()

{

TMOD=0X01;

TH0=0X3C;

TL0=0XB0;

TR0=1;

ET0=1;

EA=1;

while(1)

{

P1=i;

P2=led[32j+2i];

P3=led[32j+2i+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=0XB0;

time_50ms++;

}

delay()

{

unsigned char t1;

for(t1=0;t1<100;t1++);

}

硬件资源:

1、一片AT89S51单片机

2、由4个88点阵LED模块组成一个16X16点阵LED

3、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位与行驱动器相连,送出行选信号;P15~P17口则用来发送控制信号。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位定时器模式)。

     然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打人输出锁存器并锁存,然后再输出新的行号,重新打开显示。

图74 显示驱动程序流程图

系统主程序:

    系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后向上滚动显示“单片机是工业中最基础的运用”。由于单片机没有停机指令,所以可以设置系统程序不断地循环执行上述显示效果。

装配

以下是部分源程序,不完整,仅供参考,这是完整的资料。

;

;

; 单个1616点阵电子屏字符显示器

; AT89C52 12MHZ晶振

;

;显示字用查表法,不占内存,字符用1616共阳LED点阵,

;效果:向上滚动显示19个字,再重复循环。

;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00-0FH)。

;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。

;;

;中断入口程序;

;;

;

ORG 0000H

LJMP START

ORG 0003H

RETI

ORG 000BH

LJMP INTT0

ORG 0013H

RETI

ORG 001BH

RETI

ORG 0023H

RETI

ORG 002BH

RETI

;

;;

; 初始化程序 ;

;;

;

;

;;

; 主程序 ;

;;

;

START: MOV 20H,#00H ;清标志,00H为第16行开始扫描标志,01为1帧扫描结束标志

MOV A,#0FFH ;端口初始化

MOV P1,A

MOV P2,A

MOV P3,A

MOV P0,A

CLR P16 ;串行寄存器打入输出端控制位

MOV TMOD,#01H ;使用T0作16位定时器,行扫描用。

MOV TH0,#0FCH ;1ms初值(12MHZ)

MOV TL0,#18H

MOV SCON,#00H ;串口0方式传送显示字节

MOV IE,#82H ;T0中断允许,总中断允许

MOV SP,#70H

MAIN: LCALL DIS1 ;显示准备,黑屏,15秒

MOV DPTR,#TAB

LCALL MOVDISP ;向上滚动显示一页(8个字)

INC DPH

LCALL MOVDISP ;向上滚动显示一页(8个字)

INC DPH

LCALL 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 WAITMOV

DISMOV1: 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#=16秒)

DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00-0FH)

MOV DPTR,#TAB ;取表首址

MOV R1,#00H ;查表偏址(显示第一个字)

SETB TR0 ;开扫描(每次一帧)

WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束

AJMP WAIT11

DIS111: DJNZ R3,DIS11

RET

;

;

;;

; 扫描程序 ;

;;

;注意省略了一部分

;;

; 扫描文字表 ;

;;

;

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

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

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

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

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

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

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

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

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

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

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

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

DB 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,077H

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

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

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

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

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

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

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

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

;

END

以上就是关于本人想做一个51单片机的LED点阵显示,怎么从单片机调用所有汉字全部的内容,包括:本人想做一个51单片机的LED点阵显示,怎么从单片机调用所有汉字、led显示屏怎么改字软件下载、汉字LED字体等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9469210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存