萬用電路板

----纯属爱好,谁与共鸣

« 延时声光控节电开关电路1602A液晶屏的驱动程序(汇编) »

1602A液晶屏的驱动程序(C语言)

C语言源程序

/*****************************************

** 1602A液晶屏驱动程序

** 晶 振 频 率:11.0592M

*****************************************/

#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, 1, uctech);

DisplayListChar(0, 0, net);

LCM_ReadData();//测试用句无意义

LCM_Data=255;

while(1);

}

 

/****************************1602A写数据函数**************************/

/*函数原型:void LCM_WriteData(uchar WDLCM)

/*函数功能:1602A写数据

/*输入参数:要写入的数据

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

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写指令函数**************************/

/*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)

/*函数功能:1602A写指令

/*输入参数:要写入的指令

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测

{

if (BuysC) LCM_ReadStatus();//根据需要检测忙

LCM_Data = WCLCM;

LCM_RS = 0;

LCM_RW = 0;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

}

 

/****************************1602A读数据函数**************************/

/*函数原型:uchar LCM_ReadData(void)

/*函数功能:1602A读数据

/*输入参数:无

/*输出参数:1602A返回的数据

/*调用模块:

/**********************************************************************/

 

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返回的状态

/*调用模块:

/**********************************************************************/

 

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初始化函数**************************/

/*函数原型:void LCM_Init(void)

/*函数功能:1602A初始化

/*输入参数:无

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

void LCM_Init(void)

{

LCM_Data = 0;

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);// 显示开及光标设置

}

 

/******************1602A按指定位置显示一个字符函数**********************/

/*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)

/*函数功能:1602A按指定位置显示一个字符

/*输入参数:X坐标 Y坐标 要显示的字符

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

void DisplayOneChar(uchar X, uchar Y, uchar DData)

{

Y &= 0x1;

X &= 0xF;//制X不能大于15,Y不能大于1

if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;

X |= 0x80;// 算出指令码

LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码

LCM_WriteData(DData);

}

 

/*******************1602A按指定位置显示一串字符函数*********************/

/*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)

/*函数功能:1602A按指定位置显示一个字符

/*输入参数:X坐标 Y坐标 要显示字符串的首地址

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

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坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符

ListLength++;

X++;

}

}

}

 

/********************5ms延时函数************************/

/*函数原型:void Delay5Ms(void)

/*函数功能:5ms延时

/*输入参数:无

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

 

/********************400ms延时延时函数************************/

/*函数原型:void Delay400Ms(void)

/*函数功能:400ms延时延时

/*输入参数:无

/*输出参数:无

/*调用模块:

/**********************************************************************/

 

void Delay400Ms(void)

{

uchar TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

赞助商广告

最近发表

热文排行

最新评论及回复

广告

图标汇集

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2011 JiangX.com 萬用電路板 All Rights Reserved.
鄂ICP备08003060号 [login]