问答

汇集网友智慧,解决技术难题

21ic问答首页 - 如何解决keil5编译但lcd12864显示汉字时乱码?

ar unsigned keil5 编译 LCD12864 单片机

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

dzydybz2024-04-01
这是部分代码:
#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显示就没问题(代码和连线一样,很奇怪找不到解决方法,求求了)
回答 +关注 10
1914人浏览 0人回答问题 分享 举报
0 个回答

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