网上下载的资料。因为论坛不支持.doc文件,我就直接复制上来了。
==================================================================
/******************************************************************************
经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序

文件名        1602.c
cpu:STC12C5A32S2    晶振频率:11.0592Mhz

编程者:BG1EQ@TOM.COM
2011-8-25 测试通过
*******************************************************************************
LCD1602 实际硬件连接:

LCM_RS-----P2^0;  //1602定义引脚
LCM_RW-----P2^1;
LCM_E -----P2^7;

LCM_DB0-----P0.0
LCM_DB1-----P0.1
LCM_DB2-----P0.2
LCM_DB3-----P0.3
LCM_DB4-----P0.4
LCM_DB5-----P0.5
LCM_DB6-----P0.6
LCM_DB7-----P0.7
               
*******************************************************************************/

#include <reg52.h>                        //包含52头文件
#include <string.h>                        //包含初试化头文件
#include <intrins.h>
//#include <stdlib.h>                //包含标准函数库头文件

#include "4bitlcm1602.h"        //包含delay头文件
#include "delay.h"                        //包含delay头文件

#define uchar unsigned char
#define uint  unsigned int

//------硬件端口定义--------------------------------


//------函数(声明)--------------------------------
void sys_init(void);                                                                //系统初始化函数(声明)




/******************************************************************************************
* 函数名称    :主程序
* 功能描述   
******************************************************************************************/
main()                                                //主程序入口
{
//        LCMInit();                        //初始化LCD
        sys_init();                                //系统初始化


    while(1)
    {        //主程序循环(开始)

        LCD_cls();                                                                        //清屏

    DisplayListChar(0,0,"  MONITOR V1.0  ");        //1行显示
    DisplayListChar(0,1," APPLY IN CHINA ");        //2行显示
    Delay400Ms();
          Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();

        LCD_cls();                                //清屏

          DisplayListChar(0,0," BG1EQ@TOM.COM  ");        //1行显示
    DisplayListChar(0,1," 2011Y 08M 25D  ");        //2行显示
    Delay400Ms();
          Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();

        LCD_cls();                                //清屏

    DisplayOneChar(0,0,'0');                                //显示字符
    DisplayOneChar(1,0,'1');                                //显示字符
    DisplayOneChar(2,0,'2');                                //显示字符
    DisplayOneChar(3,0,'3');                                //显示字符
    DisplayOneChar(4,0,'4');                                //显示字符
    DisplayOneChar(5,0,'5');                                //显示字符
    DisplayOneChar(6,0,'6');                                //显示字符
    DisplayOneChar(7,0,'7');                                //显示字符
    DisplayOneChar(8,0,'8');                                //显示字符
    DisplayOneChar(9,0,'9');                                //显示字符
    DisplayOneChar(10,0,'0');                                //显示字符
    DisplayOneChar(11,0,'-');                                //显示字符
    DisplayOneChar(12,0,'+');                                //显示字符
    DisplayOneChar(13,0,'=');                                //显示字符
    DisplayOneChar(14,0,'#');                                //显示字符
    DisplayOneChar(15,0,'$');                                //显示字符

    Delay400Ms();
        Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();

        LCD_cls();                                //清屏

    DisplayOneChar(0,1,'A');                                //显示字符
    DisplayOneChar(1,1,'B');                                //显示字符
    DisplayOneChar(2,1,'C');                                //显示字符
    DisplayOneChar(3,1,'D');                                //显示字符
    DisplayOneChar(4,1,'E');                                //显示字符
    DisplayOneChar(5,1,'F');                                //显示字符
    DisplayOneChar(6,1,'G');                                //显示字符
    DisplayOneChar(7,1,'H');                                //显示字符
    DisplayOneChar(8,1,'I');                                //显示字符
    DisplayOneChar(9,1,'J');                                //显示字符
    DisplayOneChar(10,1,'K');                                //显示字符
    DisplayOneChar(11,1,'L');                                //显示字符
    DisplayOneChar(12,1,'M');                                //显示字符
    DisplayOneChar(13,1,'N');                                //显示字符
    DisplayOneChar(14,1,'O');                                //显示字符
    DisplayOneChar(15,1,'P');                                //显示字符

    Delay400Ms();
          Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();


    }          //主程序循环结束返回       
}         





/******************************************************************************************
* 函数名称    sys_init
* 功能描述    :系统初始化
******************************************************************************************/ 
void sys_init()
{
        Delay400Ms();                        //上电后延时,LCD1602进入稳定状态,
        LCMInit();                        //初始化LCD1602
}
 


以上是C51主程序
以下是C51 模块化4BITLCM1602.H 函数程序


/*--------------------------------------------------------------------------
4BITLCM1602.H

4位总线驱动LCD1602 头文件
--------------------------------------------------------------------------*/

#ifndef __4BITLCM1602_H__
#define __4BITLCM1602_H__



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


//#include <reg52.h>                //包含52头文件
//#include <string.h>                //包含初试化头文件
//#include <intrins.h>
//#include <stdlib.h>        //包含标准函数库头文件


#define uchar unsigned char
#define uint  unsigned int

//------硬件端口定义--------------------------------

sbit LCM_RS = P2^0; //1602定义引脚
sbit LCM_RW = P2^1;
sbit LCM_E = P2^7;


sbit LCD7=P0^7;
sbit LCD6=P0^6;
sbit LCD5=P0^5;
sbit LCD4=P0^4;

uchar bdata lcdbuff;                        //声明,全局的、可以位寻址的变量

sbit lcd_buff7=lcdbuff^7;
sbit lcd_buff6=lcdbuff^6;
sbit lcd_buff5=lcdbuff^5;
sbit lcd_buff4=lcdbuff^4;

sbit lcd_buff3=lcdbuff^3;
sbit lcd_buff2=lcdbuff^2;
sbit lcd_buff1=lcdbuff^1;
sbit lcd_buff0=lcdbuff^0;


//------函数(声明)--------------------------------
void LCMInit(void);                                                                        //LCM屏初始化
void R_BF();                                                                                //读忙标志BF
void w_com(uchar com);                                                                //写指令函数                                                       
void w_cdata(void);                                                                        //写数据函数
void WriteDataLCM(unsigned char WDLCM);                                //LCM屏写数据函数(声明)
void LCD_cls(void);                                                                        //LCM屏清屏
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);




/******************************************************************************************
* 函数名称    WriteDataLCM
* 功能描述    LCM写数据
******************************************************************************************/
void WriteDataLCM(uchar WDLCM)
{
        R_BF();
        lcdbuff = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
        w_cdata();                                //这里写入字符码
}




/******************************************************************************************
* 函数名称    DisplayListChar
* 功能描述    :按指定位置显示一串字符,原来的遇到空格0x20就不显示
* 函数说明   
******************************************************************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
          uchar ListLength,j;                                                        //定义局部变量
          ListLength = strlen(DData);                                        //读取字符串长度
          X &= 0xF;                                                                        //限制X不能大于15
          Y &= 0x1;                                                                        //限制Y不能大于1
    if (X <= 0xF)                                                                //X坐标应小于0xF
      {
                    for(j=0;j<ListLength;j++)
                    {
            DisplayOneChar(X, Y, DData[j]);        //显示单个字符
            X++;
            }
      }
}   


       
/******************************************************************************************
* 函数名称    DisplayOneChar
* 功能描述    :按指定位置显示一个字符
* 函数说明   
******************************************************************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
        X &= 0xF;                                //限制X不能大于15
        Y &= 0x1;                                //限制Y不能大于1
        if (Y) X |= 0x40;                //如果Y“1”,则合成显示第二行时地址码+0x40;
        X |= 0x80;                                //合成的、显示位置码,指令码:1Yxx xxxx (B)
        w_com(X);                                  //写入地址码,X数据包含字符的显示位置

        WriteDataLCM(DData);          //写入数据码,要显示的字符数据
}

 


/
******************************************************************************************
* 函数名称    LCMInit
* 功能描述    LCM初始化
* 函数说明    LCM初始化
******************************************************************************************/
void LCMInit(void)
{
        w_com(0x2c);                 //功能设置为:四位数据总线
        w_com(0x01);                 //清屏
        w_com(0x06);                 //设置显示输入模式(AC指针自加1,显示不移位)
        w_com(0x0c);                 //显示开/关设置(设置显示、光标和闪烁开关)
}



/
******************************************************************************************
* 函数名称    R_BF
* 功能描述    :读忙标志BF
* 函数说明    :读忙标志BF
*******************************************************************************************/
void R_BF()
{
        LCD7=1;                                        //BF端口在DB7,LCD7“1”等待测试本端口电平
        LCM_RS=0;
        LCM_RW=1;                                         
        LCM_E=1;                                //RS=0;RW=1;E=1表示读忙标志BF
        while(LCD7);                        //若内部操作位BFCPU就等待BF不忙才能操作
        LCM_E=0;
}



/******************************************************************************************
* 函数名称    w_com
* 功能描述    :写命令
* 函数说明    :主要用来初始化一些设置显示、输入模式、显示开关、光标、移位、功能、地址
*******************************************************************************************/
void w_com(uchar com)
{
        R_BF();
        lcdbuff = com;
        LCM_RS = 0;
        LCM_RW = 0;
        w_cdata();
}




/******************************************************************************************
* 函数名称    w_cdata
* 功能描述    :写命令的公共
* 函数说明    :四位数据总线, 每发送一字节,先发送高四位,再发送低四位
*******************************************************************************************/
void w_cdata(void)
{

//-----写命令的高4
        LCD7 = lcd_buff7;
        LCD6 = lcd_buff6;
        LCD5 = lcd_buff5;
        LCD4 = lcd_buff4;
        LCM_E = 1;c51中字符串函数
        _nop_();
        LCM_E = 0;

        _nop_();
        _nop_();

//-----写命令的低4       
        LCD7 = lcd_buff3;
        LCD6 = lcd_buff2;
        LCD5 = lcd_buff1;
        LCD4 = lcd_buff0;
        LCM_E = 1;
        _nop_();
        LCM_E = 0;                               

}


/******************************************************************************************
* 函数名称    LCD_cls
* 功能描述    LCM清屏
*******************************************************************************************/
void LCD_cls(void)
{
        w_com(0x01);                 //清屏
}


#endif


以下是C51 模块化 DELAY.H 函数程序


/*--------------------------------------------------------------------------
DELAY.H

延时函数 头文件
--------------------------------------------------------------------------*/

#ifndef __DELAY_H__
#define __DELAY_H__

#define uchar unsigned char
#define uint  unsigned int


//------函数(声明)--------------------------------
void Delay400Ms(void);                                                                //延时400mS函数(子程序)

/******************************************************************************************
* 函数名称    Delay400Ms
* 功能描述    400ms延时
******************************************************************************************/
void Delay400Ms(void)
{
        uchar TempCycA = 30;                //1周期MPU30,  12周期MPU5
        uint TempCycB;
        while(TempCycA--)
                {
                TempCycB=7269;
                while(TempCycB--);
                };
}

#endif

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。