OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6512|回复: 19

LCD12864 如何在“任意坐标”显示半宽字符(8 x 16)?

[复制链接]

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2018-3-19 18:57:33 | 显示全部楼层 |阅读模式
10金钱
我用的是 st7920驱动的LCD12864,带中文字库。
遇到的问题是无法在横坐标为奇数的时候显示单个的ascii字符,或者无法显示以奇数横坐标开头的字符串的第一个字符。

LCD12832 像素128x64,如果用8x16的字符,每行可以显示(0~16)个;如果用16x16的字符,每行可以显示(0~8)个。
st7920的横坐标是16个像素点占一个坐标,所以横坐标只能输入0~8个地址。
现在我需要在x=0~16个坐标分别显示8x16大小的ascii字符。
如果我想在y=0,x=0的坐标显示一个字母'A',直接把坐标和数据分别发送给lcd就行了,可以直接显示;
如果我想在y=0,x=1的坐标显示一个字母'B',这个横坐标是0的另一部分,直接发送的话会把B覆盖到A上去,把横坐标直接加1的话,会在x=2的位置显示出B来。

对于这种情况st7920提供了 一种办法,对RAM进行一次读操作,显示的坐标会自动向后移动一个字符(半个汉字)的位置,可以直接把坐标选中到奇数横坐标上,而不会对旁边的字符产生影响。我就是这么干的。

但是这个办法在LCD12864上不好使,读RAM无法让坐标移动。同样是ST7920控制的lcd12832就没有问题,可以用读RAM的方法选中任意的坐标。

比较暴力的方法是自己做字库,但是速度会变慢,发送一个8x16的字模要发16个字节,io速度就比字库慢了16倍。

有没有前辈遇到过同样的问题,都是怎么解决的?
相关问题在论坛只搜到一个2016年的帖子,和我遇到的差不多是同样的问题,也是没有找到什么好办法。当时原子哥可能误会了,不是字模大小的原因,是选不中坐标。



最佳答案

查看完整内容[请看2#楼]

我也用过7920,这个控制器有点不好处理,KS0108就好处理一点,如果楼主想试试的话,可以开辟一个数组,对应显示RAM,对RAM进行绘图,再一次性更新到12864
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-3-19 18:57:34 | 显示全部楼层
我也用过7920,这个控制器有点不好处理,KS0108就好处理一点,如果楼主想试试的话,可以开辟一个数组,对应显示RAM,对RAM进行绘图,再一次性更新到12864
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-20 10:35:04 | 显示全部楼层
d1z1y2 发表于 2018-3-19 20:06
我也用过7920,这个控制器有点不好处理,KS0108就好处理一点,如果楼主想试试的话,可以开辟一个数组,对应 ...

多谢。
也只能先这么干了。后来我又问了st7920的技术支持,他们都没测过这个问题。看来以后绝对不能再选这种屏了。
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
发表于 2018-3-20 13:26:06 | 显示全部楼层
这个只能通过显存处理了,因为类似KS0108或者SSD1306的屏幕,在串口下只能写不能读,想读只能用并口。
在内存里开辟一块显存,在显存里更新然后更新到屏幕。
具体的操作可以参考下我的SimpleGUI,里面有针对文字和图片的详细处理。
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-3-20 20:18:23 | 显示全部楼层
玉麒麟 发表于 2018-3-20 13:26
这个只能通过显存处理了,因为类似KS0108或者SSD1306的屏幕,在串口下只能写不能读,想读只能用并口。
...

为开源精神,赞一个
回复

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2018-3-20 21:13:02 | 显示全部楼层
st7920驱动的 LCD12864,在x=0~16个坐标分别显示8x16大小的ascii字符,我的代码是下面这样的,并行驱动方式和串行方式有点区别[mw_shl_code=applescript,true]void LCD12864_Char(char x,char y,char ch)
{
        if ((y%2)!=0)        //判断奇数位
        {
                WriteCom(hang[x]+y/2);
                WriteData(ch);
        }
        else       
        {
                WriteCom(hang[x]+y/2-1);
#if ParallelMode
                ReadData();
#else
                SendByte(1);
#endif
                WriteData(ch);
        }
}[/mw_shl_code]

回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 09:49:03 | 显示全部楼层
2449164582 发表于 2018-3-20 21:13
st7920驱动的 LCD12864,在x=0~16个坐标分别显示8x16大小的ascii字符,我的代码是下面这样的, ...

多谢。

我以前也是像你这么处理的。
但是我遇到的问题是ReadData这种操作没办法让坐标向后移动一个字节
我以前在几家的12832(同样是st7920驱动的)上都用过,可以正常显示,这个方法本身没问题,st7920的手册上也是这么推荐的。
但是移植到12864上就不行了,其他显示功能都正常,就是这个ReadData效果不正常。不知道是地址更多引起的混乱还是芯片本身的品质问题。
问过技术支持,st7920的人不知道有这个功能,不知道是不是新来的;12864的人明确的说没这个功能。
就算我找到了一家能正常操作的LCD12864,如果还是按照这种方法做程序,说不定以后就买到哪一批不正常的,整个程序就不能用了。所以我暂时用的MCU里分配显存的方法。
如果只用字库的话,只需16x4=64 bytes的空间,不是很大。

回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 09:50:30 | 显示全部楼层
本帖最后由 xianshasaman 于 2018-3-21 09:52 编辑
玉麒麟 发表于 2018-3-20 13:26
这个只能通过显存处理了,因为类似KS0108或者SSD1306的屏幕,在串口下只能写不能读,想读只能用并口。
...

多谢
是这个吧
http://www.openedv.com/forum.php?mod=viewthread&tid=96247
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
发表于 2018-3-21 11:01:45 | 显示全部楼层
xianshasaman 发表于 2018-3-21 09:50
多谢
是这个吧
http://www.openedv.com/forum.php?mod=viewthread&tid=96247

嗯,就是这个,你参照下,里面的Text模块和bitmap模块。
主导思想就是所有的文字都按照Bitmap进行处理,按照这个思路去看。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-21 11:58:31 | 显示全部楼层
微信图片_20180321115757.jpg
是要第三行的显示方式么?
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-21 12:04:07 | 显示全部楼层
2)、显示ASCII码半宽字符时,往每个地址送入2个字节的ASCII编码,对应屏幕上的位置就会显示2个半宽字符,左边的为高字节字符,右边的为低字节字符。
    3)、显示汉字时,汉字编码的2个字节必须存储在同一地址空间中,不能分开放在2个地址存放,否则显示的就不是你想要的字符。每个字中的2个字节自动结合查找字模并显示字符。所以,如果我们往一个地址中写入的是一个汉字的2字节编码就会正确显示该字符,编码高字节存放在前一地址低字节,编码低字节存放在后一地址高字节,显然他们就不会结合查找字模,而是与各地址相应字节结合查找字模。


-----《学习笔记:12864液晶模块的详细使用》 红雨瓢泼中学的博客

蚊帐里有详细说明,还有图表。
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 13:14:45 | 显示全部楼层
孟亮 发表于 2018-3-21 11:58
是要第三行的显示方式么?

显然不是这种啊。你把第三行的hello向左移动一个字节,看看还能正常显示吗?
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 13:22:32 | 显示全部楼层
孟亮 发表于 2018-3-21 12:04
2)、显示ASCII码半宽字符时,往每个地址送入2个字节的ASCII编码,对应屏幕上的位置就会显示2个半宽字符, ...

这是手册里的说明

读或者写任意一种RAM,AC或自动向后加1

读或者写任意一种RAM,AC或自动向后加1
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-21 13:22:53 | 显示全部楼层
微信图片_20180321132222.jpg 这样?
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 13:26:27 | 显示全部楼层

对,就是这样,你的可以正常显示。我的买的2家的屏,有一家的就不行,同样的程序。现在不想在测第三家了。已经改方案了。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-21 13:28:11 | 显示全部楼层
xianshasaman 发表于 2018-3-21 13:26
对,就是这样,你的可以正常显示。我的买的2家的屏,有一家的就不行,同样的程序。现在不想在测第三家了 ...

你把数据位第一个位置写个空格,不是就从第二个位置开始显示了么。。。
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 13:28:26 | 显示全部楼层
本帖最后由 xianshasaman 于 2018-3-21 13:33 编辑

已改回复了,才看到你是写空格的
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
 楼主| 发表于 2018-3-21 13:31:03 | 显示全部楼层
孟亮 发表于 2018-3-21 13:28
你把数据位第一个位置写个空格,不是就从第二个位置开始显示了么。。。

哥们你是在逗我吗?原来你是写了个空格啊?

要是动态的更改某个区域的字符,写空格不就把傍边的字符给擦了吗?
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-21 13:56:55 | 显示全部楼层
xianshasaman 发表于 2018-3-21 13:31
哥们你是在逗我吗?原来你是写了个空格啊?

要是动态的更改某个区域的字符,写空格不就把傍边的字符 ...

跟写flash一样,你先把整行buffer设置好,批量写入不就行了。
回复

使用道具 举报

17

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2015-11-25
在线时间
126 小时
发表于 2018-6-21 13:47:29 | 显示全部楼层
学习下,谢谢~!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 05:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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