//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) 编辑 收藏 引用