新闻中心

EEPW首页>嵌入式系统>设计应用> STC89C52单片机1602液晶驱动

STC89C52单片机1602液晶驱动

作者: 时间:2016-11-21 来源:网络 收藏
/////////////////////////////////////////////////////////////////////////

实现功能:驱动开发板上的1602液晶,在1602液晶上显示两组字符,所显示的两
组字符一两秒钟的时间来回循环
实验板型号:BS-XYD-C52
实验名称:1602液晶显示实验
编写人:谢应东
编写日期:2012-5-2
/////////////////////////////////////////////////////////////////////////
#include
#include
#include

本文引用地址://m.amcfsurvey.com/article/201611/319225.htm

#define uchar unsigned char//定义unsigned char 为 uchar
#define uintunsigned int//定义unsigned int 为 uint


sbit Duan=P2^6;//定义数码管的段选使能端
sbit Wei =P2^7;//定义数码管的位选使能端

#define Digital_tube_Wei_Enable Wei=1;//开启控制数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0;//关闭控制数码管的位选使能端

#define Digital_tube_Duan_Enable Duan=1;//开启控制数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0;//关闭控制数码管的段选使能端

#define BUSY0x80//lcd忙检测标志
#define LCD_DATAPORT P0//定义P0口为LCD通讯端口

sbit LCD_RS=P3^4;//数据/命令端
sbit LCD_RW=P3^5;//读/写选择端
sbit LCD_EN=P3^6;

uchar code string0[]={"Welcome to KBL"};//第一组字符串当中的顶行
uchar code string1[]={"- Great Embed - "};//第一组字符串当中的底行
uchar code string2[]={"Welcome to KBL"};//第二组字符串当中的顶行
uchar code string3[]={"www.bishenkeji.c"};//第二组字符串当中的底行

void Initial_LCD( void);//LCD初始化子程序
unsigned char ReadStatusLCD();//LCD检测忙子程序
void WriteCommandLCD(uchar WCLCM,uchar BusyC);//写指令到ICM子函数
void WriteDataLCD(uchar WDLCM);//写数据到LCM子函数
void DisplayOneCharLCD(uchar X,uchar Y,uchar DData);//显示指定坐标的
//一个字符子函数
void DisplayListCharLCD(uchar X,uchar Y,uchar code *DData);//显示指定坐标的
//一串字符子函数
/////////////////////////////////////////////////////////////////////////

函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
返回值:
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
式完成,所以如果改变了晶振的频率,请做相应的改变
/////////////////////////////////////////////////////////////////////////

void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber //用for语句实现单片机的延时
{
iValue=107;//107这个数值是通过测定而得
while(iValue--);
}
}
/////////////////////////////////////////////////////////////////////////
函数名称:WriteCommandLCD
函数功能:根据1602液晶的时序,通过单片机给1602液晶写一些相关的命令
参数介绍:cCommand:要写入的1602液晶命令
cBusy:1602液晶是否空闲的标志
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////
void WriteCommandLCD(uchar cCommand,uchar cBusy)
{
if(cBusy)ReadStatusLCD();//检测忙信号
LCD_DATAPORT=cCommand;//要写入的指令
LCD_RS=0;// 选中指令寄存器
LCD_RW=0;// 写模式
LCD_EN=1;// 开启1602液晶使能端
_nop_();// 等待写入指令
_nop_();
_nop_();
LCD_EN=0;// 关闭1602液晶使能端
}
/////////////////////////////////////////////////////////////////////////

函数名称:WriteDataLCD
函数功能:根据1602液晶的时序,通过单片机给1602写入想要写入的数据
参数介绍:cData:要写入1602的数据
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////

void WriteDataLCD(uchar cData)
{
ReadStatusLCD();
LCD_DATAPORT=cData;
LCD_RS=1;// 选中数据寄存器
LCD_RW=0;// 写模式
LCD_EN=1;// 打开1602液晶使能端
_nop_();// 等待写入数据
_nop_();
_nop_();
LCD_EN=0;// 关闭1602液晶使能端
}
/////////////////////////////////////////////////////////////////////////
函数名称:ReadStatusLCD
函数功能:检测液晶是否忙碌
参数介绍:无
返回值:LCD_DATAPORT
注意事项:无
/////////////////////////////////////////////////////////////////////////
unsigned char ReadStatusLCD()
{
LCD_DATAPORT=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_EN=0;
LCD_EN=0;
LCD_EN=1;
while(LCD_DATAPORT&BUSY);
return(LCD_DATAPORT);
}
/////////////////////////////////////////////////////////////////////////
函数名称:Initial_LCD
函数功能:设置单片机的外部中断0和中断1,具体的设置状态都为外部低电平触发,并
且开总中断
参数介绍:无
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////
void Initial_LCD()
{

Digital_tube_Wei_Enable;
LCD_DATAPORT=0xff;
Digital_tube_Wei_Disable;

Digital_tube_Duan_Enable;
LCD_DATAPORT=0X00;
DelayMs(2);
Digital_tube_Duan_Disable;


LCD_DATAPORT=0;
DelayMs(15);
WriteCommandLCD(0x38,0);//三次显示模式设置,不检测忙信号
DelayMs(5);
WriteCommandLCD(0x38,0);
DelayMs(5);
WriteCommandLCD(0x38,0);
DelayMs(5);

WriteCommandLCD(0x38,1);//8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCD(0x08,1);//关闭显示,检测忙信号
WriteCommandLCD(0x01,1);//清屏,检测忙信号
WriteCommandLCD(0x06,1);//显示光标右移设置,检测忙信号
WriteCommandLCD(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号
}
/////////////////////////////////////////////////////////////////////////
函数名称:DisplayOneCharLCD
函数功能:按指定位置显示一个字符,比如说数字,英文字母等
参数介绍:cXCoord:要显示字符在某一行当中的位置
cYCoord:要显示字符在液晶中的行数,比如说第一行或第二行
cData:要显示的字符,比如说1、a等
返回值:
注意事项:限制cXCoord不能大于15,cYCoord不能大于1
/////////////////////////////////////////////////////////////////////////

void DisplayOneCharLCD(uchar cXCoord,uchar cYCoord,uchar cData)
{
cYCoord&=1;//取cYCoord的第一位,其他的全部设置成0
if(cYCoord)cXCoord|=0x40;//若y为1,显示第一行,地址码+0X40
cXCoord|=0x80;//若不为1,则显示第二行,地址码+0X80
WriteCommandLCD(cXCoord,0);//把写入的地址送到1602液晶
WriteDataLCD(cData);//写入要写入的数据
}
/////////////////////////////////////////////////////////////////////////

函数名称:DisplayListCharLCD
函数功能:按指定位置显示一串字符,比如说显示 abcdefg,123456等
参数介绍:cXCoord:要显示字符在某一行当中的位置
cYCoord:要显示字符在液晶中的行数,比如说第一行或第二行
cData:要显示的字符串,比如说123456、adcdgd等
返回值:
注意事项:制cXCoord不能大于15,cYCoord不能大于1
/////////////////////////////////////////////////////////////////////////
void DisplayListCharLCD(uchar cXCoord,uchar cYCoord,uchar code *Data)
{
uchar ListLength=0;//要显示字符串的长度
cYCoord&=0x01;//取cYCoord的第一位,其他的全部设置成0
cXCoord&=0x0f;
while(cXCoord<16)//循环写入要写入的字符串
{
DisplayOneCharLCD(cXCoord,cYCoord,Data[ListLength]);
ListLength++;
cXCoord++;
}
}
/////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:启动1602液晶,在1602液晶上面循环显示2组字符串
参数介绍:无
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////
void main()
{
DelayMs(50);//延时50ms启动
Initial_LCD();//对LCD进行初始化
while(1)
{
DisplayListCharLCD(0,0,string0);//在1602的顶行显示字符串0
DisplayListCharLCD(0,1,string1);//在1602的底行显示字符串1

DelayMs(2000);//延时2s,保留显示字符

DisplayListCharLCD(0,0,string2);//在1602的顶行显示字符串2
DisplayListCharLCD(0,1,string3);//在1602的底行显示字符串3

DelayMs(2000);//延时2s,保留显示字符
}
}



评论


技术专区

关闭