查看: 2344|回复: 1
打印 上一主题 下一主题

经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-23 20:29:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上下载的资料。因为论坛不支持.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);                        //若内部操作位BF忙CPU就等待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;
        _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周期MPU用30,  12周期MPU用5
        uint TempCycB;
        while(TempCycA--)
                {
                TempCycB=7269;
                while(TempCycB--);
                };
}

#endif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表