www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 第一次調(diào)4線的LCD1602,比較困難,或者因?yàn)檠舆t不對,或者因?yàn)槊铄e(cuò)誤,我足足用了一天時(shí)間,搞定了4線的1602編程實(shí)現(xiàn)。這里提供51單片機(jī)和LPC23XX系列單片機(jī)的程序。51的程序是我上網(wǎng)找的,可以參考里

第一次調(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
}


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉