//LCD0804.h
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCM_DATA P0
sbit LCM_RS =P2^0;
sbit LCM_RW =P2^1;
sbit LCM_E =P2^2;

//LCD0804.c
#include "LCM16X2.h"



/**//*

====================================================================

说 明:由于LCM液晶慢速设备,所以在使用它之前要检查它是否是处于忙的状态

如果它处于写忙的状态时D7是恒为高电平的!所以只需要检查D7这一位就OK

函数名称:IsBusy()

入口参数:无 出口参数:无

设 计 者: 时 间:2008年8月12日

====================================================================

*/

void IsBusy()



{

bit busy;

do


{

LCM_RS=0;

LCM_RW=1;

LCM_E=1;

LCM_DATA=0xff;

busy=LCM_DATA&0x80;

LCM_E=0;

}while(busy);

}


/**//*

====================================================================

说 明:当对该设备进行操作之前一定要检查它是否处于忙的状态

RS=1时为数据寄存器,RS=0时为指令寄存器

RW=1时为读操作, RW=0时为写操作

函数名称:LCM_Write_Com

入口参数:uchar comm 出口参数:无

设 计 者: 时 间:2008年8月12日

=====================================================================

*/

void LCM_Write_Com(uchar comm)



{

IsBusy();

LCM_RS=0;

LCM_RW=0;

LCM_E=1;

LCM_DATA=comm;

LCM_E=0;

}


/**//*

=====================================================================

说 明:当对该设备进行操作之前要先检查它是否处于忙的状态.

函数名称:LCM_Write_Data

入口参数: uchar dat 出口参数: 无

设 计 者: 时 间:2008年8月12日

=====================================================================

*/

void LCM_Write_Data(uchar dat)



{

IsBusy();

LCM_RS=1;

LCM_RW=0;

LCM_E=1;

LCM_DATA=dat;

LCM_E=0;

}


/**//*

=====================================================================

说 明:需要注意的是:当E使能端从高电平向低电平跳变的时间,执行指令.

先给DATA初始化为高电平

函数名称:LCM_Read_Data

入口参数:无 出口参数: uchar

设 计 者: 时 间:2008年8月12日

=====================================================================

*/

uchar LCM_Read_Data()



{

uchar result;

IsBusy();

LCM_DATA=0xff;

LCM_RS=1;

LCM_RW=1;

LCM_E=1;

result=LCM_DATA;

LCM_E=0;

return result;

}


/**//*

=====================================================================

说 明:因为当设备处于写的状态时,D7必须恒为1,

第一行的实际写入地址为80H+XX

第二行的实际写入地址为80H+40H=C0H, CH+XX

函数名称:LCM_Display_Char

入口参数:uint ,uint ,uchar 出口参数:无

设 计 者: 时 间:2008年8月12日

=====================================================================

*/

void LCM_Display_Char(uint row,uint col,uchar m_char)



{

if(row==0)


{

LCM_Write_Com(0x80+col);

}

else


{

LCM_Write_Com(0xc0+col);

}

LCM_Write_Data(m_char);

}


/**//*

=====================================================================

说 明:本函数用于输出一个字符串

函数名称:LCM_Display_String

入口参数:uint,uint,uchar* 出口参数: 无

设 计 者: 时 间:2008年8月12日

=====================================================================

*/

void LCM_Display_String(uint row,uint col,uchar *m_pStr)



{

uchar m_Length;

m_Length=strlen(m_pStr);

while(m_Length)


{

if(col>=16)


{

row++;

col=0;

}

if(row>=2)row=0;

LCM_Display_Char(row,col,*m_pStr);

m_pStr++;

col++;

m_Length--;

}

}


/**//*

=================================================================

说 明:本函数用于初始化16X2液晶模块,关于指令请参照说明

函数名称:LCM_Init

入口参数:无 出口参数:无

设 计 者: 时 间:2008年8月12日

=================================================================

*/

void LCM_Init()



{

LCM_Write_Com(0x38);

LCM_Write_Com(0x0c);

LCM_Write_Com(0x06);

LCM_Write_Com(0x01);

}


/**//*

=================================================================

说 明:本函数用于非准确延时

函数名称:

入口参数:uint 出口参数:无

设 计 者: 时 间:2008年8月12日

=================================================================

*/

void Delay(uint msecond)



{

int i,j;

for(i=0;i<msecond;i++)

for(j=0;j<100;j++);

}


/**//*

=================================================================

说 明: 主函数 注意在程序刚开始运行时先延时,让设备就绪

函数名称:main

入口参数:无 出口参数:int

设 计 者: 时 间:2008年8月12日

=================================================================

*/

int main()



{

Delay(500);

LCM_Init();

LCM_Display_String(0,1,"DG.Boy is a bad boy");

return 0;

}

posted on 2009-03-07 18:19
宇驰 阅读(94)
评论(0) 编辑 收藏 引用