【文件属性】:
文件名称:1602 驱动
文件大小:8KB
文件格式:TXT
更新时间:2012-06-01 13:13:11
1602 C
/************************ ***************************************************
程序名称:LCD.C
程序功能:LCD1602驱动程序
****************************************************************************/
#include
#include
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit DPORT = P0;
const unsigned char NoDisp = 0; //无显示
const unsigned char NoCur = 1; //有显示无光标
const unsigned char CurNoFlash = 2; //有光标但不闪烁
const unsigned char CurFlash = 3; //有光标且闪烁
void LcdPos( unsigned char, unsigned char ); //确定光标位置
void LcdWd(unsigned char); //写字符
void LcdWc(unsigned char); //送控制字(检测忙信号)
void LcdWcn(unsigned char); //送控制字子程序(不检测忙信号)
void mDelay(unsigned char); //延时,毫秒数由j决定
void WaitIdle(); //正常读写操作之前检测LCD控制器状态
void SetCur(unsigned char para); //设置光标的4种状态
void WriteString(unsigned char *s, unsigned char xPos, unsigned char yPos); //向光标处写字符串
void LcdWc( unsigned char c ); //清屏
void WriteChar(unsigned char c, unsigned char xPos, unsigned char yPos); //向光标出处写字符
void RstLcd(); //LCD复位函数
/**************************************************************
函数名称:void WaitIdle()
功能:正常读写操作之前检测LCD控制器状态
**************************************************************/
void WaitIdle()
{
unsigned char temp; //定义临时变量
RS = 0; //RS=0输入指令,RS=1输入数据
RW = 1; //RW=1从LCD读取信息,RW=0向LCD写入指令或数据
E = 1; //E=1读取信息,E在下降沿从1到0执行指令
_nop_();
for(; ;)
{
temp = DPORT;
temp &= 0x80;
if ( temp == 0 ) //DB0--DB7全都是0
{
break;
}
}
E = 0; //执行指令
}
/**************************************************************
函数名称:void mDelay(unsigned char j)
功能:延时程序,延时时间有变量j决定
**************************************************************/
void mDelay( unsigned char j )
{
unsigned int i = 0;
for( ; j>0; j-- )
{
for (i=0; i<124; i--)
{; ;}
}
}
/**************************************************************
函数名称:void LcdWd(unsigned char c)
功能: 写字符
参数:c 待写字符
**************************************************************/
void LcdWd(unsigned char c)
{
WaitIdle(); //正常读写之前检测LCD控制器状态
RS = 1; //输入数据
RW = 0; //向LCD写入指令或数据,这里是写入数据
DPORT = c; //将待写字符数据送入LCD端口
E = 1;
_nop_();
_nop_();
E = 0; //E的下降沿开始执行指令
}
/**************************************************************
函数名称:void LcdWcn(unsigned char c )
功能:送控制字子程序(不检测忙信号)
参数:c :控制字
**************************************************************/
void LcdWcn( unsigned char c )
{
RS = 0; //输入指令
RW = 0; // 写入
DPORT = c; //送LCD端口
E = 1;
_nop_();
_nop_();
E = 0; //下降沿执行指令
}
/**************************************************************
函数名称:void LcdWc(unisgned char c)
功能:送控制字子程序(检测忙信号)
参数:c: 控制字
**************************************************************/
void LcdWc( unsigned char c )
{
WaitIdle(); //正常读写操作之前检测LCD控制器状态
LcdWcn(c);
}
/**************************************************************
函数名称:void ClrLcd()
功能:清屏
**************************************************************/
void ClrLcd()
{
LcdWc(0x01); //调用送控制字子程序,令DB0=1,实现清屏,见手册
}
/**************************************************************
函数名称:void SetCur(unsigned char para)
函数功能:设置光标
参数:para 对应四种光标类型
**************************************************************/
void SetCur(unsigned char para)
{
mDelay(2);
switch( para )
{
case 0:
LcdWc(0x08); //关显示
break;
case 1:
LcdWc(0x0c); //开显示但无光标
break;
case 2:
LcdWc(0x0f); //开显示有光标但不闪烁
break;
case 3:
LcdWc(0x0e); //开显示有光标且闪烁
break;
default:
break;
}
/**************************************************************
函数名称:void LcdPos(unsigned char xPos, unsigned char yPos)
函数功能:设定第(xPos,yPos)个字符的地址
参数:xPos,yPos 光标所在的地址
**************************************************************/
void LcdPos( unsigned char xPos, unsigned char yPos )
{
unsigned char temp; //设置临时变量
xPos &= 0x0f; //保证每行不超过16个。x位置范围是0-15
yPos &= 0x01; //y位置范围是0-1 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH
0BH 0CH 0DH 0EH 0FH ┊
if ( yPos == 0 ) //显示第一行 40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH
4CH 4DH 4EH 4FH ┊
temp = xPos;
else
temp = xPos + 0x40;
temp |= 0x80; //根据手册让DB7 = 1 设定DDRAM地址
LcdWc(temp);
}
/**************************************************************
函数名称:void WriteChar(unsigned char c, unsigned char xPos, unsigned char yPos)
函数功能:在指定的行与列处显示指定的字符
参数:c 待显示的字符;xPos 光标所在行;yPos 光标所在列
**************************************************************/
void WriteChar(unsigned char c, unsigned char xPos, unsigned char yPos)
{
LcdPos(xPos, yPos); // 设定要显示字符的地址
LcdWd(c); //写字符c
}
/**************************************************************
函数名称:void WriteString(unsigned char *s,unsigned char xPos, unsigned char yPos)
函数功能:向坐标处写入字符串
参数:*s 指向待显示的字符串,xPos 光标所在行, yPos 光标所在列
说明:如果显示不下,则八字符串多余的截掉
**************************************************************/
void WriteString(unsigned char *s, unsigned char xPos, unsigned char yPos)
{
unsigned char i;
if ( *s == 0 )
return;
for(i=0; ; i++)
{
if ( *(s + i) == 0 )
break;
WriteChar(*(s + i), xPos, yPos);
xPos++;
if ( xPos >= 15 )
break;
}
}
/**************************************************************
函数名称:void RstLcd()
函数功能:LCD复位函数
**************************************************************/
void RstLcd()
{
mDelay(30); //延时
LcdWc(0x38); //现实模式:数据总线为8位,显示两行,5*7点阵每字符
LcdWc(0x08); //显示关闭,具体见手册
ClrLcd(); //显示清屏,等同与LcdWc(0x01)
LcdWc(0x10); //光标光标左移1格,且AC值减1 注:此处与书不同,见手册
LcdWc(0x0c); //显示功能开,无光标
//===========================================================================================//
函数名称:void main()
函数功能:LCD1602驱动程序
//===========================================================================================//
void main()
{
unsigned char xPos; //光标位置
unsigned char yPos;
unsigned char *s = "welcome to shenyang!"
xPos = 0;
yPos = 0; //可以试yPos = 1的情况
RstLcd(); //复位
ClrLcd(); //清屏
SetCur( CurFlash ); //开启光标有闪烁
WriteString(s, xPos, yPos);
for(; ;)
{;}
}