标题: LCD12864怎么实现任意位置显示字符或汉字? [打印本页]

作者: zhaok2013    时间: 2017-3-7 22:27
标题: LCD12864怎么实现任意位置显示字符或汉字?
如题,怎么在带字库的LCD12864中任意位置显示汉字或字符(大小可变),本人新手,请不吝赐教,尽可能详细说明!谢谢

作者: imxuheng    时间: 2017-3-8 10:29
本帖最后由 imxuheng 于 2017-3-8 20:47 编辑

1.大小可调
    字库里的字符大小应该是固定的,你要是实现大小可调就要用到字模提取软件,把字符转换为像素点。
2. 任意位置显示
#include<reg52.h>    //包含单片机寄存器的头文件
sbit RS=P2^2;    //寄存器选择位,将RS位定义为P2.2引脚
sbit RW=P2^3;    //读写选择位,将RW位定义为P2.3引脚
sbit EN=P2^4;     //使能信号位,将E位定义为P2.4引脚
unsigned char table[]=" 你好 ";
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字

void read_busy()        //读忙标志
{
        RS=0;
        RW=1;
        EN=1;
        while(P0 & 0x80);
        EN=0;
}

void delay(unsigned int i)        //延时函数
{
        while(--i);
}
void Write_LCD_command(unsigned char value) //写命令函数
{
        read_busy();        //每次读写前都要惊醒“忙”判断
        RS=0;
        RW=0;
        delay(200);
        EN=1;                        //EN从1---0锁存有效数据
        P0=value;
        delay(200);
        EN=0;
}
void Write_LCD_data(unsigned char value)//写数据函数
{
        read_busy();        //每次读写前都要惊醒“忙”判断
        RS=1;
        RW=0;
        delay(200);
        EN=1;                        //EN从1---0锁存有效数据
        P0=value;
        delay(200);
        EN=0;
}

void init_LCD()        //LCD12864初始化
{
        delay(4000);
        Write_LCD_command(0x30);//8位数据格式,基本指令显示
        delay(100);                                //延时时间
        Write_LCD_command(0x30);//8位数据格式,基本指令显示
        delay(37);
        Write_LCD_command(0x0C);//开显示、关闭光标
        delay(100);
        Write_LCD_command(0x01);//清屏指令
        delay(10000);                        //延时
        Write_LCD_command(0x06);//设置显示点:指针自加1
}
//*************************************************
//以上是我测温程序的显示驱动部分,下面给你实现任意位置显示的程序
//*************************************************
void main()
{
        unsigned int num;
        init_LCD()        //LCD12864初始化
        while(1)
      {
        for(num=0;num<4;num++)//2个汉字
        {
                Write_LCD_command(0x90);//根据需要改变数值从而实现不同位置显示,看看12864的手册就知道了
                Write_LCD_data(table[num]);
                delay(10000);
        }
        }
}
作者: baofu    时间: 2017-3-8 14:56
所谓的“任意位置显示汉字”,困难很大,这是由点阵驱动芯片的构造决定的。比如普通显示一个汉字,横向16个点组成一行,然后从上到下又16行。你的控制精度只能达到1个点,甚至一行就是极限了,不会更小了。
作者: w1179benp    时间: 2017-3-8 15:34
如果想所谓“任意”,应该是指某字“基准点”,那么问题是你想呈现多大的字?按规矩讲通常是8*8、16*16或倍数的大小,如果以图片方式呈现,那就比较机动,位置大小较随意,但麻烦的很,
作者: zhaok2013    时间: 2017-3-8 16:20
baofu 发表于 2017-3-8 14:56
所谓的“任意位置显示汉字”,困难很大,这是由点阵驱动芯片的构造决定的。比如普通显示一个汉字,横向16个 ...

嗯,谢谢,我也正是被这个难住的!
作者: zhaok2013    时间: 2017-3-8 16:21
w1179benp 发表于 2017-3-8 15:34
如果想所谓“任意”,应该是指某字“基准点”,那么问题是你想呈现多大的字?按规矩讲通常是8*8、16*16或倍 ...

取模之后,如何运用,地址书写还是不很顺手!
作者: zhaok2013    时间: 2017-3-9 16:09
imxuheng 发表于 2017-3-8 10:29
1.大小可调
    字库里的字符大小应该是固定的,你要是实现大小可调就要用到字模提取软件,把字符转换为像 ...

谢谢高手指点,我下来再好好领悟一下!
作者: steven_zhang    时间: 2017-3-11 10:45
支持任意位置显示字符,自带中英文字库,希望能为你提供帮助。

1.png (493.73 KB, 下载次数: 204)

1.png

2.png (4.8 MB, 下载次数: 174)

2.png

Arduino I2C控制字库12864液晶屏资料.rar

664.1 KB, 下载次数: 304


作者: mllwj    时间: 2017-5-3 23:39
学习了,非常感谢
作者: smallriver    时间: 2017-5-16 12:44
最近我也在使用12864屏,但是发现一个问题,这屏幕自带字库,意思就是你给他什么东西他就显示什么,而不用编码,他有三种字库,,分别是半宽的HCGROM字型、CGRAM字型及中文CGROM字型。三种字型的选择,由在DDRAM中写入的编码选择,各种字型详细编码如下:显示半宽字型 :将一位字节写入DDRAM中,范围为02H-7FH的编码。我想显示半宽字形的字符,也就是英文或者数字已经一些特殊符号,反正是他给出的编码,但是这想在任意一行(0-3)的任意一个位置(0-15),数据手册上说可以指定两种地址计数器的位置,一种是DDRAM,这种是显示汉字,每个位置显示一个汉字,所以每行的位置实际只有8个,比如第一行就是0x80-0x87,但是还有一种字符地址就是每行有16个位置的,按照数据手册上来说是0x40-0x4f,但是我设置来显示却没有任何反应,不知楼主能否解答一下
作者: 彼岸曼珠沙华    时间: 2018-2-25 21:01
同楼上问,半宽字型的地址怎么设置?

作者: 傻吊吊    时间: 2021-7-14 22:07
彼岸曼珠沙华 发表于 2018-2-25 21:01
同楼上问,半宽字型的地址怎么设置?

同问

作者: gain    时间: 2021-7-15 07:52
不可能随意,分辨率的像素点是固定在每个地方的,一般规矩是8*8、16*16或倍数的大
作者: lishengaha    时间: 2021-7-15 09:22
如果想要任意位置其实要像  oled 12864那样自己导入字库和扫描函数好一点
作者: rayin    时间: 2021-7-15 11:32
黑白屏和彩屏不同,黑白屏是一个字节对应8个像素,彩屏是2个字节或3个字节对应一个像素。因此彩屏可以做到任意位置显示汉字。黑白屏本来就是低频率工作的如51单片机驱动工作,做到任意像素要做位移处理,加重单片机负担,会使得汉字显示速度更加慢。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1