LCD1602四線編程方法程序設(shè)計(jì)實(shí)例
掃描二維碼
隨時(shí)隨地手機(jī)看文章
第一次調(diào)4線的LCD1602,比較困難,或者因?yàn)檠舆t不對,或者因?yàn)槊铄e(cuò)誤,我足足用了一天時(shí)間,搞定了4線的1602編程實(shí)現(xiàn)。這里提供51單片機(jī)和LPC23XX系列單片機(jī)的程序。51的程序是我上網(wǎng)找的,可以參考里面的實(shí)現(xiàn)步驟,可以直接仿真,但是不知道燒到板子里是否可以。LPC23XX系列單片機(jī)的程序可以直接燒寫板子里運(yùn)行,注意里面的管腳定義,因?yàn)樵趐roteus里沒找到對應(yīng)的芯片,這里不知是否可以仿真。
51程序
#include
sbit LCM_RW=P2^0; //定義引腳
sbit LCM_RS=P2^1;
sbit LCM_E =P2^2;
#define LCM_DataP1
#define Busy 0x80 //用于檢測LCM 狀態(tài)字中的 Busy 標(biāo)識(shí)
void WritEDAtaLCM(unsigned char Data);
void WriteCommandLCM(unsigned char Command);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delayms(unsigned int n);
void dellay(unsigned inth);
unsigned char code blog_adr[] = {"EDNchina"};
unsigned char code email[] = {"tengjingshu@126.com"};
void main(void)
{
//Delay400Ms();//啟動(dòng)等待,等 LCM 講入工作狀態(tài)
LCMInit();//LCM 初始化
DisplayListChar(3, 0, blog_adr);
DisplayListChar(0, 1, email);
while(1);
}
//寫數(shù)據(jù) RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖
void WritEDAtaLCM(unsigned char Data)
{
LCM_RS = 1;
LCM_RW = 0;
LCM_E= 0;
LCM_Data =(Data & 0xF0);
LCM_E= 1;
dellay(100);//短暫延時(shí),代替檢測忙狀態(tài)
LCM_E= 0;
LCM_Data =(Data & 0x0F)<<4;
LCM_E= 1;
dellay(100);
LCM_E= 0;
}
//寫指令RS=L,RW=L,D0~D7=指令碼,E=高脈沖
void WriteCommandLCM(unsigned char Command)
{
dellay(100);//短暫延時(shí),代替檢測忙狀態(tài)
LCM_RS = 0;
LCM_RW = 0;
LCM_E= 0;
LCM_Data =( Command & 0xF0);
LCM_E= 1;
dellay(100);
LCM_E= 0;
LCM_Data =( Command & 0x0F )<<4;
LCM_E= 1;
dellay(100);
LCM_E= 0;
}
//讀數(shù)據(jù) RS=H,RW=H,E=H
//讀狀態(tài) RS=L,RW=H,E=H
//由于不要檢測忙,所以讀數(shù)據(jù)和讀狀態(tài)兩個(gè)函數(shù)省略
void LCMInit(void)//LCM 初始化
{
LCM_Data = 0;
Delayms(15);
WriteCommandLCM(0x03); //三次顯示模式設(shè)置,不檢測忙信號
Delayms(5);
WriteCommandLCM(0x03);
Delayms(5);
WriteCommandLCM(0x03);
Delayms(5);
WriteCommandLCM(0x02);
Delayms(5);
WriteCommandLCM(0x28); //顯示模式設(shè)置,開始要求每次檢測忙信號
WriteCommandLCM(0x06); // 顯示光標(biāo)移動(dòng)設(shè)置
WriteCommandLCM(0x0C);
WriteCommandLCM(0x01);
Delayms(5);
}
//按指定位置顯示一個(gè)字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF;//限制 X 不能大于 15,Y 不能大于 1
if (Y) X |= 0x40;//當(dāng)要顯示第二行時(shí)地址碼+0x40;
X |= 0x80;//算出指令碼
WriteCommandLCM(X);//這里不檢測忙信號,發(fā)送地址碼
WritEDAtaLCM(DData);
}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制 X 不能大于 15,Y 不能大于 1
while (DData[ListLength]>0x1f) //若到達(dá)字串尾則退出
{
if (X <= 0xF) //X 坐標(biāo)應(yīng)小于 0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個(gè)字符
ListLength++; X++;
}
}
}
void Delayms(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
void dellay(unsigned inth)
{
while(h--);//0.01MS
}