LCD1602快速显示程序附真实序列图.docx
《LCD1602快速显示程序附真实序列图.docx》由会员分享,可在线阅读,更多相关《LCD1602快速显示程序附真实序列图.docx(12页珍藏版)》请在冰豆网上搜索。
LCD1602快速显示程序附真实序列图
LCD1602快速显示源程序(附真实序列图)
/**********************************************************************
*文件名称:
LCD1602.c
*当前版本:
1.0
*功能:
LCD1602字符液晶的驱动实现
*作者:
杜运福
*完成时间:
2013-01-04
*原始版本:
1.0
*修改人员、时间、版本及修改内容:
*其他说明:
**********************************************************************/
#ifndefLCD1602_H
#defineLCD1602_H
/*公共类型定义*/
typedefunsignedcharuint8;
typedefsignedcharsint8;
typedefunsignedshortuint16;
typedefsignedshortsint16;
typedefunsignedlonguint32;
typedefsignedlongsint32;
/*
*函数名称:
LCD_WriteCMD
*功能描述:
写单个命令
*输入参数:
CMD命令字节,低7位有效
*输出参数:
无
*返回值:
0执行成功,-1执行失败
*其它说明:
*修改日期修改人修改内容
*-----------------------------------------------
*XXXX-XX-XXXXXXXXXX
*/
sint8LCD_WriteCMD(uint8CMD);
/*
*函数名称:
LCD_SetPos
*功能描述:
设置显示位置
*输入参数:
XPos行位置1,2;YPos列位置,1~16
*输出参数:
无
*返回值:
0执行成功,-1执行失败
*其它说明:
*0x00----------------0x0f0x10-------0x27第一行(一次显示16个字符)
*0x40----------------0x4f0x50-------0x67第二行
*修改日期修改人修改内容
*-----------------------------------------------
*XXXX-XX-XXXXXXXXXX
*/
sint8LCD_SetPos(uint8XPos,uint8YPos);
/*
*函数名称:
LCD_WriteByte
*功能描述:
写入单个字节显示数据
*输入参数:
Byte待写入字节数据
*输出参数:
无
*返回值:
0执行成功,-1执行失败
*其它说明:
*修改日期修改人修改内容
*-----------------------------------------------
*XXXX-XX-XXXXXXXXXX
*/
sint8LCD_WriteByte(uint8Byte);
/*
*函数名称:
LCD_DispChar
*功能描述:
指定位置显示单个字符
*输入参数:
XPos行位置1,2;YPos列位置,1~16
*ch待显示字符
*输出参数:
无
*返回值:
0执行成功,<0执行失败
*其它说明:
当行或列位置不合法时,不设置显示位置,直接在当前光标处显示
*修改日期修改人修改内容
*-----------------------------------------------
*XXXX-XX-XXXXXXXXXX
*/
sint8LCD_DispChar(uint8XPos,uint8YPos,charch);
/*
*函数名称:
LCD_DispString
*功能描述:
指定位置显示字符串
*输入参数:
XPos行位置1,2;YPos列位置,1~16
*pStr待显示字符串首地址
*输出参数:
无
*返回值:
0执行成功,<0执行失败
*其它说明:
当行或列位置不合法时,不设置显示位置,直接在当前光标处显示
*修改日期修改人修改内容
*-----------------------------------------------
*XXXX-XX-XXXXXXXXXX
*/
sint8LCD_DispString(uint8XPos,uint8YPos,constchar*pStr);
/*
*函数名称:
LCD_Init
*功能描述:
初始化LCD1602
*输入参数:
无
*输出参数:
无
*返回值:
0执行成功,-1执行失败
*其它说明:
8位数据总线模式、5*7点阵字符、AC自增、屏不移动、光标不显示、不闪烁
*常用命令:
0x38:
16*2显示,5*7点阵显示字符,8位数据;指令执行时间40us
*0x0C:
开显示,关光标40us
*0x08:
关显示,关光标40us
*0x06:
写完数据自动右移光标,普通情形,从左向右显示40us
*0x04:
写完数据自动左移光标,可以从右向左显示40us
*0x01:
清除显示内容,即清屏1.64ms
*0x02:
使光标还回起始位置1.64ms
*0x18:
屏幕上所有字符同时左移一格,适合滚动显示40us
*0x1C:
屏幕上所有字符同时右移一格,适合滚动显示40us
*修改日期修改人修改内容
*-----------------------------------------------
*XXXX-XX-XXXXXXXXXX
*/
sint8LCD_Init(void);
#endif/*endLCD1602_H*/
/**********************************************************************
*文件名称:
LCD1602.c
*当前版本:
1.0
*功能:
LCD1602字符液晶的驱动实现
*作者:
杜运福
*完成时间:
2013-01-04
*原始版本:
1.0
*修改人员、时间、版本及修改内容:
*其他说明:
**********************************************************************/
#include
#include
#include"LCD1602.h"
/*LCD1602引脚定义*/
#defineLCD_CTRLP2/*LCD控制口*/
#defineEN0x80/*P2.7*/
#defineRS0x40/*P2.6*/
#defineRW0x20/*P2.5*/
#defineLCD_DATAP0/*LCD数据口*/
#defineLCD_DATAIN_SETLCD_DATA=0xFF/*数据口输入设置宏*/
/*控制线置位与复位带参宏定义*/
#defineSET(X)LCD_CTRL|=(X)
#defineRESET(X)LCD_CTRL&=~(X)
/*读取LCD忙状态BFbit7*/
#defineLCD_STATELCD_DATA&0x80
/*延时1us宏定义*/
#defineNOP()_nop_()
/*
*延时N毫秒
*/
staticvoidDelayNms(intN)
{
inti=0;
while(N--)
{
for(i=0;i<75;i++)
{}
}
}
/*等待LCD空闲,BF=0*/
staticvoidLCD_WaitIdle(void)
{
uint8State=0;
/*读BF时序建立*/
RESET(RS);
SET(RW);
SET(EN);
/*设置BF对应引脚为输入*/
LCD_DATAIN_SET;
/*等待BF=0,LCD空闲*/
while((State=LCD_STATE)!
=0);
/*拉低LCD使能*/
RESET(EN);
}
/*写一个字节命令*/
sint8LCD_WriteCMD(uint8CMD)
{
/*若为无效命令,则直接返回*/
if((CMD&0x3F)==0)
{
return-1;
}
LCD_DATA=CMD;
RESET(RS);
RESET(RW);
SET(EN);
RESET(EN);/*产生下降沿,启动写入操作*/
LCD_WaitIdle();/*等待LCD空闲*/
return0;
}
/*设置显示位置*/
sint8LCD_SetPos(uint8XPos,uint8YPos)
{
uint8Pos=0;
if((XPos!
=1)&&(XPos!
=2))/*判断行坐标是否合法*/
{
return-1;
}
if(YPos>40)/*每行有40个地址*/
{
return-1;
}
if(XPos==1)/*第一行*/
{
Pos=0x00+YPos-1;
}
else/*第二行*/
{
Pos=0x40+YPos-1;
}
LCD_DATA=Pos|0x80;
RESET(RS);
RESET(RW);
SET(EN);
RESET(EN);/*产生下降沿*/
LCD_WaitIdle();/*等待LCD空闲*/
return0;
}
/*写入一个字节数据*/
sint8LCD_WriteByte(uint8Byte)
{
if(Byte==0)
{
return-1;
}
LCD_DATA=Byte;
SET(RS);
RESET(RW);
SET(EN);
RESET(EN);/*产生下降沿*/
LCD_WaitIdle();/*等待LCD空闲*/
return0;
}
/*指定位置显示一个字符*/
sint8LCD_DispChar(uint8XPos,uint8YPos,charch)
{
sint8ret=0;
ret+=LCD_SetPos(XPos,YPos);
ret+=LCD_WriteByte((uint8)ch);
returnret;
}
/*指定位置显示一个字符串*/
sint8LCD_DispString(uint8XPos,uint8YPos,constchar*pStr)
{
sint8ret=0;
sint8Cnt=0;
ret+=LCD_SetPos(XPos,YPos);
/*逐个显示字符,最多可以显示41-YPos个字符(含超出一屏的内容)
例:
YPos=1,则Cnt范围为0~39*/
while((pStr[Cnt]!
='\0')&&(Cnt<=40-YPos))
{
ret+=LCD_WriteByte((uint8)pStr[Cnt]);
Cnt++;
}
if(Cnt+YPos>40)/*字符串过长!
!
*/
{
ret=-1;
}
returnret;
}
/*LCD1602初始化*/
sint8LCD_Init(void)
{
/*上电等待LCD硬件自动复位完成,不少于10ms*/
DelayNms(10);
/*关显示*/
LCD_WriteCMD(0x08);
/*功能设置,两行显示、5*7点阵字体、8位数据总线*/
LCD_WriteCMD(0x38);
/*设置输入模式,AC自动加1,显示不移位,光标自动移位*/
LCD_WriteCMD(0x06);
/*开显示,关光标,关闪烁*/
LCD_WriteCMD(0x0C);
/*清显示,清除DDRAM,光标归位*/
LCD_WriteCMD(0x01);
return0;
}
/*
*文件名称:
main.c
*LCD1602模块测试程序
*/
#include
#include
#include"LCD1602.h"
/*延时N个10us*/
staticvoidDelayN10us(uint16N)
{
while(N--);
}
intmain()
{
LCD_Init();
while
(1)
{
LCD_DispString(2,2,"Welcome!
!
");
DelayN10us(65535);
DelayN10us(65535);
LCD_WriteCMD(0x01);
LCD_DispString(2,2,"Hello!
!
");
DelayN10us(65535);
DelayN10us(65535);
LCD_WriteCMD(0x01);
//DelayN10us(65535);
}
return0;
}
写清屏命令0x01序列图:
写模式设置命令0x38序列图:
写显示地址序列图:
写一字节数据序列图:
注:
以上序列图为本人亲测!
!