📄 lcd1602.c
字号:
/***************************************************
* LCM1602驱动函数
* 文件名;LCD1602.c
* 硬 件:LCM1602
* 时 钟:16MHz
* 2008-3-10
* WeiJ
* 主要功能 驱动LCM1602
* 1602LCM接口
P0.7-D7(BF)
P0.6-D6
P0.5-D5
P0.4-D4
P0.3-e
P0.2-rw
P0.1-rs
***************************************************/
sbit LCD_RS = P2^1;
sbit LCD_RW = P2^2;
sbit LCD_EN = P2^3;
#define LCD_DATA_PORT P2
const unsigned char num[16]="0123456789ABCDEF";
/************************************************************************
* 名称 :void lcmDelay(unsigned long i)
* 功能 :为LCD设定一个延时
* 输入 :NULL
* 全局变量 :NULL
* 返回值 :无
* 调用 :NULL
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
************************************************************************/
void lcmDelay(unsigned long i)
{
unsigned int a;
for(a=0;a<i;a++);
}
/************************************************************************
* 名称 :uchar readBusy
* 功能 :读忙,检查LCD1602内部是否正在执行操作
* 输入 :NULL
* 全局变量 :NULL
* 返回值 :NULL
* 调用 :NULL
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
************************************************************************/
void readBusy(void)
{
//_delay_ms(1000);//直接用延时代替读忙以防LCM出错导致的死机
//return;
lcmDelay(100);
LCD_RS = 0; //RS=0
LCD_RW = 1; //RW=1
LCD_EN = 1; //EN=1
lcmDelay(20);
while ( LCD_DATA_PORT & 0x80) lcmDelay(20);
LCD_EN = 0; //EN=0
LCD_RW = 0; //RW=0
LCD_RS = 0; //RS=0
}
/*********************************************************
* 名称 :void writeByteLCD(uchar cmd;uchar dataOrCmd)
* 功能 :写命令到LCD,指令格式:EN=1 RS=0 RW=0
写数据到LCD,数据格式:EN=1 RS=1 RW=0
cmd = 1:写指令 cmd = 0:写数据
* 输入 :uchar dataOrCmd,要显示的数据或要控制LCD的命令
* 全局变量 :NULL
* 返回值 :NULL
* 调用 :NULL
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
*********************************************************/
void writeByteLCD(uchar cmd,uchar dataOrCmd) //写入命令
{
//_delay_us(500); //用延时代替读忙
readBusy();
lcmDelay(20);
if( cmd )
{
LCD_RS = 0; //RS=0,指令
}
else
{
LCD_RS = 1; //RS=1,数据
}
LCD_EN = 0; //EN=0
LCD_RW = 0; //RW=0
LCD_DATA_PORT &= 0X0F; //portc4~7=0,先清零数据口
LCD_DATA_PORT |= dataOrCmd&0xF0; //send high 4bit
LCD_EN = 1; //EN端产生一个由低电平变高电平,写LCD
LCD_EN = 0; //EN端产生一个由高电平变低电平,为写低四位数据做准备
LCD_DATA_PORT &= 0X0F; //portc4~7=0,先清零数据口
LCD_DATA_PORT |= (dataOrCmd<<4)&0xF0; //send low 4bit
LCD_EN = 1; //EN端产生一个由低电平变高电平,写LCD
LCD_EN = 0; //关闭使能信号,以免写入错误数据
}
/************************************************************
* 名称 :void initLCD(void)
* 功能 :初始化液晶屏1602
* 调用 :void writeLCDCommand(uchar cmd)
* 全局变量 :NULL
* 返回值 :NULL
* 调用 :NULL
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
************************************************************/
void initLCD(void)
{
writeByteLCD(1,0x30);
writeByteLCD(1,0x30);
writeByteLCD(1,0x02);
writeByteLCD(1,0x30);
writeByteLCD(1,0x28); //显示模式设置以后都查测忙信号,设置4总线共有16*2字,每字有5*10(5*7)点阵
writeByteLCD(1,0x01); //显示清屏
writeByteLCD(1,0x02); //地址归位
writeByteLCD(1,0x0C); //显示关闭
writeByteLCD(1,0x14); //显示光标移动设置,光标移动,显示区不移动
}
/*************************************************
* 名称 :void LCDSetxy( uchar X, uchar Y )
* 功能 :定位要显示的数据在液晶屏上的位置
* 输入 :unsigned char X, unsigned char Y
显示字符串的位置,X:0-15,Y:0-1
LCD第一行显示寄存器地址:0X80-0X8F
LCD第一行显示寄存器地址:0XC0-0XCF
* 全局变量 :NULL
* 返回值 :NULL
* 调用 :void writeLCDCommand(uchar cmd)
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
*************************************************/
void LCDSetxy( unsigned char X, unsigned char Y )
{
unsigned char address;
if (Y == 0)
{
address = 0x80 + X;
}
else
{
address = 0xC0 + X;
}
writeByteLCD(1,address);
}
/***************************************************************************
* 名称 :void LCDDisChar(uchar X,uchar Y,uchar data)
* 功能 :显示单个英文字符
* 输入 :uchar X, uchar Y,char data
显示字符串的位置,X:0-15,Y:0-1
LCD第一行显示寄存器地址:0X80-0X8F
LCD第一行显示寄存器地址:0XC0-0XCF
data:要显示的字符的ACSI码
* 全局变量 :NULL
* 返回值 :NULL
* 调用 :void LCD_set_xy( unsigned char X, unsigned char Y )
void writeLCDData(uchar dat)
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
***************************************************************************/
void LCDDisChar(uchar X,uchar Y,char dis_data)
{
LCDSetxy( X, Y );
writeByteLCD(0,dis_data);
}
/*************************************************
* 名称 :void LCDDisString(unsigned char X,unsigned char Y,char *s)
* 功能 :显示英文字符串
* 输入 :unsigned char X, unsigned char Y,char *s
显示字符串的位置,X:0-15,Y:0-1
LCD第一行显示寄存器地址:0X80-0X8F
LCD第一行显示寄存器地址:0XC0-0XCF
*s:英文字符串指针;
* 全局变量 :NULL
* 返回值 :NULL
* 调用 :void LCD_set_xy( unsigned char X, unsigned char Y )
void writeLCDData(uchar dat)
* 编写日期 :2008-2-29
* 最后修改日期 :2008-2-29
*************************************************/
void LCDDisString(unsigned char X,unsigned char Y,char *s)
{
while ( *s )
{
//LCDSetxy( X, Y );
//writeLCDData( *s );
LCDDisChar( X, Y,*s);
s ++;
X ++;
if (16 == X) //显示超出一行时进行处理
{
if (0 == Y)
{
Y = 1;
X = 0;
}
else
{
Y = 0;
X = 0;
} //End of if (0 == Y)
} // End of if (17 == X)
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -