Created
November 11, 2017 08:38
-
-
Save hkstemclub/3ace659dec93b11eefe722319ffa3100 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
程序在開始時對液晶模塊功能進行了初始化設置,約定了顯示格式。注意顯示字符時光標是自動右移的,無需人工干預,每次輸入指令都先調用判斷液晶模塊是否忙的子程序DELAY,然後輸入顯示位置的地址0C0H,最後輸入要顯示的字符A的代碼41H 。 | |
SMC1602A(16*2)模擬口線接線方式 | |
連接線圖: | |
————————————————– – | |
|LCM—–51 | LCM—–51 | LCM——51 | | |
————————————————| | |
|DB0—–P1.0 | DB4—–P1.4 | RW——-P2.0 | | |
|DB1—–P1.1 | DB5—–P1.5 | RS——-P2.1 | | |
|DB2—–P1.2 | DB6—–P1.6 | E——–P2.2 | | |
|DB3—–P1.3 | DB7—–P1.7 | VLCD接1K電阻到GND| | |
————————————————– – | |
[注:AT89S52使用12M晶振] | |
================================================== ===========*/ | |
#define LCM_RW P2_0 //定義引腳 | |
#define LCM_RS P2_1 | |
#define LCM_E P2_2 | |
#define LCM_Data P1 | |
#define Busy 0x80 //用於檢測LCM狀態字中的Busy標識 | |
#include | |
void WriteDataLCM(unsigned char WDLCM); | |
void WriteCommandLCM(unsigned char WCLCM,BuysC); | |
unsigned char ReadDataLCM(void); | |
unsigned char ReadStatusLCM(void); | |
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 Delay5Ms(void); | |
void Delay400Ms(void); | |
unsigned char code uctech[] = {「uctech」}; | |
unsigned char code net[] = {「uctech.icpcn.com「}; | |
void main(void) | |
{ | |
Delay400Ms(); //啟動等待,等LCM講入工作狀態 | |
LCMInit(); //LCM初始化 | |
Delay5Ms(); //延時片刻(可不要) | |
DisplayListChar(0, 5, uctech); | |
DisplayListChar(0, 0, net); | |
ReadDataLCM();//測試用句無意義 | |
while(1); | |
} | |
//寫數據 | |
void WriteDataLCM(unsigned char WDLCM) | |
{ | |
ReadStatusLCM(); //檢測忙 | |
LCM_Data = WDLCM; | |
LCM_RS = 1; | |
LCM_RW = 0; | |
LCM_E = 0; //若晶振速度太高可以在這後加小的延時 | |
LCM_E = 0; //延時 | |
LCM_E = 1; | |
} | |
//寫指令 | |
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測 | |
{ | |
if (BuysC) ReadStatusLCM(); //根據需要檢測忙 | |
LCM_Data = WCLCM; | |
LCM_RS = 0; | |
LCM_RW = 0; | |
LCM_E = 0; | |
LCM_E = 0; | |
LCM_E = 1; | |
} | |
//讀數據 | |
unsigned char ReadDataLCM(void) | |
{ | |
LCM_RS = 1; | |
LCM_RW = 1; | |
LCM_E = 0; | |
LCM_E = 0; | |
LCM_E = 1; | |
return(LCM_Data); | |
} | |
//讀狀態 | |
unsigned char ReadStatusLCM(void) | |
{ | |
LCM_Data = 0xFF; | |
LCM_RS = 0; | |
LCM_RW = 1; | |
LCM_E = 0; | |
LCM_E = 0; | |
LCM_E = 1; | |
while (LCM_Data & Busy); //檢測忙信號 | |
return(LCM_Data); | |
} | |
void LCMInit(void) //LCM初始化 | |
{ | |
LCM_Data = 0; | |
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號 | |
Delay5Ms(); | |
WriteCommandLCM(0x38,0); | |
Delay5Ms(); | |
WriteCommandLCM(0x38,0); | |
Delay5Ms(); | |
WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號 | |
WriteCommandLCM(0x08,1); //關閉顯示 | |
WriteCommandLCM(0x01,1); //顯示清屏 | |
WriteCommandLCM(0x06,1); // 顯示光標移動設置 | |
WriteCommandLCM(0x0C,1); // 顯示開及光標設置 | |
} | |
//按指定位置顯示一個字符 | |
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) | |
{ | |
Y &= 0x1; | |
X &= 0xF; //限制X不能大於15,Y不能大於1 | |
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40; | |
X |= 0x80; // 算出指令碼 | |
WriteCommandLCM(X, 0); //這裡不檢測忙信號,發送地址碼 | |
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]>0x20) //若到達字串尾則退出 | |
{ | |
if (X <= 0xF) //X坐標應小於0xF | |
{ | |
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符 | |
ListLength++; | |
X++; | |
} | |
} | |
} | |
//5ms延時 | |
void Delay5Ms(void) | |
{ | |
unsigned int TempCyc = 5552; | |
while(TempCyc–); | |
} | |
//400ms延時 | |
void Delay400Ms(void) | |
{ | |
unsigned char TempCycA = 5; | |
unsigned int TempCycB; | |
while(TempCycA–) | |
{ | |
TempCycB=7269; | |
while(TempCycB–); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment