随笔-1  评论-0  文章-1  trackbacks-0
//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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理