找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2574|回复: 7
收起左侧

疑问:网上的单片机12864显示汉字程序为什么显示是从右到左?

[复制链接]
ID:192847 发表于 2019-7-6 15:35 | 显示全部楼层 |阅读模式
主程序调用部分:
Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");

这个显示程序其实我能大概理解,但是对于显示顺序却不理解,
1.为什么是从右到左呢?
2.如果是LCD镜像显示所以导致从右到左,但是这个程序是向对应的页以及列数地址去写数据,这也有点说不通

希望各位帮帮我,有时并不需要太多的解释,一两句金言便能解开困扰小弟许久的问题,多谢大家

先上程序:
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
{
        uchar j, x1, x2, wordNum;

        //--Y的坐标只能从0到7,大于则直接返回--//
        if(y > 7)
        {
                return 0;
        }

        //--X的坐标只能从0到128,大于则直接返回--//
        if(x > 128)
        {
                return 0;
        }
        y += 0xB0;           //求取Y坐标的值
        //--设置Y坐标--//
        LcdSt7565_WriteCmd(y);
        while ( *cn != '\0')         //在C语言中字符串结束以‘\0’结尾
        {        
        
                //--设置Y坐标--//
                LcdSt7565_WriteCmd(y);

                x1 = (x >> 4) & 0x0F;   //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
                x2 = x & 0x0F;          //去低四位
                //--设置X坐标--//
                LcdSt7565_WriteCmd(0x10 + x1);   //高4位
                LcdSt7565_WriteCmd(0x04 + x2);        //低4位

                for (wordNum=0; wordNum<50; wordNum++)
                {
                    //--查询要写的字在字库中的位置--//
                        if ((CN16CHAR[wordNum].Index[0] == *cn)
                             &&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
                        {
                                for (j=0; j<32; j++) //写一个字
                                {               
                                        if (j == 16)         //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
                                        {
                                                //--设置Y坐标--//
                                                   LcdSt7565_WriteCmd(y + 1);
                        
                                                //--设置X坐标--//
                                                LcdSt7565_WriteCmd(0x10 + x1);   //高4位
                                                LcdSt7565_WriteCmd(0x04 + x2);        //低4位
                                        }
                                        LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
                                }
                                x += 16;
                        }//if查到字结束               
                } //for查字结束        
                cn += 2;
        }        //while结束
        return 1;
}

回复

使用道具 举报

ID:192847 发表于 2019-7-6 16:59 | 显示全部楼层
懂了,是字模和屏幕的排列问题
回复

使用道具 举报

ID:579064 发表于 2019-7-6 18:12 | 显示全部楼层
这个好像跟st7565驱动中的行列扫描的方向设置有关
回复

使用道具 举报

ID:192847 发表于 2019-7-8 08:38 | 显示全部楼层
不同驱动IC对字模的扫描是不同的,UC1701X和ST7565有略微的差别
回复

使用道具 举报

ID:488962 发表于 2019-7-18 12:25 | 显示全部楼层
普中的开发板子不错。  但提供的程序代码写得很一般, 还有不少错误的注释。
  

那个代码的字模确实是反的。 但是不改字模,改代码也可以反回来的:
1. st7565.c ->  void Lcd12864_Init() ->  LcdSt7565_WriteCmd(0xA1)  :  0xA1改成0xA0  变成从左到右
2. st7565.c -> uchar Lcd12864_Write16CnCHAR(  ->  LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]) :  Msk[j]改成Msk[j<16?15-j:47-j]  让字模左右对调
3.  调用时, "司公限有技科中普" 就不用反过来了。


测试发现,显示过快过多的文字可以会乱码。 只能添加一些delay。  具体原因未知。


另:最顶上的一排图标也是可以操作显示的,只要把y坐标移到8,x坐标0~127一个个坐标发数据过去就可以试出来了,发送0清除,发送0xff显示

回复

使用道具 举报

ID:488962 发表于 2019-7-19 02:24 | 显示全部楼层
你用的开发板是em3 v3, 还是v2.2   的?
回复

使用道具 举报

ID:401564 发表于 2019-7-19 08:32 | 显示全部楼层
这个程序严格上来说是用没有汉字字库的12864来显示汉字
实际上就是用X轴Y轴来扫描显示一个完整的汉字,每8个点对应一个8位的地址空间,你看数据手册就知道了
那地址和二进制数都是从右向左按低位到高位排列的,那么显示也是这么显示了,不只是st7565,其它的驱动IC都是这么排列的了
回复

使用道具 举报

ID:688062 发表于 2020-2-23 16:22 | 显示全部楼层
看看显示屏的数据手册,是不是初始化设置不太对,也可以修改显示函数解决问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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