基于MCS-51单片机技术液晶显示驱动设计

这是毕业设计的课题... 这是毕业设计的课题 展开
 我来答
匿名用户
2013-09-09
展开全部
/******************************************************************************
CPU: stc89c58 主频:11.0592M
液晶型号:smc1602 生产厂家: 驱动芯片:hd44780
硬件连接:---------------------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.2 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 |
|DB2-----P0.2 | DB6-----P0.6 | E -------P2.5 |
|DB3-----P0.3 | DB7-----P0.7 | Vo接1k电阻到地
---------------------------------------------------------------
*****************************************************************************/
#include <reg52.h>
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LCM_RW = P2^2;//定义引脚
sbit LCM_RS = P2^1;
sbit LCM_E = P2^5;
sbit beep = P1^0;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 pl_works[] = {"pl-works v1.0"};
unsigned char code email[] = {"hit97@163.com "};
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
void main(void)
{
beep = 1;
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
beep = 0;
DisplayListChar(0, 0, pl_works);
DisplayListChar(0, 1, email);
ReadDataLCM();//测试用句无意义
while(1)
{
beep=1;
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
beep=0;
}
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//写指令
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;
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//读状态
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);
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
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); // 显示开及光标设置
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//按指定位置显示一个字符
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);
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//按指定位置显示一串字符
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++;
}
}
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/******************************************************************************************
* 函数名称 :SetAddress
* 功能描述 :同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
* 参数 : 参数名称: 输入/输出? 类型 描述
******************************************************************************************/
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式