古詩詞大全網 - 成語解釋 - LCD1602液晶顯示出現亂碼,求高手解惑!急!!!謝謝

LCD1602液晶顯示出現亂碼,求高手解惑!急!!!謝謝

妳把跟lcd數據連接的壹些外設都去掉 程序的話

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

//這三個引腳參考資料

sbit LCD1602_EN=P2^7; //1602使能引腳

sbit LCD1602_RW=P2^6; //1602讀寫引腳

sbit LCD1602_RS=P2^5; //1602數據/命令選擇引腳

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

* 名稱 : LCD1602_delay()

* 功能 : 延時,延時時間大概為5US。

* 輸入 : 無

* 輸出 : 無

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

void LCD1602_delay()

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

void LCD1602_Delay(uint i)

{

uint x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++);

}

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

* 名稱 : bit Busy(void)

* 功能 : 這個是壹個讀狀態函數,讀出函數是否處在忙狀態

* 輸入 : 輸入的命令值

* 輸出 : 無

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

bit Busy(void)

{

bit busy_flag = 0;

LCD1602_RS = 0;

LCD1602_RW = 1;

LCD1602_EN = 1;

LCD1602_delay();

busy_flag = (bit)(P0 & 0x80);

LCD1602_EN = 0;

return busy_flag;

}

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

* 名稱 : LCD1602_wcmd(uchar del)

* 功能 : 1602命令函數

* 輸入 : 輸入的命令值

* 輸出 : 無

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

void LCD1602_wcmd(uchar del)

{

while(Busy());

LCD1602_RS = 0;

LCD1602_RW = 0;

LCD1602_EN = 0;

LCD1602_delay();

P0 = del;

LCD1602_delay();

LCD1602_EN = 1;

LCD1602_delay();

LCD1602_EN = 0;

}

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

* 名稱 : LCD1602_wdata(uchar del)

* 功能 : 1602寫數據函數

* 輸入 : 需要寫入1602的數據

* 輸出 : 無

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

void LCD1602_wdata(uchar del)

{

while(Busy());

LCD1602_RS = 1;

LCD1602_RW = 0;

LCD1602_EN = 0;

LCD1602_delay();

P0 = del;

LCD1602_delay();

LCD1602_EN = 1;

LCD1602_delay();

LCD1602_EN = 0;

}

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

* 名稱 : L1602_init()

* 功能 : 1602初始化,請參考1602的資料

* 輸入 : 無

* 輸出 : 無

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

void LCD1602_init(void)

{

LCD1602_wcmd(0x38);//設置16X2顯示

LCD1602_wcmd(0x08);//關顯示

LCD1602_wcmd(0x0c);//開顯示

LCD1602_wcmd(0x0e);//開顯示顯示光標

LCD1602_wcmd(0x0f);//開顯示顯示光標光標閃爍

LCD1602_wcmd(0x06);//寫入指針加壹

LCD1602_wcmd(0x04);//寫入指針減壹

// LCD1602_wcmd(0x07);//寫入整屏左移

// LCD1602_wcmd(0x05);//寫入整屏右移

LCD1602_wcmd(0x01);//清屏

//LCD1602_wcmd(0x80+0X10);

}

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

* 名稱 : LCD1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改變液晶中某位的值,如果要讓第壹行,第五個字符顯示"b" ,調用該函數如下

L1602_char(1,5,'b')

* 輸入 : 行,列,需要輸入1602的數據

* 輸出 : 無

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

void LCD1602_char(uchar hang,uchar lie,char sign)

{

uchar a;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + lie - 1;

LCD1602_wcmd(a);

LCD1602_wdata(sign);

}

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

* 名稱 : LCD1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改變液晶中某位的值,如果要讓第壹行,第五個字符開始顯示"ab cd ef" ,調用該函數如下

L1602_string(1,5,"ab cd ef;")

* 輸入 : 行,列,需要輸入1602的數據

* 輸出 : 無

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

void LCD1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a,b=0;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + lie - 1;

while(1)

{

LCD1602_wcmd(a++);

if((*p == '\0')||(b==16)) break;

b++;

LCD1602_wdata(*p);

p++;

}

}

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

* 名稱 : Main()

* 功能 : 主函數

* 輸入 : 無

* 輸出 : 無

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

void Main()

{

LCD1602_Delay(30);

LCD1602_init();

LCD1602_string(1,1," Welcome To ");

LCD1602_string(2,1," The MCU World ");

LCD1602_char(1,1,'*');

LCD1602_char(1,16,'*');

while(1);

}

試試這個 有用請給好評