经典的KEILC51LCD16024总线驱动+中文注释程序.docx
《经典的KEILC51LCD16024总线驱动+中文注释程序.docx》由会员分享,可在线阅读,更多相关《经典的KEILC51LCD16024总线驱动+中文注释程序.docx(13页珍藏版)》请在冰点文库上搜索。
经典的KEILC51LCD16024总线驱动+中文注释程序
/******************************************************************************
经典的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//包含52头文件
#include//包含初试化头文件
#include
//#include//包含标准函数库头文件
#include"4bitlcm1602.h"//包含delay头文件
#include"delay.h"//包含delay头文件
#defineucharunsignedchar
#defineuintunsignedint
//------硬件端口定义--------------------------------
//------函数(声明)--------------------------------
voidsys_init(void);//系统初始化函数(声明)
/******************************************************************************************
*函数名称:
主程序
*功能描述:
******************************************************************************************/
main()//主程序入口
{
//LCMInit();//初始化LCD
sys_init();//系统初始化
while
(1)
{//主程序循环(开始)
LCD_cls();//清屏
DisplayListChar(0,0,"MONITORV1.0");//第1行显示
DisplayListChar(0,1,"APPLYINCHINA");//第2行显示
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCD_cls();//清屏
DisplayListChar(0,0,"BG1EQ@TOM.COM");//第1行显示
DisplayListChar(0,1,"2011Y08M25D");//第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
*功能描述:
系统初始化
******************************************************************************************/
voidsys_init()
{
Delay400Ms();//上电后延时,让LCD1602进入稳定状态,
LCMInit();//初始化LCD1602
}
以上是C51主程序
以下是C51模块化4BITLCM1602.H函数程序
/*--------------------------------------------------------------------------
4BITLCM1602.H
4位总线驱动LCD1602头文件
--------------------------------------------------------------------------*/
#ifndef__4BITLCM1602_H__
#define__4BITLCM1602_H__
/*******************************************************************************/
//#include//包含52头文件
//#include//包含初试化头文件
//#include
//#include//包含标准函数库头文件
#defineucharunsignedchar
#defineuintunsignedint
//------硬件端口定义--------------------------------
sbitLCM_RS=P2^0;//1602定义引脚
sbitLCM_RW=P2^1;
sbitLCM_E=P2^7;
sbitLCD7=P0^7;
sbitLCD6=P0^6;
sbitLCD5=P0^5;
sbitLCD4=P0^4;
ucharbdatalcdbuff;//声明,全局的、可以位寻址的变量
sbitlcd_buff7=lcdbuff^7;
sbitlcd_buff6=lcdbuff^6;
sbitlcd_buff5=lcdbuff^5;
sbitlcd_buff4=lcdbuff^4;
sbitlcd_buff3=lcdbuff^3;
sbitlcd_buff2=lcdbuff^2;
sbitlcd_buff1=lcdbuff^1;
sbitlcd_buff0=lcdbuff^0;
//------函数(声明)--------------------------------
voidLCMInit(void);//LCM屏初始化
voidR_BF();//读忙标志BF
voidw_com(ucharcom);//写指令函数
voidw_cdata(void);//写数据函数
voidWriteDataLCM(unsignedcharWDLCM);//LCM屏写数据函数(声明)
voidLCD_cls(void);//LCM屏清屏
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);
/******************************************************************************************
*函数名称:
WriteDataLCM
*功能描述:
LCM写数据
******************************************************************************************/
voidWriteDataLCM(ucharWDLCM)
{
R_BF();
lcdbuff=WDLCM;
LCM_RS=1;
LCM_RW=0;
w_cdata();//这里写入字符码
}
/******************************************************************************************
*函数名称:
DisplayListChar
*功能描述:
按指定位置显示一串字符,原来的遇到空格0x20就不显示
*函数说明:
******************************************************************************************/
voidDisplayListChar(ucharX,ucharY,ucharcode*DData)
{
ucharListLength,j;//定义局部变量
ListLength=strlen(DData);//读取字符串长度
X&=0xF;//限制X不能大于15
Y&=0x1;//限制Y不能大于1
if(X<=0xF)//X坐标应小于0xF
{
for(j=0;j{
DisplayOneChar(X,Y,DData[j]);//显示单个字符
X++;
}
}
}
/******************************************************************************************
*函数名称:
DisplayOneChar
*功能描述:
按指定位置显示一个字符
*函数说明:
******************************************************************************************/
voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
X&=0xF;//限制X不能大于15
Y&=0x1;//限制Y不能大于1
if(Y)X|=0x40;//如果Y是“1”,则合成显示第二行时地址码+0x40;
X|=0x80;//合成的、显示位置码,指令码:
1Yxxxxxx(B)
w_com(X);//写入地址码,X数据包含字符的显示位置
WriteDataLCM(DData);//写入数据码,要显示的字符数据
}
/******************************************************************************************
*函数名称:
LCMInit
*功能描述:
LCM初始化
*函数说明:
LCM初始化
******************************************************************************************/
voidLCMInit(void)
{
w_com(0x2c);//功能设置为:
四位数据总线
w_com(0x01);//清屏
w_com(0x06);//设置显示输入模式(AC指针自加1,显示不移位)
w_com(0x0c);//显示开/关设置(设置显示、光标和闪烁开关)
}
/******************************************************************************************
*函数名称:
R_BF
*功能描述:
读忙标志BF
*函数说明:
读忙标志BF
*******************************************************************************************/
voidR_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
*功能描述:
写命令
*函数说明:
主要用来初始化一些设置显示、输入模式、显示开关、光标、移位、功能、地址
*******************************************************************************************/
voidw_com(ucharcom)
{
R_BF();
lcdbuff=com;
LCM_RS=0;
LCM_RW=0;
w_cdata();
}
/******************************************************************************************
*函数名称:
w_cdata
*功能描述:
写命令的公共
*函数说明:
四位数据总线,每发送一字节,先发送高四位,再发送低四位
*******************************************************************************************/
voidw_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清屏
*******************************************************************************************/
voidLCD_cls(void)
{
w_com(0x01);//清屏
}
#endif
以下是C51模块化DELAY.H函数程序
/*--------------------------------------------------------------------------
DELAY.H
延时函数头文件
--------------------------------------------------------------------------*/
#ifndef__DELAY_H__
#define__DELAY_H__
#defineucharunsignedchar
#defineuintunsignedint
//------函数(声明)--------------------------------
voidDelay400Ms(void);//延时400mS函数(子程序)
/******************************************************************************************
*函数名称:
Delay400Ms
*功能描述:
400ms延时
******************************************************************************************/
voidDelay400Ms(void)
{
ucharTempCycA=30;//1周期MPU用30,12周期MPU用5
uintTempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
#endif