#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);
}
試試這個 有用請給好評