导航:首页 > 操作系统 > 单片机LED显示字库

单片机LED显示字库

发布时间:2025-05-10 14:13:53

Ⅰ LCD12864的屏总是在闪,我是用51单片机做的,屏带字库,补充里是整个程序,怎么解决谢谢

看了你的程序,问题在while里面。没必要循环初始化你的LCD,将初始化程序放到主函数中。你的显示函数中也已经包含了清屏指令,不需要在while里面再次加入清屏指令。如果一定要用,建议你在所有清屏指令后加入的延时够大。清屏指令过多,延时太少的话,相当于清屏之后又写入,再清屏再写入,你看到的就是闪了。

Ⅱ 【51单片机】LCD12864显示字符和图片

本次所使用的显示屏为AMPIRE 128x64 Graphical LCD with KS0108 controllers。它自身并不带字库,因此,如果想要在显示屏上显示字符,必须通过取模软件自制字库。
AMPIRE12864显示屏由左右两个半屏组成,分别由两片控制器控制,控制引脚为CS1和CS2。每个控制器内部有64*64位的RAM缓存区,每个半屏有8页、64列,每页包含8行。一个中文字符的显示需要16*16个点,因此整个显示屏最多可显示32个中文字符,每两页显示一行,共可显示4行。
AMPIRE12864的控制指令包括:
1、显示开关设置:将D设置为0可以关闭显示(指令为0x3F);设置D为1则可以开启显示(指令为0x3E)。显示开关不影响显示存储器的内容。
2、显示起始行设置:通过设置L5~L0来指定显示起始行,可表示1-64行(当L5~L0为0时,指令为0xC0)。执行此命令后,设置的行将显示在屏幕第一行。显示起始行存储在Z地址计数器中,具有循环计数功能,每扫描一行就自动加一。通过定时长、等间距地修改此指令,可使显示屏内容呈现向上或向下平滑滚动的显示效果。
3、页面地址设置:使用P2~P0来指定页地址,可表示1-8页(当P2~P0为0时,指令为0xB8)。该指令规定了后续读写操作将在哪一页进行,除非重新设置该地址,否则均在该页进行。页地址存储在X地址计数器中,读写数据对页地址没有影响。
4、列地址设置:通过设置C5~C0来指定列地址,可表示1-64列(当C5~C0为0时,指令为0x40)。执行该指令后,后续的读写操作将在该列进行。列地址存储在Y地址计数器中,具有自动加一功能,每一次读写数据后自动加一。进行连续读写时,列地址只需设置一次即可。
5、读取状态字:通过检查BUSY、ON/OFF和RESET来判断控制器的状态。BUSY=1表示控制器正在处理指令或数据,不再接受除读状态字以外的操作,单片机需要等待;BUSY=0表示控制器准备就绪,可接受指令。ON/OFF=1表示显示状态为关状态;ON/OFF=0表示显示状态为开状态。RESET=1表示显示屏处于复位状态;RESET=1表示显示屏处于正常工作状态。
6、读写数据:写指令时,将RS设置为0,R/W设置为0,D0~D7为指令码,E在下降沿时写入指令。写数据时,将RS设置为1,R/W设置为0,D0~D7为数据,E在下降沿时写入数据。读状态时,将RS设置为0,R/W设置为1,E在下降沿时读取显示屏状态,D0~D7为状态码。
为了在AMPIRE12864上显示字符和图片,需要通过取模软件提取字符和图片的字模。提取字符和图片字模的过程如下:
1、首先,将图片使用Windows自带的画图软件打开,调整图片大小(例如64x64像素),并另存为单色位图(bmp格式)。
2、然后,打开取模软件(如PCtoLCD2002),导入保存的单色位图图像,设置好字模生成选项后,点击生成字模即可。
(注:AMPIRE12864的像素点在低电平时显示蓝色,高电平显示黑色,因此在取模时应选择阳码;取模方式可选择列行式;每行显示点阵数据根据图像大小来选择,这里选择64。)
对于汉字字模提取,应遵循先左后右、先上后下的顺序提取字模。一个汉字需要16*16点,占据2页、16列,因此应先提取这一页的16列数据,再提取下一页的16列数据,形成一个汉字的字模数据,显示时按照顺序写入对应DDRAM地址即可。
最后,下面是一个简单的示例代码,用于说明如何在AMPIRE 128x64 LCD上显示字符和图片:
main.c代码:
LCD12864.c代码:
LCD12864.h代码:

Ⅲ 关于单片机液晶屏LCD12864的程序

/*****************************************************************

*程序名称:带汉字库的12864液晶显示模块驱动

*程序功能:显示字符 、汉字和图片

*开发工具:Kile

* MCU型号:AT89S52-24PU

*时钟频率:11.0592MHZ

*程序作者:yuan

*版权说明:yuan

*****************************************************************/
#include<reg52.h>
#include "lcd.h"
#include "util.h"

sbit E=P1^5;//脉冲使能
sbit RW=P1^6;//读写选择
sbit RS=P1^7;//数据命令选择
sbit rst=P3^6;//12864复位

// 延时ms函数:

// 12864检查状态函数:
void Check12864State(void)
{

P0=0xff;
E=0;//读状态前三控制线的状态
RS=0;
RW=1;
E=1;//拉高,读状态
while((P0&0x80)==0x80);//等待空闲
E=0;//写命令后三控制线的状态
RS=1;
RW=0;

}

// 12864写命令函数:
void Write12864Command( unsigned char com)
{

Check12864State();//检查状态
P0=com;//赋值
E=0;//写命令前三控制线的状态
RS=0;
RW=0;
E=1;//拉高,写命令
E=0;//写命令后三控制线的状态
RS=1;
RW=1;

}

//12864写数据函数:
void Write12864Data( unsigned char dat)
{

Check12864State();//检查状态
P0=dat;//赋值
E=0;//写数据前三控制线的状态
RS=1;
RW=0;
E=1;//拉高,写数据
E=0;//写数据后三控制线的状态
RS=0;
RW=1;

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{

unsigned char row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址计数器自动加以,光标右移
switch(y)//根据行号选择行地址
{

case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;

}

Write12864Command(row+x);//写地址
while(*pstr!='\0')
{

Write12864Data(*pstr);//写字符
pstr++;
n++;//计数
if((n+x*2)==16)//如果一行写完 ,继续写第二行
{
if(y==0) Write12864Command(0x90);//写下一行地址
else if(y==1) Write12864Command(0x88);//写下一行地址
else if(y==2) Write12864Command(0x98);//写下一行地址
else ;

}
else if((n+x*2)==32)//如果第二行写完 ,继续写第三行
{

if(y==0) Write12864Command(0x88);//写下一行地址
else if(y==1) Write12864Command(0x98);//写下一行地址
else ;
}

else if((n+x*2)==48)//如果第三行写完 ,继续写第四行
{
if(y==0) Write12864Command(0x98);//写下一行地址
else ;
}
else ;
}

}

//图片模式清屏函数:
void Clear12864Screen()
{

unsigned char i,j;
Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令
Write12864Command(0x36);//使用扩充指令,绘图显示控制
for(i=0;i<32;i++)

//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i);//写行地址(垂直地址)
Write12864Command(0x80);//写列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏

}

}

//在任意位置显示任意大小的图片函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-图片宽度,py-图片高度,pp-指针指向图片数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{

k=32-y;//算出上半屏的行数
for(i=0;i<k;i++,y++)//上半屏行数
{
Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|x);//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

y=0;//下半屏起始行,接上半屏继续写数据
for(;i<py;i++,y++)//下半屏剩下的行数
{

Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行数
{
Write12864Command(0x80|(y-32));//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

}

void Clear12864Text()
{
Write12864Command(0x34);//清屏
DelayMs(5);
Write12864Command(0x30);//清屏
DelayMs(5);
Write12864Command(0x01);//清屏
DelayMs(5);
}

//12864初始化函数:
void Initialize12864()
{

rst=0;//复位12864
DelayMs(30);
rst=1;
DelayMs(20);
Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
Write12864Command(0x08);//显示关
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址计数器加一、光标右移
Write12864Command(0x0c);//显示开

}

带字库的驱动

Ⅳ 单片机控制的16*16点阵显示汉字,为什么出现的字体是镜像的怎么改正

单片机控制的16*16点阵显示汉字,出现字体是镜像的现象是由于取点阵时扫描方向搞反了。改正方法是逆序读点阵数组数据,即原来从数组0下标开始读改为从下标15开始倒着读,写的顺序不变,就矫正了。

Ⅳ 单片机,字库文件是怎么调用的

字库文件必须嵌入到程序里面才能使用,一般而言,要制作小字库,以节约代码空间。单片机程序空间是比较紧张的,所以不能使用整个字库(比如汉字库),只取有用字的字模。

Ⅵ 单片机12864液晶屏带字库和不带字库是什么意思

就是显示汉字的问题。
显示一个汉字,是需要显示好多小点的。
这就是汉字点阵。

如果不带字库,为了显示一个汉字,就需要传送一大批点阵数据。

如果带字库,显示一个汉字,仅仅需要传送两个字节汉字内码。
这种情况下,速度就很快。

Ⅶ 求51单片机怎么显示汉字,能不能给我发个现成的程序

在51单片机上显示汉字,首先需要考虑的是所使用的液晶显示屏是否内置了字库。如果有字库,那么只需发送相应的两字节汉字代码就能直接显示汉字。例如,发送"娟字"的编码即可。但如果没有内置字库,就需要通过汉字取模软件提取点阵数据。点阵数据的大小会根据取模软件的设置有所不同,常见的有16X16点阵和32X32点阵两种,对应的点阵数据大小也不同。

对于16X16点阵的汉字,通常需要32个字节来存储一个汉字的点阵信息。而32X32点阵的汉字则需要128个字节。因此,在发送点阵数据之前,需要先确定液晶屏支持哪种点阵格式。这可以通过查阅液晶屏的数据手册来实现。

具体步骤如下:首先,使用汉字取模软件将汉字“娟”提取成16X16点阵数据或32X32点阵数据。然后,将生成的点阵数据通过单片机发送给液晶屏,使其显示相应的汉字。在发送点阵数据时,需要注意点阵数据的格式和传输方式,以确保数据能够被液晶屏正确解析并显示。

值得注意的是,不同的取模软件和液晶屏可能有不同的点阵数据格式,因此在实际操作中需要根据具体情况来调整。此外,如果需要显示更多汉字,可以使用循环或其他方法,将点阵数据逐一发送给液晶屏。

总之,在51单片机上显示汉字的关键在于是否有内置字库或是否能正确提取和发送点阵数据。通过这些步骤,可以实现汉字的显示。

Ⅷ 如何用单片机让数码管显字

LED静态显示接口
数码管工作在静态显示方式时,共阴极(共阳极)的公共端COM连接在一起接地(电源)。每位的段选线与一个8位并行口相连。只要在该位的段选线上保持段选码电平,该位就能保持相应的显示字符。这里的8位并行口可以直接采用并行I/O接口片(例如80C51的P1端口、8155和8255的I/O端口等),也可以采用串行输入/并行输出的移位寄存器。考虑到若采用并行I/O接口,占用I/O资源较多,因而静态显示方式常采用串行接口方式,外接8位移位寄存器74HCl64构成显示电路,图2是通过串行口扩展8位LED显示器静态驱动电路,在TXD(P3.1)运行时钟信号,将显示数据由RXD(P3.0)口串行输出,串行口工作在移位寄存器方式(方式0)。

图2中使用的是共阴极数码管,因而各数码管的公共极COM端接地,要显示某字段,则相应的移位寄存器74HC164的输出线必须是高电平。 显然,要显示某字符,首先要把这个字符转换成相应的字形码,然后再通过串行口发送到74HC164。74HC164把串行口收到的数变为并行输出加到数码管上。先建立一个字形码表,以十六进制数的次序存放它们的相应字形码,共阴极字形码表如表1所示。
考虑到本设计成本问题,静态电路需要对应于每一个数码管LED接一个移位寄存器74HC164芯片。而且TXD、RXD端口在上位机通信中要用到,而如果界别的端口,编码就变得比较复杂了,所以静态显示就放弃了。

如要显示字符6,查表可知6的字形码为0x7d,把0x7d送到8位移位寄存器74HC164即可。显然,要显示字符0~9、A~F,其高4位为全0,而低4位为十六进制数。如果要显示的数高半字节不是0,则要通过程序加以变换。这种静态LED显示法有着显示亮度大,软件较为简单的特点,但硬件上使用芯片多,每个LED显示器需要一个驱动电路。

阅读全文

与单片机LED显示字库相关的资料

热点内容
49乘以235的简便算法 浏览:673
新概念51单片机c语言教程光盘 浏览:262
服务器分区如何选择 浏览:354
php官方网站 浏览:592
安卓游戏点券如何修改 浏览:743
玻璃门加密码锁怎么固定 浏览:398
诛仙2文件夹叫什么名字 浏览:811
一加添加桌面文件夹 浏览:64
加密软件都是哪些 浏览:609
java文本输入框 浏览:400
单片机报警器采用中断系统 浏览:776
服务器如何看是否有数据库 浏览:807
cad刷字体命令 浏览:684
服务器里没有管理员怎么搞到32k 浏览:911
魅族怎么关闭app的通知 浏览:841
数控宏程序编程方法技巧与实例 浏览:352
新买路由器怎么设置加密 浏览:100
linuxping命令详解 浏览:724
训练集几个文件夹 浏览:99
java获取项目根目录 浏览:205