/****************************************************************************** 经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序文件名:1602.ccpu:STC12C5A32S2 晶振频率:11.0592Mhz编程者:BG1EQ@2011-8-25 测试通过******************************************************************************* LCD1602 实际硬件连接:LCM_RS-----P2^0; //1602定义引脚LCM_RW-----P2^1;LCM_E -----P2^7;LCM_DB0-----P0.0LCM_DB1-----P0.1LCM_DB2-----P0.2LCM_DB3-----P0.3LCM_DB4-----P0.4LCM_DB5-----P0.5LCM_DB6-----P0.6LCM_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(); //初始化LCDsys_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@ "); //第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.H4位总线驱动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(); //读忙标志BFvoid 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不能大于15Y &= 0x1; //限制Y不能大于1if (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不能大于15Y &= 0x1; //限制Y不能大于1if (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表示读忙标志BFwhile(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用5uint TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}#endif。