发 帖  
张飞软硬开源基于STM32 BLDC直流无刷电机驱动器开发视频套件, 👉戳此立抢👈
[问答] LCD14432液晶屏用arduino驱动显示汉字乱码
642 液晶屏 Arduino
分享
最近用到LCD14432液晶屏,通过arduino驱动显示汉字都是乱码,但是能正常显示数字和字母符号等,一直没找到解决办法,希望已经解决了该问题的大牛帮忙提供解决方案,谢谢!知道是编码出现了问题,但是不知道怎么解决。
0
已退回5积分
2018-11-14 17:53:41   评论 分享淘帖 邀请回答
6个回答
2018-11-14 18:21:35 1 评论

举报

1 条评论
  • 2018-11-15 14:19

    void displayLiquidCrystal_I2C(uint8_t pinscl, uint8_t pinsda, char* value, uint8_t new_val){                        //小黑马调用,显示字符        
            LiquidCrystal_I2C display(0x27,16,2,pinscl, pinsda);
            display.init();
            //delay(100);
            display.setCursor(0x83, 0);
            display.printstr("xhmBlock");
            display.setCursor(0x93, 0);
            // char utech[] = {value[] + 32};
             char utech[] = {0xBA,0xC3,0xB1,0xA0,0xC1,0XFA,0XBA,0XA3};
            uint8_t i=0;
            if((strlen(value)>18))
            {
                    display.setCursor(0x92, 1);
                    display.printstr("ERROR ABC!");                //如果输入值大于999999显示错误提示:ERROR ABC !
            }
            else
            {
                    //display.setCursor(0x90+(18-strlen(value))/4, 1);
                    for(;i<sizeof(utech);i++)
           // display.print(value);
                    //for(;i<18;i++)
                    {
                            //display.write(utech);
                            //display.print(value[i*2+1]);
                            display.write(value);
                            //display.write(value[i*2+1]);
                    }
        }
            delay(800);
            display.clear();
    }
    我这里用write输出到LCD,就是如果write的参数直接输出 utech这个数组就会正常显示汉字,utech里面存的是汉字的内码,但是如果直接将参数赋值为汉字,显示就是乱码。

具体点   图纸资料 线路板 程序都晒一下再说
2018-11-14 20:34:32 1 评论

举报

1 条评论
  • 2018-11-15 14:19

    void displayLiquidCrystal_I2C(uint8_t pinscl, uint8_t pinsda, char* value, uint8_t new_val){                        //小黑马调用,显示字符        
            LiquidCrystal_I2C display(0x27,16,2,pinscl, pinsda);
            display.init();
            //delay(100);
            display.setCursor(0x83, 0);
            display.printstr("xhmBlock");
            display.setCursor(0x93, 0);
            // char utech[] = {value[] + 32};
             char utech[] = {0xBA,0xC3,0xB1,0xA0,0xC1,0XFA,0XBA,0XA3};
            uint8_t i=0;
            if((strlen(value)>18))
            {
                    display.setCursor(0x92, 1);
                    display.printstr("ERROR ABC!");                //如果输入值大于999999显示错误提示:ERROR ABC !
            }
            else
            {
                    //display.setCursor(0x90+(18-strlen(value))/4, 1);
                    for(;i<sizeof(utech);i++)
           // display.print(value);
                    //for(;i<18;i++)
                    {
                            //display.write(utech);
                            //display.print(value[i*2+1]);
                            display.write(value);
                            //display.write(value[i*2+1]);
                    }
        }
            delay(800);
            display.clear();
    }
    我这里用write输出到LCD,就是如果write的参数直接输出 utech这个数组就会正常显示汉字,utech里面存的是汉字的内码,但是如果直接将参数赋值为汉字,显示就是乱码。

要看你的字库或字模是否正确,汉字取模的方向是否正确,汉字一般都是16点阵的,数字和字母可以是5X7点阵的,大小不一样,显示程序会不一样的
2018-11-15 08:15:56 1 评论

举报

1 条评论
  • 2018-11-15 14:18

    void displayLiquidCrystal_I2C(uint8_t pinscl, uint8_t pinsda, char* value, uint8_t new_val){                        //小黑马调用,显示字符       
            LiquidCrystal_I2C display(0x27,16,2,pinscl, pinsda);
            display.init();
            //delay(100);
            display.setCursor(0x83, 0);
            display.printstr("xhmBlock");
            display.setCursor(0x93, 0);
            // char utech[] = {value[] + 32};
             char utech[] = {0xBA,0xC3,0xB1,0xA0,0xC1,0XFA,0XBA,0XA3};
            uint8_t i=0;
            if((strlen(value)>18))
            {
                    display.setCursor(0x92, 1);
                    display.printstr("ERROR ABC!");                //如果输入值大于999999显示错误提示:ERROR ABC !
            }
            else
            {
                    //display.setCursor(0x90+(18-strlen(value))/4, 1);
                    for(;i<sizeof(utech);i++)
           // display.print(value);
                    //for(;i<18;i++)
                    {
                            //display.write(utech);
                            //display.print(value[i*2+1]);
                            display.write(value);
                            //display.write(value[i*2+1]);
                    }
        }
            delay(800);
            display.clear();
    }
    我这里用write输出到LCD,就是如果write的参数直接输出 utech这个数组就会正常显示汉字,utech里面存的是汉字的内码,但是如果直接将参数赋值为汉字,显示就是乱码。

这个需要看write的函数定义了,在你贴出来的程序里,value是个指针,而utech则是一个数组,所以要看write的函数原型里对输入参数的定义是什么了
2018-11-15 14:45:43 1 评论

举报

1 条评论
  • 2018-11-15 14:56

    size_t LiquidCrystal_I2C::write(uint8_t value) {
            send(value, Rs);
            return 0;
    }
    void LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) {
            uint8_t highnib=value&0xf0;
            uint8_t lownib=(value<<4)&0xf0;
           write4bits((highnib)|mode);
            write4bits((lownib)|mode);
    }
    void LiquidCrystal_I2C::write4bits(uint8_t value) {
            expanderWrite(value);
            pulseEnable(value);
    }

    void LiquidCrystal_I2C::expanderWrite(uint8_t _data){     
            //Wire.beginTransmission(_Addr);
            //printIIC((int)(_data) | _backlightval);
            //Wire.endTransmission();
            //SoftI2CMaster i2c = SoftI2CMaster(sclPin, sdaPin, 0, bitdelay);       

            i2c.beginTransmission(_Addr);
            //printIIC((int)(_data) | _backlightval);
            i2c.write((int)(_data) | _backlightval);
            i2c.endTransmission();   
    }

这个应该是指针作为函数形参如何调用的问题,除了该如何调用write之外,还有如何调用void displayLiquidCrystal_I2C(uint8_t pinscl, uint8_t pinsda, char* value, uint8_t new_val)的问题,对于指针作为形参不太熟,在这段程序了,value是一个指针形参,是对于void displayLiquidCrystal_I2C(uint8_t pinscl, uint8_t pinsda, char* value, uint8_t new_val)来说,而write的形参是一个数值类的,并不是指针,所以问题可能出在调用void displayLiquidCrystal_I2C(uint8_t pinscl, uint8_t pinsda, char* value, uint8_t new_val)时所输入的参数上。
另外,不知道你的汉字显示是多大的,utech是一个8字节的数组,显示英文和数字可以,但是一般汉字都是16x16的,是32字节,所以可以看看是否是这里的问题。
最好能有正确显示和错误显示的图片
2018-11-15 15:55:49 3 评论

举报

3 条评论
  • 2018-11-22 10:00

    就是当我直接把发送的数组的值换成汉字也是一样的,我说的乱码其实就是字是错的,不是乱七八糟的那种。假设我现在想显示“你”,然而显示的是“浣”;想显示“好”,然而显示的是“濂”。好像就是编码错位了。

    人中狼 回复 997925763: 2018-11-22 10:39

    那就是要看你的字库如何排列了,如果是标准字库,就要看你带入的地址对不对了,既然能正确显示出汉字,那么显示汉字不对就是计算地址的问题了,查相关的代码吧

    997925763 回复 人中狼: 2018-11-22 17:18

    谢谢,我自己解决了,原来是编辑器的编码模式选错了,应该选的是ANSI编码。

2018-11-17 15:27:40 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

我要提问
课程
    关闭

    站长推荐 上一条 /8 下一条

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