2.杜邦頭插線
3.16x2液晶顯示字符模塊
4.STC89C51RC單片機
所需軟件: 1. Keil C51 V8.08或Keil_uv3 綠色版本
2.STC單片機ISP下載編程軟件


1602A液晶屏連接圖
C語言源程序
/******************************************************************
** 1602A液晶屏驅(qū)動程序
** 晶 振 頻 率:11.0592M
** 線路->單片機實驗開發(fā)板A
******************************************************************/
#include
#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//數(shù)據(jù)接口
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講入工作狀態(tài)
LCM_Init(); //LCM初始化
Delay5Ms(); //延時片刻(可不要)
DisplayListChar(6, 1, uctech);
DisplayListChar(0, 0, net);
LCM_ReadData();//測試用句無意義
LCM_Data=255;
while(1);
}
/****************************1602A寫數(shù)據(jù)函數(shù)**************************/
/*函數(shù)原型:void LCM_WriteData(uchar WDLCM)
/*函數(shù)功能:1602A寫數(shù)據(jù)
/*輸入?yún)?shù):要寫入的數(shù)據(jù)
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void LCM_WriteData(uchar WDLCM)
{
LCM_ReadStatus(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時
LCM_E = 0; //延時
LCM_E = 1;
}
/****************************1602A寫指令函數(shù)**************************/
/*函數(shù)原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函數(shù)功能:1602A寫指令
/*輸入?yún)?shù):要寫入的指令
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void LCM_WriteCommand(uchar WCLCM,BuysC) //BuysC為0時忽略忙檢測
{
if (BuysC) LCM_ReadStatus(); //根據(jù)需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/****************************1602A讀數(shù)據(jù)函數(shù)**************************/
/*函數(shù)原型:uchar LCM_ReadData(void)
/*函數(shù)功能:1602A讀數(shù)據(jù)
/*輸入?yún)?shù):無
/*輸出參數(shù):1602A返回的數(shù)據(jù)
/*調(diào)用模塊:
/*建立時間: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讀狀態(tài)函數(shù)**************************/
/*函數(shù)原型:uchar LCM_ReadData(void)
/*函數(shù)功能:1602A讀狀態(tài)
/*輸入?yún)?shù):無
/*輸出參數(shù):1602A返回的狀態(tài)
/*調(diào)用模塊:
/*建立時間: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;
while (LCM_Data & 0x80); //檢測忙信號
return(LCM_Data);
}
/****************************1602A初始化函數(shù)**************************/
/*函數(shù)原型:void LCM_Init(void)
/*函數(shù)功能:1602A初始化
/*輸入?yún)?shù):無
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void LCM_Init(void)
{
LCM_Data = 0;
LCM_WriteCommand(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
Delay5Ms();
LCM_WriteCommand(0x38,0);
Delay5Ms();
LCM_WriteCommand(0x38,0);
Delay5Ms();
LCM_WriteCommand(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
LCM_WriteCommand(0x08,1); //關(guān)閉顯示
LCM_WriteCommand(0x01,1); //顯示清屏
LCM_WriteCommand(0x06,1); // 顯示光標(biāo)移動設(shè)置
LCM_WriteCommand(0x0C,1); // 顯示開及光標(biāo)設(shè)置
}
/******************1602A按指定位置顯示一個字符函數(shù)**********************/
/*函數(shù)原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函數(shù)功能:1602A按指定位置顯示一個字符
/*輸入?yún)?shù):X坐標(biāo) Y坐標(biāo) 要顯示的字符
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼
LCM_WriteCommand(X, 0); //這里不檢測忙信號,發(fā)送地址碼
LCM_WriteData(DData);
}
/*******************1602A按指定位置顯示一串字符函數(shù)*********************/
/*函數(shù)原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函數(shù)功能:1602A按指定位置顯示一個字符
/*輸入?yún)?shù):X坐標(biāo) Y坐標(biāo) 要顯示字符串的首地址
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到達字串尾則退出
{
if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
/********************5ms延時函數(shù)************************/
/*函數(shù)原型:void Delay5Ms(void)
/*函數(shù)功能:5ms延時
/*輸入?yún)?shù):無
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/********************400ms延時延時函數(shù)************************/
/*函數(shù)原型:void Delay400Ms(void)
/*函數(shù)功能:400ms延時延時
/*輸入?yún)?shù):無
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void Delay400Ms(void)
{
uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
keil工程文件打包下載yejing_c.rar
匯編語言源程序
/******************************************************************
** 1602A液晶屏驅(qū)動程序
** 晶 振 頻 率:11.0592M
** 線路->單片機實驗開發(fā)板A
******************************************************************/
LCM_RS EQU P3.7 ;//定義接口
LCM_RW EQU P3.6
LCM_E EQU P3.5
LCM_Data EQU P1 ;數(shù)據(jù)接口
ORG 0000H ;從0000H處開始
SJMP MAIN ;跳轉(zhuǎn)到MAIN處
ORG 0030H ;主程序從0030H處開始
MAIN: MOV SP,#70H ;堆棧指針指向70H
LCALL INITIAL ;調(diào)用啟動LCM子程序進行初始化
LCALL CLS ;調(diào)用清除LCM子程序
MOV A,#80H ;向A送立即數(shù)80H設(shè)定顯示地址為第一行第一列
LCALL WRITE_COM ;調(diào)用寫指令到LCM子程序
MOV DPTR,#LINE1 ;將第一行字符串的啟始地址送如DPTR中
LCALL DISP ;調(diào)用顯示字符串到LCM子程序
MOV A,#0C0H ;向A送立即數(shù)0C0H設(shè)定顯示地址為第二行第一列
LCALL WRITE_COM ;調(diào)用寫指令到LCM子程序
MOV DPTR,#LINE2 ;將第二行字符串的啟始地址送如DPTR中
LCALL DISP ;調(diào)用顯示字符串到LCM子程序
SJMP $ ;程序動態(tài)停機
LINE1: DB " www.52c51.com ",00H ;第一行字符串
LINE2: DB " 1602A ",00H ;第二行字符串
INITIAL: MOV A,#38H ;啟動LCM子程序
LCALL WRITE_COM
MOV A,#0EH
LCALL WRITE_COM
MOV A,#06H
LCALL WRITE_COM
RET
CHECK_BUSY: PUSH ACC ;查詢忙碌信號子程序
BUSY_LOOP: CLR LCM_E
SETB LCM_RW
CLR LCM_RS
SETB LCM_E
MOV A,LCM_Data
CLR LCM_E
JB ACC.7,BUSY_LOOP
POP ACC
LCALL DEL
RET
WRITE_COM: LCALL CHECK_BUSY;寫指令到LCM子程序
CLR LCM_E
CLR LCM_RS
CLR LCM_RW
SETB LCM_E
MOV LCM_Data,A
CLR LCM_E
RET
WRITE_DATA: LCALL CHECK_BUSY ;寫數(shù)據(jù)到LCM子程序
CLR LCM_E
SETB LCM_RS
CLR LCM_RW
SETB LCM_E
MOV LCM_Data,A
CLR LCM_E
RET
CLS: MOV A,#01H ;清除LCM子程序
LCALL WRITE_COM
RET
DEL: MOV R6,#5 ;2.7ms延時子程序
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP: PUSH ACC ;將A的內(nèi)容壓棧
DISP_LOOP: CLR A ;A清零
MOVC A,@A+DPTR ;查表將字符串內(nèi)容送入A
JZ END_DISP ;若查到的內(nèi)容為0則終止查表
LCALL WRITE_DATA ;調(diào)用寫數(shù)據(jù)到LCM子程序
INC DPTR ;DPTR加1指向下一個對象
SJMP DISP_LOOP ;跳轉(zhuǎn)到DISP_LOOP循環(huán)執(zhí)行
END_DISP: POP ACC ;彈出壓棧內(nèi)容至A
RET
END ;程序結(jié)束
keil工程文件打包下載 yejing_asm.rar