📄 1602a液晶屏的驱动实验.htm
字号:
target=_blank>STC89C51RC单片机</A><BR>所需软件: 1. <A
href="http://www.52c51.com/down/52.html" target=_blank>Keil C51
V8.08</A>或<A href="http://www.52c51.com/down/51.html"
target=_blank>Keil_uv3
绿色版本</A><BR> 2.<A
href="http://www.mcu-memory.com/"
target=_blank>STC单片机ISP下载编程软件</A><BR><A
href="1602A液晶屏的驱动实验.files/07120423352513.gif" target=_blank><IMG
height=347 src="1602A液晶屏的驱动实验.files/07120423352513.gif"
width=566></A><BR><A href="1602A液晶屏的驱动实验.files/07120423215636.jpg"
target=_blank><IMG height=428
src="1602A液晶屏的驱动实验.files/07120423215636.jpg"
width=700></A><BR> 1602A液晶屏连接图<BR>C语言源程序<BR>/******************************************************************<BR>**
1602A液晶屏驱动程序<BR>** 晶 振 频 率:11.0592M<BR>**
线路->单片机实验开发板A<BR>******************************************************************/<BR> #include<REG51.H> <BR> #define
uchar unsigned char<BR> #define uint unsigned
int<BR><BR> sbit
LCM_E=P3^5; //定义接口<BR> sbit
LCM_RW=P3^6;<BR> sbit LCM_RS=P3^7;
<BR><BR> #define LCM_Data
P1//数据接口<BR><BR> void LCM_WriteData(uchar
WDLCM);<BR> void LCM_WriteCommand(uchar
WCLCM,BuysC);<BR> uchar
LCM_ReadData(void);<BR> uchar
LCM_ReadStatus(void);<BR> void
LCM_Init(void);<BR> void DisplayOneChar(uchar
X, uchar Y, uchar DData);<BR> void
DisplayListChar(uchar X, uchar Y, uchar code
*DData);<BR> void
Delay5Ms(void);<BR> void
Delay400Ms(void);<BR><BR> uchar code uctech[]
= {"1602A"};<BR> uchar code net[] =
{"www.52c51.com"};<BR><BR> void
main(void)<BR> {<BR> Delay400Ms();
//启动等待,等LCM讲入工作状态<BR> LCM_Init();
//LCM初始化<BR> Delay5Ms();
//延时片刻(可不要)<BR><BR> DisplayListChar(6,
1, uctech);
<BR> DisplayListChar(0,
0,
net);<BR> LCM_ReadData();//测试用句无意义<BR> LCM_Data=255;<BR> while(1);<BR> }<BR><BR>/****************************1602A写数据函数**************************/<BR>/*函数原型:void
LCM_WriteData(uchar
WDLCM)<BR>/*函数功能:1602A写数据<BR>/*输入参数:要写入的数据<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> void
LCM_WriteData(uchar
WDLCM)<BR> {<BR> LCM_ReadStatus();
//检测忙<BR> LCM_Data =
WDLCM;<BR> LCM_RS =
1;<BR> LCM_RW =
0;<BR> LCM_E = 0;
//若晶振速度太高可以在这后加小的延时<BR> LCM_E
= 0; //延时<BR> LCM_E =
1;<BR> }<BR><BR>/****************************1602A写指令函数**************************/<BR>/*函数原型:void
LCM_WriteCommand(uchar
WCLCM,BuysC)<BR>/*函数功能:1602A写指令<BR>/*输入参数:要写入的指令<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> void
LCM_WriteCommand(uchar WCLCM,BuysC)
//BuysC为0时忽略忙检测<BR> {<BR> if
(BuysC) LCM_ReadStatus();
//根据需要检测忙<BR> LCM_Data
= WCLCM;<BR> LCM_RS =
0;<BR> LCM_RW =
0;<BR> LCM_E =
0;<BR> LCM_E =
0;<BR> LCM_E =
1;<BR> }<BR><BR>/****************************1602A读数据函数**************************/<BR>/*函数原型:uchar
LCM_ReadData(void)<BR>/*函数功能:1602A读数据<BR>/*输入参数:无<BR>/*输出参数:1602A返回的数据<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> uchar
LCM_ReadData(void)<BR> {<BR> LCM_RS
= 1;<BR> LCM_RW =
1;<BR> LCM_E =
0;<BR> LCM_E =
0;<BR> LCM_E =
1;<BR> return(LCM_Data);<BR> }<BR><BR>/****************************1602A读状态函数**************************/<BR>/*函数原型:uchar
LCM_ReadData(void)<BR>/*函数功能:1602A读状态<BR>/*输入参数:无<BR>/*输出参数:1602A返回的状态<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> uchar
LCM_ReadStatus(void)<BR> {<BR> LCM_Data
= 0xFF;<BR> LCM_RS =
0;<BR> LCM_RW =
1;<BR> LCM_E =
0;<BR> LCM_E =
0;<BR> LCM_E =
1;<BR> while
(LCM_Data & 0x80);
//检测忙信号<BR> return(LCM_Data);<BR> }<BR><BR>/****************************1602A初始化函数**************************/<BR>/*函数原型:void
LCM_Init(void)<BR>/*函数功能:1602A初始化<BR>/*输入参数:无<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> void
LCM_Init(void)<BR> {<BR> LCM_Data
=
0;<BR> LCM_WriteCommand(0x38,0);
//三次显示模式设置,不检测忙信号<BR> Delay5Ms();<BR> LCM_WriteCommand(0x38,0);<BR> Delay5Ms();<BR> LCM_WriteCommand(0x38,0);<BR> Delay5Ms();<BR><BR> LCM_WriteCommand(0x38,1);
//显示模式设置,开始要求每次检测忙信号<BR> LCM_WriteCommand(0x08,1);
//关闭显示<BR> LCM_WriteCommand(0x01,1);
//显示清屏<BR> LCM_WriteCommand(0x06,1);
//
显示光标移动设置<BR> LCM_WriteCommand(0x0C,1);
//
显示开及光标设置<BR> }<BR><BR>/******************1602A按指定位置显示一个字符函数**********************/<BR>/*函数原型:void
DisplayOneChar(uchar X, uchar Y, uchar
DData)<BR>/*函数功能:1602A按指定位置显示一个字符<BR>/*输入参数:X坐标 Y坐标
要显示的字符<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> void
DisplayOneChar(uchar X, uchar Y, uchar
DData)<BR> {<BR> Y
&= 0x1;<BR> X
&= 0xF;
//限制X不能大于15,Y不能大于1<BR> if
(Y) X |= 0x40;
//当要显示第二行时地址码+0x40;<BR> X
|= 0x80; //
算出指令码<BR> LCM_WriteCommand(X,
0);
//这里不检测忙信号,发送地址码<BR> LCM_WriteData(DData);<BR> }<BR><BR>/*******************1602A按指定位置显示一串字符函数*********************/<BR>/*函数原型:void
DisplayListChar(uchar X, uchar Y, uchar code
*DData)<BR>/*函数功能:1602A按指定位置显示一个字符<BR>/*输入参数:X坐标 Y坐标
要显示字符串的首地址<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> void
DisplayListChar(uchar X, uchar Y, uchar code
*DData)<BR> {<BR> uchar
ListLength;<BR> ListLength
= 0;<BR> Y &=
0x1;<BR> X &=
0xF;
//限制X不能大于15,Y不能大于1<BR> while
(DData[ListLength]>0x20)
//若到达字串尾则退出<BR> {<BR> if
(X <= 0xF)
//X坐标应小于0xF<BR> {<BR> DisplayOneChar(X,
Y, DData[ListLength]);
//显示单个字符<BR> ListLength++;<BR> X++;<BR> }<BR> }<BR> }<BR><BR>/********************5ms延时函数************************/<BR>/*函数原型:void
Delay5Ms(void)<BR>/*函数功能:5ms延时<BR>/*输入参数:无<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR> void
Delay5Ms(void)<BR> {<BR> unsigned
int TempCyc =
5552;<BR> while(TempCyc--);<BR> }<BR><BR>/********************400ms延时延时函数************************/<BR>/*函数原型:void
Delay400Ms(void)<BR>/*函数功能:400ms延时延时<BR>/*输入参数:无<BR>/*输出参数:无<BR>/*调用模块:<BR>/*建立时间:2005/11/14<BR>/*作者:站长<BR>/**********************************************************************/<BR>void
Delay400Ms(void)<BR>{<BR>uchar TempCycA = 5;<BR>unsigned int
TempCycB;<BR>while(TempCycA--)<BR>{<BR>
TempCycB=7269;<BR>
while(TempCycB--);<BR>};<BR>}<BR>keil工程文件打包下载<A
href="http://www.52c51.com/article/upfiles/07120517133238.rar"
target=_blank>yejing_c.rar</A><BR><BR>汇编语言源程序<BR>/******************************************************************<BR>**
1602A液晶屏驱动程序<BR>** 晶 振 频 率:11.0592M<BR>**
线路->单片机实验开发板A<BR>******************************************************************/
<BR><BR> LCM_RS
EQU P3.7 ;//定义接口
<BR> LCM_RW
EQU P3.6
<BR> LCM_E
EQU P3.5
<BR><BR> LCM_Data
EQU
P1 ;数据接口<BR><BR> ORG
0000H
;从0000H处开始<BR> SJMP
MAIN
;跳转到MAIN处<BR><BR> ORG
0030H
;主程序从0030H处开始<BR>MAIN: MOV
SP,#70H
;堆栈指针指向70H<BR> LCALL
INITIAL
;调用启动LCM子程序进行初始化<BR> LCALL
CLS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -