微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > lcd12864串行显示文字乱码怎么破?!

lcd12864串行显示文字乱码怎么破?!

时间:10-02 整理:3721RD 点击:

在下最近上网买了块带字库lcd12864,怀抱一颗赤子去学习如何在屏幕显示汉字!谁知道天意弄人,熬了几个夜晚看了12864的中文说明书并成功写出程序,却的到一个乱码的结果,使我久久不得意!百般无奈下,唯有求助江湖大神,望能助我分析程序,寻得乱码缘由,在下定当不胜感激!
{源程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit cs=P1^0;
sbit sid=P1^1;
sbit clk=P1^2;
sbit psb=P1^3;//串行四线,psb=0
sbit bla=P1^4;
sbit blk=P1^5;
/*延迟函数*/
void delay(int a)
{
        int i,j;
        for(i=a;i>0;i--)
        {
                for(j=110;j>0;j--);
        }
}
/*发送命令*/
void send_command(uchar ming);
/*发送数据*/
void send_data(uchar shu);
/*lcd初始化*/
void lcd_init();
uchar a[]="I am shen chang ben ";//能正常显示
/*文字:广石化电气        乱码,如下图*/
uchar code  b[]={0xb9,0xca,0xbb,0xb5,0xc6};//高位
uchar code b1[]={0xe3,0xaf,0xaf,0xe7,0xf8};//低位
int e;
void main()
{
        bla=1;
        blk=0;
        lcd_init();
        delay(400);
        e=0;
        while(a[e]!='\0')
        {
                send_data(a[e]);
                e=e+1;
                delay(50);
        }        
                delay(5000);
        send_command(0x01);
        send_command(0x02);
        lcd_init();
        send_command(0x88);
        delay(50);
        for(e=0;e<4;e++)
        {
         send_command(0x80+e);
                send_data(b[e]);
                send_data(b1[e]);
                delay(500);
        }
        while(1)
        {}
}

void send_command(uchar ming)
{
        uchar i_command;
        int i;
        i_command=0xf8;
        cs=1;
        clk=0;
        for(i=0;i<8;i++)
        {
                        sid=(bit)(i_command & 0x80);
                clk=0;
        
                clk=1;
                i_command=i_command<<1;
        }
        i_command=ming;
        i_command=i_command & 0xf0;
        for(i=0;i<8;i++)
        {
                        sid=(bit)(i_command & 0x80);clk=0;
        
                clk=1;
                i_command=i_command<<1;
        }
        i_command=ming;
        i_command=i_command<<4;
        for(i=0;i<8;i++)
        {
                sid=(bit)(i_command & 0x80);clk=0;
               
                clk=1;
                i_command=i_command<<1;
        }
        cs=0;
        delay(10);
}
void send_data(uchar shu)
{
        uchar i_data;
        int i;
        i_data=0xfa;
        cs=1;
        for(i=0;i<8;i++)
        {
                        sid=(bit)(i_data & 0x80);clk=0;
        
                clk=1;
                i_data=i_data<<1;
        }
        i_data=shu;
        i_data=i_data & 0xf0;
        for(i=0;i<8;i++)
        {
                        sid=(bit)(i_data & 0x80);clk=0;
        
                clk=1;
                i_data=i_data<<1;
        }
        i_data=shu;
        i_data=i_data<<4;
        for(i=0;i<8;i++)
        {
                        sid=(bit)(i_data & 0x80);clk=0;
        
                clk=1;
                i_data=i_data<<1;
        }
        cs=0;delay(10);
}
void lcd_init()
{
        psb=0;
        cs=0;
        clk=0;
        send_command(0x30);
        send_command(0x02);
        send_command(0x01);
        send_command(0x0c);
        send_command(0x80);

}

文字乱码图


.....

大神求教。。

还没解决吗?  很急吗?        

还没有!略急。

住函数很多错误

哪里有错误,我要怎样修改

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num[]="我爱单片机";
sbit RS=P2^5;                 //指令数据选择端
sbit RW=P2^6;                 //读写选择端
sbit E=P2^7;                 //使能端
void delay(uint z)
{
                 uint x,y;
                for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void com(uchar com)                //写指令
{
        RS=0;
        RW=0;
        P0=com;
        delay(5);
        E=1;
        delay(5);
        E=0;                 //数据锁存
}
void dat(uchar dat)                //写数据
{
        RS=1;         //写数据
        RW=0;
        P0=dat;
        delay(5);
        E=1;
        delay(5);
        E=0;
}
void init()
{
        //P1^7=1;
        com(0x30);           //控制字
        delay(5);
        com(0x0f);        //显示开关设置开光标
        delay(5);
        com(0x01);//清屏指令
        delay(5);
//        com(0x0e);
//        delay(5);
}
void disp()
{
        uchar i;
        uchar a=0x10;  //显示第一个符号的位置
        com(0x80);//第一行开始显示
        for(i=0;i<16;i++)          //符号的那整行显示
        {
                dat(a);
                a++;
                delay(2);
        }
}
void disp1()
{
        uchar a=0xce,b=0xb0;
        com(0x98);//第二行显示
        dat(a);
        delay(300);
        dat(b);
        delay(300);
}
void disp2()
{
        uchar i;
        com(0x88);
        for(i=0;i<10;i++)
        {
                dat(num);
                delay(200);
        }
}
void main()
{
         uchar num;
         init();
         disp();
         //com(0x01);
         disp2();
         delay(100);
         disp1();
        /* for(num=0;num<8;num++)
         {
                 com(0x18);
                delay(500);
         }
        */
while(1);        
}

//看你写的好复杂哦,我也刚学写了一个

看帖必回!

乱码其实我理解就是通讯上了,你看看你的延时程序吧,不知道你用的是什么单片机,如果是STC的话,他的延时和AT89是不一样的,很有可能达不到你需要的延时你可以先用并口驱动一下啊,看看怎么样,你先试着显示一个汉字,那样好弄,出了问题也好找。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top