?? 修改可以顯示的液晶1602.txt
字號:
/******************************************************************
** 1602A液晶屏驅動程序
** 晶 振 頻 率:11.0592M
** 線路->單片機實驗開發板A 時序有問題
******************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCM_E=P3^5; //定義接口
sbit LCM_RW=P3^6; //讀寫選擇端口
sbit LCM_RS=P3^7; //數據/命令選擇端口
#define LCM_Data P1//數據接口
void LCM_WriteData(uchar WDLCM);
void LCM_WriteCommand(uchar WCLCM,BuysC);
uchar LCM_ReadData(void);
uchar LCM_ReadStatus(void);
void LCM_Init(void);
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
uchar code uctech[] = {"1602A"};
uchar code net[] = {"www.52c51.com"};
void main(void)
{
Delay400Ms(); //啟動等待,等LCM講入工作狀態
LCM_Init(); //LCM初始化
Delay5Ms(); //延時片刻(可不要)
DisplayListChar(6, 0, uctech);
DisplayListChar(3, 1, net);
LCM_ReadData();//測試用句無意義
LCM_Data=255;
while(1);
}
/****************************1602A寫數據函數**************************/
/*函數原型:void LCM_WriteData(uchar WDLCM)
/*函數功能:1602A寫數據
/*輸入參數:要寫入的數據
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void LCM_WriteData(uchar WDLCM)
{
LCM_ReadStatus(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
// LCM_E = 0; //若晶振速度太高可以在這后加小的延時
LCM_E = 1; //延時
// ;;;;
LCM_E = 0; //E為高電平,讀數據,顯示,
}
/****************************1602A寫指令函數**************************/
/*函數原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函數功能:1602A寫指令
/*輸入參數:要寫入的指令
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void LCM_WriteCommand(uchar WCLCM,BuysC) //BysC為0時忽略忙檢測 BysC為自己設置,思想很好
{
if (BuysC) LCM_ReadStatus(); //根據需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
// LCM_E = 0;
LCM_E = 1;
LCM_E = 0; //下降沿開始執行指令
Delay5Ms(); //應預留寫指令執行的時間
}
/****************************1602A讀數據函數**************************/
/*函數原型:uchar LCM_ReadData(void)
/*函數功能:1602A讀數據
/*輸入參數:無
/*輸出參數:1602A返回的數據
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
uchar LCM_ReadData(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/****************************1602A讀狀態函數**************************/
/*函數原型:uchar LCM_ReadData(void)
/*函數功能:1602A讀狀態
/*輸入參數:無
/*輸出參數:1602A返回的狀態
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
uchar LCM_ReadStatus(void)
{
LCM_Data = 0xFF;//無什么特殊作用
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1; // E需為高電平,高電平讀操作
while (LCM_Data & 0x80); //檢測忙信號,不忙后結束檢測,返回
return(LCM_Data);
}
/****************************1602A初始化函數**************************/
/*函數原型:void LCM_Init(void)
/*函數功能:1602A初始化
/*輸入參數:無
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void LCM_Init(void)
{
LCM_Data = 0; //P1置零,即接收輸入端口置零
/// LCM_WriteCommand(0x38,0); //三次顯示模式設置,不檢測忙信號
//Delay5Ms();
/// LCM_WriteCommand(0x38,0);
// Delay5Ms();
/// LCM_WriteCommand(0x38,0);
// Delay5Ms();
LCM_WriteCommand(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
LCM_WriteCommand(0x08,1); //關閉顯示
LCM_WriteCommand(0x01,1); //顯示清屏
LCM_WriteCommand(0x06,1); // 顯示光標移動設置
LCM_WriteCommand(0x0C,1); // 顯示開關、光標開關及閃爍開關設置 C為1100B 即三個為 開、關、關 00001DCB
}
/******************1602A按指定位置顯示一個字符函數**********************/
/*函數原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函數功能:1602A按指定位置顯示一個字符
/*輸入參數:X坐標 Y坐標 要顯示的字符
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1; //***X,Y控制顯示, X為數據地址指針,控制顯示的位置 為數據地址指針*********
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;/// 規定首行地址為00H~2FH,此行為40H~67H
X |= 0x80; // 算出指令碼 //80H+地址碼為算出指令碼,為數據指針地址
LCM_WriteCommand(X, 0); //這里不檢測忙信號,發送地址碼
LCM_WriteData(DData);
}
/*******************1602A按指定位置顯示一串字符函數*********************/
/*函數原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函數功能:1602A按指定位置顯示一個字符
/*輸入參數:X坐標 Y坐標 要顯示字符串的首地址
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength; //X,Y控制字符顯示的位置
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1 16*2 0~15 X,0~1 Y 控制滿足。。。。。
while (DData[ListLength]>0x20) //若到達字串尾則退出
{
if (X <= 0xF) //X坐標應小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
/********************5ms延時函數************************/
/*函數原型:void Delay5Ms(void)
/*函數功能:5ms延時
/*輸入參數:無
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/********************400ms延時延時函數************************/
/*函數原型:void Delay400Ms(void)
/*函數功能:400ms延時延時
/*輸入參數:無
/*輸出參數:無
/*調用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void Delay400Ms(void)
{
uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -