单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10079|回复: 11
收起左侧

LCD12864怎么实现任意位置显示字符或汉字?

  [复制链接]
zhaok2013 发表于 2017-3-7 22:27 | 显示全部楼层 |阅读模式
如题,怎么在带字库的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);
        }
        }
}

评分

参与人数 2黑币 +58 收起 理由
碌碌无为 + 8 绝世好帖!
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

baofu 发表于 2017-3-8 14:56 | 显示全部楼层
所谓的“任意位置显示汉字”,困难很大,这是由点阵驱动芯片的构造决定的。比如普通显示一个汉字,横向16个点组成一行,然后从上到下又16行。你的控制精度只能达到1个点,甚至一行就是极限了,不会更小了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

w1179benp 发表于 2017-3-8 15:34 | 显示全部楼层
如果想所谓“任意”,应该是指某字“基准点”,那么问题是你想呈现多大的字?按规矩讲通常是8*8、16*16或倍数的大小,如果以图片方式呈现,那就比较机动,位置大小较随意,但麻烦的很,

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

 楼主| 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或倍 ...

取模之后,如何运用,地址书写还是不很顺手!
回复

使用道具 举报

9#
无效楼层,该帖已经被删除
 楼主| zhaok2013 发表于 2017-3-9 16:09 | 显示全部楼层
imxuheng 发表于 2017-3-8 10:29
1.大小可调
    字库里的字符大小应该是固定的,你要是实现大小可调就要用到字模提取软件,把字符转换为像 ...

谢谢高手指点,我下来再好好领悟一下!
回复

使用道具 举报

steven_zhang 发表于 2017-3-11 10:45 | 显示全部楼层
支持任意位置显示字符,自带中英文字库,希望能为你提供帮助。
1.png
2.png

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

664.1 KB, 下载次数: 151

评分

参与人数 2黑币 +58 收起 理由
碌碌无为 + 8 共享资料的黑币奖励!
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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 | 显示全部楼层
同楼上问,半宽字型的地址怎么设置?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表