標(biāo)題: [求助]89C52并口12864顯示亂碼 [打印本頁(yè)]

作者: lyonkon    時(shí)間: 2018-1-5 17:53
標(biāo)題: [求助]89C52并口12864顯示亂碼
12864B--2.0   帶字庫(kù)  7920
DBO--DB7 接 85c52  P2.0--P2.7    V0接5v。
RS接P1.2    RW接P1.3   EN接P1.4   PSB接+電源   rst接+電源,.電源電壓5V,代碼我看不懂只是改了一下管腳,F(xiàn)在顯示亂碼,
因?yàn)槭浅鯇W(xué)者,想試12864好壞,然后再學(xué)程序,試了10幾天了,燒很多代碼進(jìn)去都是亂碼。
在此請(qǐng)各位朋友,幫我斷一下原因。或者發(fā)一個(gè)簡(jiǎn)單代碼,我試一下機(jī)。
用本論壇大神的代碼,
代碼是抄的如下:
#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          //并行的使能信號(hào)        sbit E   = P0^7

#define RW   3          //并行的讀寫信號(hào)         sbit RW = P0^6

#define RS   2         //并行的指令數(shù)據(jù)選擇信號(hào) sbit RS = P0^5  

#define PSB 5         //并/串行接口選擇         sbit PSB = P0^4

#define RST 6         //復(fù)位 低電平有效         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))
/********************測(cè)忙碌**********************/

//測(cè)忙碌子程序

//RS=0,RW=1,E=H,D0-D7=狀態(tài)字

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

void chek_busy(void)

{ unsigned char temp1;//狀態(tài)信息(判斷是否忙)

   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;

}

/********************寫數(shù)據(jù)**********************/

//寫數(shù)據(jù)子程序

//

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

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;

}

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

//復(fù)位、通訊方式選擇

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

void lcd_init(void)

{

    SETB(CONTROL,RST);//復(fù)位RST=1

    SETB(CONTROL,PSB);       //通訊方式為并口PSB = 1

      //send_com(0x34);//34H--擴(kuò)充指令操作

send_com(0x30);//功能設(shè)置,一次送8位數(shù)據(jù),基本指令集

send_com(0x0C);//0000,1100 整體顯示,游標(biāo)off,游標(biāo)位置off

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

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

send_com(0x80);//1000,0000 設(shè)定DDRAM 7位地址000,0000到地址計(jì)數(shù)器AC

}



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

//          設(shè)置顯示位置    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已轉(zhuǎn)換為L(zhǎng)CM的顯示寄存器實(shí)際地址

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

     {

      send_data(str[n]);//顯示漢字時(shí)注意碼值,連續(xù)兩個(gè)碼表示一個(gè)漢字

      }

   }



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

//清屏

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

void clr_lcd(void)

{

   send_com(0x01);

   //send_com(0x34);

   //send_com(0x30);

}



/**************主函數(shù)***********************/

void main ()

{

lcd_init();     //設(shè)定液晶工作方式

printstr(1,1,buf,4);

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

print(0,3," SEEGU起飛空間");//  起飛  兩字是我剛剛發(fā)帖時(shí)改過(guò)的

while(1) { }

}


作者: lxa0    時(shí)間: 2018-1-5 19:30
亂碼現(xiàn)象就是讀寫時(shí)序不對(duì)~~~~~~~
作者: 啦啦啦1234    時(shí)間: 2018-1-5 20:37
LCD12864液晶顯示亂碼修復(fù):

這是因?yàn)?/font>keil軟件的bug,需要補(bǔ)一個(gè)補(bǔ)丁。
補(bǔ)丁已經(jīng)放在附件里
解壓后復(fù)制里面的ccKeilVxx.exe 文件到
Keil安裝目錄的 keil\C51\BIN 路徑下
然后雙擊打開ccKeilVxx.exe,點(diǎn)start

如果以上還是無(wú)法解決那就是硬件問(wèn)題了

keil補(bǔ)丁.rar

10.48 KB, 下載次數(shù): 14


作者: lyonkon    時(shí)間: 2018-1-5 21:53
我按照樓上2位的思路來(lái)調(diào)整一下,




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1