野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12443|回复: 8

用野火的5寸触摸屏,参照例程写的驱动函数,结果中文显示错乱

[复制链接]
发表于 2016-1-6 21:29:58 | 显示全部楼层 |阅读模式
最近用野火的5寸屏做显示用,这个板子的TFT控制器用的RA8875,用自己画的板子(MPU用的不是STM32系列的)驱动,参照野火STM32 MINI的显示程序,用IO口模拟的接口,更改了读写寄存器和数据的函数,其他基本未动,基本功能如画圆,画矩形,清屏等正常,结果在中文显示上出了问题
显示字符应该如下  
RA8875_DispStr(0,0,"野火5.0寸液晶屏参数:");
  RA8875_DispStr(0,30,"分辨率:800x480 像素");
  RA8875_DispStr(0,60,"电容触摸屏:支持5点触控");
  RA8875_DispStr(0,90,"屏幕自带中文字库,自带绘图引擎,可超高速描绘各种2D图形");
  RA8875_DispStr(0,120,"液晶控制器采用8080接口通讯,16位数据线,可直接采用FSMC驱动");
  RA8875_DispStr(0,150,"触摸屏控制器采用IIC接口通讯"); 结果 ,显示如图,显示的结果中英文和数字都正常,初步推测是程序控制时将一个中文字当成了两个字节分别写入了,于是一个中文字显示成了2个字符,导致了乱码的问题
有大神知道这是怎么回事么



QQ图片20160106211306.jpg
回复

使用道具 举报

 楼主| 发表于 2016-1-6 21:33:18 | 显示全部楼层
void RA8875_DispStr(uint16_t _usX, uint16_t _usY, char *_ptr)
{
       
        /*
                RA8875 透过使用 — 上海集通公司 (Genitop Inc) 外部串行式字体内存 (Font ROM),可支持各样
                的文字写入到DDRAM 中。RA8875 与上海集通公司 (Genitop Inc) 兼容的产品包含 :
                GT21L16TW/GT21H16T1W 、GT23L16U2W 、GT23L24T3Y/GT23H24T3Y 、GT23L24M1Z 、
                及 GT23L32S4W/GT23H32S4W。这些字体包含16x16, 24x24, 32x32 点 (Dot) 与不同的字

                野火RA8875驱动板集成的字库芯片为 集通字库芯片_GT23l32S4W

                GT23L32S4W是一款内含11X12点阵、15X16点、24X24点阵、32X32点阵的汉字库芯片,支持GB2312
                国标汉字(含有国家信标委合法授权)及SCII字符。排列格式为横置横排。用户通过字符内码,利用本手
                册提供的方法计算出该字符点阵在芯片中的地址,可从该地址连续读出字符点阵信息。
        */

        /* 设置文本显示位置,注意文本模式的写入光标和图形模式的写入光标是不同的寄存器 */
        RA8875_SetTextCursor(_usX, _usY);

        RA8875_WriteReg(0x40, (1 << 7));        /* 设置为文本模式 */
          
        /*
                Serial Flash/ROM 频率频率设定
                        0xb: SFCL 频率 = 系统频率频率(当DMA 为致能状态,并且色彩深度为256 色,则SFCL 频率
                                固定为=系统频率频率/ 2)
                        10b: SFCL 频率 =系统频率频率/ 2
                        11b: SFCL 频率 =系统频率频率/ 4

                安富莱驱动板系统频率为 68MHz

                GT23L32S4W的访问速度:SPI 时钟频率:20MHz(max.)

                因此需要设置 4 分频, 17MHz
        */
        RA8875_WriteReg(0x06, (3 << 0));        /* 设置为文本模式 */

        /* 选择外部字体ROM */
        RA8875_WriteReg(0x21, (0 << 7) | (1 << 5));

        /* 05H  REG[05h] Serial Flash/ROM Configuration Register (SROC)
                7        Serial Flash/ROM I/F # 选择
                                0:选择Serial Flash/ROM 0 接口。
                                1:选择Serial Flash/ROM 1 接口。
                6        Serial Flash/ROM 寻址模式
                                0: 24 位寻址模式。
                                此位必须设为0。
                5        Serial Flash/ROM 波形模式
                                0: 波形模式 0。
                                1: 波形模式 3。
                4-3        Serial Flash /ROM 读取周期 (Read Cycle)
                        00b: 4 bus ?? 无空周期 (No Dummy Cycle)。
                        01b: 5 bus ??1 byte 空周期。
                        1Xb: 6 bus ??2 byte 空周期。
                2        Serial Flash /ROM 存取模式 (Access Mode)
                        0: 字型模式 。
                        1: DMA 模式。
                1-0        Serial Flash /ROM I/F Data Latch 选择模式
                        0Xb: 单一模式。
                        10b: 双倍模式0。
                        11b: 双倍模式1。
        */
        RA8875_WriteReg(0x05, (0 << 7) | (0 << 6) | (1 << 5) | (1 << 3) | (0 << 2) | (0 << 1));

        /*
                设置外部字体芯片型号为 GT23L32S4W, 编码为GB2312,

                Bit1:0 决定ASCII字符的格式:
                        0 = NORMAL                 [笔画细, 和汉字顶部对齐]
                        1 = Arial                 [笔画粗,和汉字底部对齐]
                        2 = Roman                 [笔画细, 和汉字底部对齐]
                        3 = Bold                 [乱码,不可用]
         */
        RA8875_WriteReg(0x2F, (4 << 5) | (0 << 2) | (1 << 0));

       
        LCD_RA8875_REG(0x02);                         /* 用于设定RA8875 进入内存(DDRAM或CGRAM)读取/写入模式 */

        /* 开始循环处理字符 */

        while (*_ptr != 0)
        {
                LCD_RA8875_WRITE_DATA(*_ptr);
                while ((RA8875_ReadStatus() & 0x80) == 0x80);
                LCD_Delay(0xffff);
                _ptr++;
        }
        RA8875_WriteReg(0x40, (0 << 7));        /* 还原为图形模式 */
}

显示汉字的函数
回复 支持 反对

使用道具 举报

发表于 2016-1-7 08:40:37 | 显示全部楼层
把你的文字编码改成“GB2312”

在MDK的“Edit”->"Configuration"->"editor"-"encoding"选项里改
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 09:21:30 | 显示全部楼层
flyleaf 发表于 2016-1-7 08:40
把你的文字编码改成“GB2312”

在MDK的“Edit”->"Configuration"->"editor"-"encoding"选项里改

在工程中找到的“Edit”->"Configuration"->"editor"。没有看见"encoding"选项~~请问是我找错地方了么
QQ截图20160107091847.png
回复 支持 反对

使用道具 举报

发表于 2016-1-7 09:45:33 | 显示全部楼层
装个新点的版本吧,估计你的mdk太旧了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 10:37:04 | 显示全部楼层
flyleaf 发表于 2016-1-7 09:45
装个新点的版本吧,估计你的mdk太旧了

更换了KEIL版本,按图设置,结果还是同样的问题,中文显示错乱
QQ截图20160107103544.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 17:14:58 | 显示全部楼层
我找到问题了。。由于用IO口模拟的,我这个IO口模拟写数据总线的时候WR引脚进行了一次拉低拉高。执行完一次赋值后又进行了一次拉低拉高。RA8875认为我写了两次数据。。所以出错了。。。
回复 支持 反对

使用道具 举报

发表于 2016-1-7 18:03:38 | 显示全部楼层
stillme 发表于 2016-1-7 17:14
我找到问题了。。由于用IO口模拟的,我这个IO口模拟写数据总线的时候WR引脚进行了一次拉低拉高。执行完一次 ...

解决了就好                  
回复 支持 反对

使用道具 举报

发表于 2016-1-15 10:28:37 | 显示全部楼层
stillme 发表于 2016-1-7 17:14
我找到问题了。。由于用IO口模拟的,我这个IO口模拟写数据总线的时候WR引脚进行了一次拉低拉高。执行完一次 ...

你好,能把你驱动与写汉字的代码复制上来看看吗?我也是用IO口模拟的方式,图片、字库中的英文、数字、符号都可以显示,就是不能显示汉字,连乱码都没有。我用的GT21L16T1W。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-14 02:50 , Processed in 0.034115 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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