欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: [求助]89C52并口12864顯示亂碼 [打印本頁]

作者: lyonkon    時間: 2018-1-5 17:53
標題: [求助]89C52并口12864顯示亂碼
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) { }

}


作者: lxa0    時間: 2018-1-5 19:30
亂碼現象就是讀寫時序不對~~~~~~~
作者: 啦啦啦1234    時間: 2018-1-5 20:37
LCD12864液晶顯示亂碼修復:

這是因為keil軟件的bug,需要補一個補丁。
補丁已經放在附件里
解壓后復制里面的ccKeilVxx.exe 文件到
Keil安裝目錄的 keil\C51\BIN 路徑下
然后雙擊打開ccKeilVxx.exe,點start

如果以上還是無法解決那就是硬件問題了

keil補丁.rar

10.48 KB, 下載次數: 14


作者: lyonkon    時間: 2018-1-5 21:53
我按照樓上2位的思路來調整一下,




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