找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23264|回复: 15
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
如题,怎么在带字库的LCD12864中任意位置显示汉字或字符(大小可变),本人新手,请不吝赐教,尽可能详细说明!谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:151348 发表于 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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

评分

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

查看全部评分

回复

使用道具 举报

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

评分

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

查看全部评分

回复

使用道具 举报

5#
ID:165046 发表于 2017-3-8 16:20 | 只看该作者
baofu 发表于 2017-3-8 14:56
所谓的“任意位置显示汉字”,困难很大,这是由点阵驱动芯片的构造决定的。比如普通显示一个汉字,横向16个 ...

嗯,谢谢,我也正是被这个难住的!
回复

使用道具 举报

6#
ID:165046 发表于 2017-3-8 16:21 | 只看该作者
w1179benp 发表于 2017-3-8 15:34
如果想所谓“任意”,应该是指某字“基准点”,那么问题是你想呈现多大的字?按规矩讲通常是8*8、16*16或倍 ...

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

使用道具 举报

7#
ID:165046 发表于 2017-3-9 16:09 | 只看该作者
imxuheng 发表于 2017-3-8 10:29
1.大小可调
    字库里的字符大小应该是固定的,你要是实现大小可调就要用到字模提取软件,把字符转换为像 ...

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

使用道具 举报

8#
ID:54992 发表于 2017-3-11 10:45 | 只看该作者
支持任意位置显示字符,自带中英文字库,希望能为你提供帮助。

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

1.png

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

2.png

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

664.1 KB, 下载次数: 301

评分

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

查看全部评分

回复

使用道具 举报

9#
ID:154576 发表于 2017-5-3 23:39 | 只看该作者
学习了,非常感谢
回复

使用道具 举报

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

使用道具 举报

11#
ID:87089 发表于 2018-2-25 21:01 | 只看该作者
同楼上问,半宽字型的地址怎么设置?
回复

使用道具 举报

12#
ID:953055 发表于 2021-7-14 22:07 | 只看该作者
彼岸曼珠沙华 发表于 2018-2-25 21:01
同楼上问,半宽字型的地址怎么设置?

同问
回复

使用道具 举报

13#
ID:950257 发表于 2021-7-15 07:52 | 只看该作者
不可能随意,分辨率的像素点是固定在每个地方的,一般规矩是8*8、16*16或倍数的大
回复

使用道具 举报

14#
ID:939710 发表于 2021-7-15 09:22 | 只看该作者
如果想要任意位置其实要像  oled 12864那样自己导入字库和扫描函数好一点
回复

使用道具 举报

15#
ID:517951 发表于 2021-7-15 11:32 | 只看该作者
黑白屏和彩屏不同,黑白屏是一个字节对应8个像素,彩屏是2个字节或3个字节对应一个像素。因此彩屏可以做到任意位置显示汉字。黑白屏本来就是低频率工作的如51单片机驱动工作,做到任意像素要做位移处理,加重单片机负担,会使得汉字显示速度更加慢。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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