很多朋友在制作各種電子設備時不會使用如LCD1602、LCD12864、LCD2004等液晶屏,LCD1602和LCD12864本文不再介紹,因為我前面發過各種貼子大家可以參照,這里只講一
下LCD2004的顯示,我會以通俗到不能再通俗的方法來教大家使用LCD2004這個液晶屏。我們拿到一個LCD液晶屏,首先要有它的顯示地址列表,其次它會有官方的參考程序,以上
這兩個是必需的。
LCD2004顯示地址定義表.jpg (31.89 KB, 下載次數: 66)
下載附件
2023-3-22 10:43 上傳
這里是一個LCD2004顯示地址定義列表,意思就是在這個屏上每個字符顯示的地址位置。
這個列表的作用很簡單,就是告訴你LCD2004液晶屏(每行顯示20個字符,共四行)共顯示
四行內容,每行每個字符的顯示位置,另外就是要把它官方的參考程序部分有些東西復制下來,
具體做法:
1.新建一個LCD2004TEST.H文件
2.把它官方的參考程序中LCD2004 寫數據、寫指令、忙檢測三部分復制到你新建的
LCD2004TEST文件中
//**************************************************************
//【LCD2004寫數據】
//**************************************************************
void Wr_Data(uchar wr_data)
{
Rd_Status();
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 1;
LCM_Data = wr_data;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時
DelayMs(15);
}
//**************************************************************
//【LCD2004寫指令】
//**************************************************************
void Wr_Command(uchar wr_command)
{
Rd_Status();
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 1;
LCM_Data = wr_command;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時
DelayMs(15);
}
//**************************************************************
//【LCD2004忙檢測】
//**************************************************************
void Rd_Status(void)
{while(1)
{
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_Data = 0xFF;
LCM_E = 1;
if((LCM_Data & BUSY)==0)
break;
}
}
以上三個函數一定要用官網的,這樣可以避免很多麻煩,因為官方的測試程序至少不需
要調試,直接可以正常顯示,然后需要自己寫一個向LCD2004寫字符串的函數,具體如下:
//**************************************************************
//【向LCD發送一個字符串】
//**************************************************************
void LCDSendWord(u8 *p)
{
while(*p>0) //比如void LCDSendWord('HALOO');就是讓LCD顯示"HALOO"
{
Wr_Data(*p);
p++;
}
}
上面這個顯示字符串的程序是經很多程序驗證過的,可以靈活應用在LCD1602、LCD2004、
LCD12864、LCD19264等液晶屏中用來顯示一串字符或漢字,當然用在LCD2004中只能用來顯
示字符,就是發送漢字它也顯示不出來。另外這段函數不限顯示字符個數,只要屏裝的下你只
管在LCDSendWord('HALOO')里面寫就行了,這段函數還有一個好處就是不用管除了你要顯示的字
符外,前后空余部分,有些函數除了要顯示的文字內容外,還要把沒顯示的部分用空格占掉,
不然會顯示亂碼,這段函數不會。
最后再自己寫一段函數,具體如下:
//**************************************************************
//【LCD2004寫指令或者寫數據】
//**************************************************************
void LCDTestWord(bit i,u8 word)
{
if(i==0)
{
Wr_Command(word); //i=0;則寫入指令
}
else
{
Wr_Data(word); //i=1;則寫入數據
}
}
這段函數的意思很明顯,在C文件中用到LCD2004TEST.H這個文件的時候,你可以
寫一行代碼就可以寫指令或寫數據,區分指令還是數據只要用括號內的0和1就行了。比
如像下面這樣的寫法
LCDTestWord(0,0xc0); //在第二行第一個位置顯示
這行代碼的意思就是向LCD2004寫指令,后面的0xc0就是說在LCD2004的第二
行第一個位置開始顯示
LCDTestWord(1,(mon/16)+0x30); //月份十位顯示
這行代碼的意思就是向LCD2004寫數據,把月十位的數據送到LCD2004去顯示。
最后我們要做的就是把LCD2004TEST.H這個文件補齊,意思就是把前面的宏定義搞一下,
這個就算是新手應該都會,具體如下:
#include <STC12C5A60S2.h> //載入相應單片機頭文件,防止程序出現意外錯誤
#include <hong.h> //載入宏定義文件,此文件中定義了延時函數等需要全局調用的函數
//**************************************************************
//【LCD2004引腳和宏定義】
//**************************************************************
sbit LCM_RS = P2^6 ;
sbit LCM_RW = P2^5 ;
sbit LCM_E = P2^7;
#define LCM_Data P0
#define BUSY 0x80 //用于檢測 LCM 狀態字中的 Busy 標
//以上是LCD相關引腳和宏定義
//**************************************************************
//**************************************************************
void Wr_Data(u8 wr_data); //寫數據
void Wr_Command(u8 wr_command); //寫指令
void Rd_Status(void); //讀忙
void LCDInit(void); //初始化
void LCDSendWord(u8 *p); //向LCD發送一個字符串
void LCDTestWord(bit i,u8 word); //LCD2004寫指令或者寫數據
void LCDInit(void); //LCD2004初始化
void LCDClear(void); //LCD2004清屏
//**************************************************************
至此,一個完整的LCD2004TEST.H文件就完成了。
制作出來的實物圖如下:
LCD2004.jpg (250.67 KB, 下載次數: 69)
下載附件
2023-3-22 12:19 上傳
這個是實際顯示效果,
在C文件MAIN函數中只要調用一下LCD2004的初始化函數和清屏函數就可以顯示了
Keil代碼下載:
LCD2004TEST.zip
(181.84 KB, 下載次數: 35)
2023-3-22 11:39 上傳
點擊文件名下載附件
LCD2004顯示程序 下載積分: 黑幣 -5
這里附上程序,大家自行下載,程序中有兩個警告,大家可以不必理會,是有兩個函數暫時沒用到,以后要用的。
|