打印

如何解决keil5编译但lcd12864显示汉字时乱码?求求了

[复制链接]
12814|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dzydybz|  楼主 | 2024-4-1 07:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是部分代码:
#include <intrins.h>

#define uchar unsigned char        // 以后unsigned char就可以用uchar代替
#define uint  unsigned int        // 以后unsigned int 就可以用uint 代替

sbit LcdRs_P   = P2^0;                        // 液晶的RS管脚      
sbit LcdRw_P   = P2^1;                        // 液晶的RW管脚
sbit LcdEn_P   = P2^2;                        // 液晶的EN管脚



// 毫秒级的延时函数,time是要延时的毫秒数

void DelayMs(uint time)
{
        uint i,j;
        for(i=0;i<time;i++)
                for(j=0;j<112;j++);
}



// 液晶写命令函数,cmd就是要写入的命令

void LcdWriteCmd(uchar cmd)
{
        LcdRs_P = 0;
        LcdRw_P = 0;
        LcdEn_P = 0;
        P1=cmd;
        DelayMs(2);
        LcdEn_P = 1;   
        DelayMs(2);
        LcdEn_P = 0;       
}



// 液晶写数据函数,dat就是要写入的数据

void LcdWriteData(uchar dat)
{
        LcdRs_P = 1;
        LcdRw_P = 0;
        LcdEn_P = 0;
        P1=dat;
        DelayMs(2);
        LcdEn_P = 1;   
        DelayMs(2);
        LcdEn_P = 0;
}



// 液晶光标定位函数

void LcdGotoXY(uchar line,uchar column)
{
                // 第一行
        if(line==0)        
                LcdWriteCmd(0x80+column);
        // 第二行
        if(line==1)        
                LcdWriteCmd(0x90+column);
        // 第三行
        if(line==3)        
                LcdWriteCmd(0x88+column);
        // 第四行
        if(line==4)        
                LcdWriteCmd(0x98+column);
       
}




// 液晶输出字符串函数

void LcdPrintStr(uchar *str)
{
        while(*str!='\0')
                        LcdWriteData(*str++);
}



// 液晶功能初始化

void LcdInit()
{
        LcdWriteCmd(0x30);        
//        LcdWriteCmd(0x0C);        // 开显示,不显示光标
//        LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
//       
        LcdWriteCmd(0x08);        
        LcdWriteCmd(0x01);      
        LcdWriteCmd(0x06);        
        LcdWriteCmd(0x0c);
       
        LcdWriteCmd(0xff);        // 清屏
       
}

// 开启LCD显示

void LcdOn()   //开显示器,关光标与闪烁
{
        LcdWriteCmd(0x0c);
}

//关闭LCD显示,但DDRAM中内容不丢失,重开后将恢复内容


void LcdOff()  
{
        LcdWriteCmd(0xff);
}


// 液晶显示内容初始化

void LcdShowInit()
{
        LcdGotoXY(0,0);                                                                    // 定位到第0行第0列
        LcdPrintStr("根本显示不了汉字");        // 第0行显示“            ”
        LcdGotoXY(1,0);                                                                    // 定位到第1行第0列
        LcdPrintStr("汉字乱码");        // 第1行显示“ ”
}



/* Main */
void main()
{

        Timer0Init();
                LcdInit();                                                                // 液晶功能初始化       
        LcdShowInit();
        while (1)
        {
                Key_Proc();
                Seg_Proc();
                Led_Proc();
        }
}

在protues显示是这样的:
但是在朋友keil4和protues显示就没问题(代码和连线一样,很奇怪找不到解决方法,求求了)







使用特权

评论回复

相关帖子

沙发
yuanzhoulu| | 2024-4-1 08:45 | 只看该作者
在编辑-配置里面看编码选择的啥,改成这个试试。我也是刚学,折腾一番能正常显示了。

使用特权

评论回复
板凳
天奕| | 2024-4-1 09:15 | 只看该作者
文件本身的编码要改成GB2312,你可以用记事本查看,默认不会是GB2312,你需要另存为改下编码格式

使用特权

评论回复
地板
coody| | 2024-4-1 10:57 | 只看该作者
会不会是0xfd的问题?

使用特权

评论回复
5
dzydybz|  楼主 | 2024-4-1 11:13 | 只看该作者
coody 发表于 2024-4-1 10:57
会不会是0xfd的问题?

s这个我觉得应该不是,因为我看那个字库,oxfd为内码的字都没有

使用特权

评论回复
6
dzydybz|  楼主 | 2024-4-1 11:15 | 只看该作者
coody 发表于 2024-4-1 10:57
会不会是0xfd的问题?

(T^T)

使用特权

评论回复
7
shenxiaolin| | 2024-4-1 11:15 | 只看该作者
没有字库

使用特权

评论回复
8
dzydybz|  楼主 | 2024-4-1 11:16 | 只看该作者
shenxiaolin 发表于 2024-4-1 11:15
没有字库

这个lcd12864不是自己就有吗?麻烦问下是如何安装这个字库?(T^T)

使用特权

评论回复
9
dzydybz|  楼主 | 2024-4-1 12:52 | 只看该作者
yuanzhoulu 发表于 2024-4-1 08:45
在编辑-配置里面看编码选择的啥,改成这个试试。我也是刚学,折腾一番能正常显示了。

...

这样还是不太行  :(

使用特权

评论回复
10
dzydybz|  楼主 | 2024-4-1 12:58 | 只看该作者
天奕 发表于 2024-4-1 09:15
文件本身的编码要改成GB2312,你可以用记事本查看,默认不会是GB2312,你需要另存为改下编码格式 ...

我看现在是UFT—8

使用特权

评论回复
11
dzydybz|  楼主 | 2024-4-1 13:05 | 只看该作者
天奕 发表于 2024-4-1 09:15
文件本身的编码要改成GB2312,你可以用记事本查看,默认不会是GB2312,你需要另存为改下编码格式 ...

我把5种编码都试了还是一样在lcd2864上显示不了 :(

使用特权

评论回复
12
alienmiller| | 2024-4-1 13:18 | 只看该作者
keil4 和 keil5 的编译器有些差别,对比一下朋友的KEIL4 的编译配置,protues的 lcd12864模块版本不同,效果也有区别。

使用特权

评论回复
13
zeshoufx| | 2024-4-1 15:01 | 只看该作者
关键是你的液晶模组带不带中文字库

使用特权

评论回复
14
jark006| | 2024-4-1 16:06 | 只看该作者
这是 keil CX51/C251 特有的BUG,会导致编译时特意遗漏字符串内容里的 0XFD, 0XFE, 0XFF 等内容,特别是GB2312字符集里不少汉字编码就含有以上几个。
这里是 keil官网说明:https://www.keil.com/support/docs/2618.htm

修补方式1:用十六进制编辑软件如 HexEdit 打开 c51.exe,搜索 80FBFD,改为 80FBFF。
修补方式2:使用该附件打补丁,实际原理同上。
keilC51修补0xfd.zip (10.87 KB)

使用特权

评论回复
15
jark006| | 2024-4-1 16:09 | 只看该作者
jark006 发表于 2024-4-1 16:06
这是 keil CX51/C251 特有的BUG,会导致编译时特意遗漏字符串内容里的 0XFD, 0XFE, 0XFF 等内容,特别是GB2 ...

严格来说,也不算BUG,是keilC51编译器对ANSI字符集的某些标准支持和GB2313字符集冲突了,编译器选择了前者

使用特权

评论回复
16
dzydybz|  楼主 | 2024-4-1 17:46 | 只看该作者
jark006 发表于 2024-4-1 16:06
这是 keil CX51/C251 特有的BUG,会导致编译时特意遗漏字符串内容里的 0XFD, 0XFE, 0XFF 等内容,特别是GB2 ...

这样还是不行:(

使用特权

评论回复
17
gx_huang| | 2024-4-1 21:37 | 只看该作者
我的keil是改为GB2312简体字库了,有些源文件,在keil下可以看汉字注释,但是记事本打开显示乱码,是怎么回事?

使用特权

评论回复
18
dzydybz|  楼主 | 2024-4-1 22:52 | 只看该作者
最后自己纠结了两天,试了试各种方法,都不可以。:(  
还是卸载了keil5,改成了keil4,一切都没问题了

使用特权

评论回复
19
英雄本色2022| | 2024-4-1 23:03 | 只看该作者
gx_huang 发表于 2024-4-1 21:37
我的keil是改为GB2312简体字库了,有些源文件,在keil下可以看汉字注释,但是记事本打开显示乱码,是怎么回 ...

你用的WIN11吧,WIN11的记事本自动检测编码好像有点问题,检测不准确,需要手动设置编码为ANSI

使用特权

评论回复
20
英雄本色2022| | 2024-4-1 23:08 | 只看该作者
KEIL4可以,KEIL5不可以,估计还是编码问题,用Notepad++软件把所有源程序都转成GB2312编码,然后把KEIL5的编码也设为GB2312,重新编译试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

20

帖子

1

粉丝