找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1835|回复: 3
打印 上一主题 下一主题
收起左侧

[求助]89C52并口12864显示乱码

[复制链接]
跳转到指定楼层
楼主
ID:73992 发表于 2018-1-5 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
12864B--2.0   带字库  7920
DBO--DB7 接 85c52  P2.0--P2.7    V0接5v。
RS接P1.2    RW接P1.3   EN接P1.4   PSB接+电源   rst接+电源,.电源电压5V,代码我看不懂只是改了一下管脚。现在显示乱码,
因为是初学者,想试12864好坏,然后再学程序,试了10几天了,烧很多代码进去都是乱码。
在此请各位朋友,帮我断一下原因。或者发一个简单代码,我试一下机。
用本论坛大神的代码,
代码是抄的如下:
#include<reg52.h>

#include <math.h>

void lcd_init(void);

void clr_lcd(void);

void send_com(unsigned char cmd);

void send_data(unsigned char dat);

void chek_busy(void);

void set_xy(unsigned char xpos,unsigned char ypos);

void print(unsigned char x,unsigned char y,char* str);

void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);



unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎
#define DATA       P2

#define CONTROL P1

#define E    4          //并行的使能信号        sbit E   = P0^7

#define RW   3          //并行的读写信号         sbit RW = P0^6

#define RS   2         //并行的指令数据选择信号 sbit RS = P0^5  

#define PSB 5         //并/串行接口选择         sbit PSB = P0^4

#define RST 6         //复位 低电平有效         sbit RST = P0^3

#define SETB(x,y) (x|=(1<<y))

#define CLRB(x,y) (x&=(~(1<<y)))

#define CHKB(x,y) (x&(1<<y))
/********************测忙碌**********************/

//测忙碌子程序

//RS=0,RW=1,E=H,D0-D7=状态字

/************************************************/

void chek_busy(void)

{ unsigned char temp1;//状态信息(判断是否忙)

   CLRB(CONTROL,RS);    // RS = 0;

   SETB(CONTROL,RW);    // RW = 1;

   SETB(CONTROL,E);    // E = 1;

   do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);

   SETB(CONTROL,E);   // E = 1;

   DATA=0xFF;

}

/********************写命令**********************/

//写命令子程序

//

/************************************************/

void send_com(unsigned char cmd)/*写命令*/

{

chek_busy();

CLRB(CONTROL,RS); //RS = 0;

CLRB(CONTROL,RW); //RW = 0;

DATA = cmd;

SETB(CONTROL,E); //E = 1;

CLRB(CONTROL,E); //E = 0;

}

/********************写数据**********************/

//写数据子程序

//

/************************************************/

void send_data(unsigned char dat)

{

chek_busy();

SETB(CONTROL,RS); //RS = 1;

CLRB(CONTROL,RW); //RW = 0;

DATA = dat;

SETB(CONTROL,E); //E = 1;

CLRB(CONTROL,E); //E = 0;

}

/********************初始化**********************/

//复位、通讯方式选择

/************************************************/

void lcd_init(void)

{

    SETB(CONTROL,RST);//复位RST=1

    SETB(CONTROL,PSB);       //通讯方式为并口PSB = 1

      //send_com(0x34);//34H--扩充指令操作

send_com(0x30);//功能设置,一次送8位数据,基本指令集

send_com(0x0C);//0000,1100 整体显示,游标off,游标位置off

send_com(0x01);//0000,0001 清DDRAM

send_com(0x02);//0000,0010 DDRAM地址归位

send_com(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC

}



/*******************************************************************/

//          设置显示位置    xpos(1~16),tpos(1~4)

/*******************************************************************/

void set_xy(unsigned char xpos,unsigned char ypos)

{

switch(ypos)

{

   case 1:

    send_com(0X80|xpos);break;

   case 2:

    send_com(0X90|xpos);break;

   case 3:

    send_com(0X88|xpos);break;

   case 4:

    send_com(0X98|xpos);break;

   default:break;

}

}

/*******************************************************************/

//          在指定位置显示字符串

/*******************************************************************/

void print(unsigned char x,unsigned char y,char* str)

{

    unsigned char lcd_temp;

    set_xy(x,y);

    lcd_temp=*str;

    while(lcd_temp != 0x00)

    {

        send_data(lcd_temp);

        lcd_temp=*(++str);

    }

}



/********************写字符串******************/

//写字符串子程序

//xpos1取0~7共八列,ypos1取0~3共四行。

/**********************************************/

    void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)

{ unsigned char n;

     switch (ypos)

    { case 1: xpos |= 0x80;break;         //第一行

      case 2: xpos |= 0x90;break;         //第二行

      case 3: xpos |= 0x88;break;         //第三行

      case 4: xpos |= 0x98;break;         //第四行

      default: break;

     }

      send_com(xpos);                                    //此处的Xpos已转换为LCM的显示寄存器实际地址

      for(n=0;n < k;n++)

     {

      send_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字

      }

   }



/********************清屏************************/

//清屏

/************************************************/

void clr_lcd(void)

{

   send_com(0x01);

   //send_com(0x34);

   //send_com(0x30);

}



/**************主函数***********************/

void main ()

{

lcd_init();     //设定液晶工作方式

printstr(1,1,buf,4);

print(5,1,"光临");

print(0,3," SEEGU起飞空间");//  起飞  两字是我刚刚发帖时改过的

while(1) { }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:74784 发表于 2018-1-5 19:30 | 只看该作者
乱码现象就是读写时序不对~~~~~~~
回复

使用道具 举报

板凳
ID:108715 发表于 2018-1-5 20:37 | 只看该作者
LCD12864液晶显示乱码修复:

这是因为keil软件的bug,需要补一个补丁。
补丁已经放在附件里
解压后复制里面的ccKeilVxx.exe 文件到
Keil安装目录的 keil\C51\BIN 路径下
然后双击打开ccKeilVxx.exe,点start

如果以上还是无法解决那就是硬件问题了

keil补丁.rar

10.48 KB, 下载次数: 14

回复

使用道具 举报

地板
ID:73992 发表于 2018-1-5 21:53 | 只看该作者
我按照楼上2位的思路来调整一下,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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