182 lines
4.5 KiB
C
182 lines
4.5 KiB
C
#ifndef _lcd1602_H
|
||
#define _lcd1602_H
|
||
|
||
#include "public.h"
|
||
|
||
//LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位
|
||
#define LCD1602_4OR8_DATA_INTERFACE 0 //默认使用8位数据口LCD1602
|
||
|
||
//管脚定义
|
||
sbit LCD1602_RS=P2^6;//数据命令选择
|
||
sbit LCD1602_RW=P2^5;//读写选择
|
||
sbit LCD1602_E=P2^7; //使能信号
|
||
#define LCD1602_DATAPORT P0 //宏定义LCD1602数据端口
|
||
|
||
|
||
//函数声明
|
||
void lcd1602_init(void);
|
||
void lcd1602_clear(void);
|
||
void lcd1602_show_string(u8 x,u8 y,u8 *str);
|
||
|
||
/*******************************************************************************
|
||
* 函 数 名 : lcd1602_write_cmd
|
||
* 函数功能 : LCD1602写命令
|
||
* 输 入 : cmd:指令
|
||
* 输 出 : 无
|
||
*******************************************************************************/
|
||
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
|
||
void lcd1602_write_cmd(u8 cmd)
|
||
{
|
||
LCD1602_RS=0;//选择命令
|
||
LCD1602_RW=0;//选择写
|
||
LCD1602_E=0;
|
||
LCD1602_DATAPORT=cmd;//准备命令
|
||
delay_ms(1);
|
||
LCD1602_E=1;//使能脚E先上升沿写入
|
||
delay_ms(1);
|
||
LCD1602_E=0;//使能脚E后负跳变完成写入
|
||
}
|
||
#else //4位LCD
|
||
void lcd1602_write_cmd(u8 cmd)
|
||
{
|
||
LCD1602_RS=0;//选择命令
|
||
LCD1602_RW=0;//选择写
|
||
LCD1602_E=0;
|
||
LCD1602_DATAPORT=cmd;//准备命令
|
||
delay_ms(1);
|
||
LCD1602_E=1;//使能脚E先上升沿写入
|
||
delay_ms(1);
|
||
LCD1602_E=0;//使能脚E后负跳变完成写入
|
||
|
||
LCD1602_DATAPORT=cmd<<4;//准备命令
|
||
delay_ms(1);
|
||
LCD1602_E=1;//使能脚E先上升沿写入
|
||
delay_ms(1);
|
||
LCD1602_E=0;//使能脚E后负跳变完成写入
|
||
}
|
||
#endif
|
||
|
||
/*******************************************************************************
|
||
* 函 数 名 : lcd1602_write_data
|
||
* 函数功能 : LCD1602写数据
|
||
* 输 入 : dat:数据
|
||
* 输 出 : 无
|
||
*******************************************************************************/
|
||
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
|
||
void lcd1602_write_data(u8 dat)
|
||
{
|
||
LCD1602_RS=1;//选择数据
|
||
LCD1602_RW=0;//选择写
|
||
LCD1602_E=0;
|
||
LCD1602_DATAPORT=dat;//准备数据
|
||
delay_ms(1);
|
||
LCD1602_E=1;//使能脚E先上升沿写入
|
||
delay_ms(1);
|
||
LCD1602_E=0;//使能脚E后负跳变完成写入
|
||
}
|
||
#else
|
||
void lcd1602_write_data(u8 dat)
|
||
{
|
||
LCD1602_RS=1;//选择数据
|
||
LCD1602_RW=0;//选择写
|
||
LCD1602_E=0;
|
||
LCD1602_DATAPORT=dat;//准备数据
|
||
delay_ms(1);
|
||
LCD1602_E=1;//使能脚E先上升沿写入
|
||
delay_ms(1);
|
||
LCD1602_E=0;//使能脚E后负跳变完成写入
|
||
|
||
LCD1602_DATAPORT=dat<<4;//准备数据
|
||
delay_ms(1);
|
||
LCD1602_E=1;//使能脚E先上升沿写入
|
||
delay_ms(1);
|
||
LCD1602_E=0;//使能脚E后负跳变完成写入
|
||
}
|
||
#endif
|
||
|
||
/*******************************************************************************
|
||
* 函 数 名 : lcd1602_init
|
||
* 函数功能 : LCD1602初始化
|
||
* 输 入 : 无
|
||
* 输 出 : 无
|
||
*******************************************************************************/
|
||
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
|
||
void lcd1602_init(void)
|
||
{
|
||
lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
|
||
lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
|
||
lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
|
||
lcd1602_write_cmd(0x01);//清屏
|
||
}
|
||
#else
|
||
void lcd1602_init(void)
|
||
{
|
||
lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符
|
||
lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
|
||
lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
|
||
lcd1602_write_cmd(0x01);//清屏
|
||
}
|
||
#endif
|
||
|
||
/*******************************************************************************
|
||
* 函 数 名 : lcd1602_clear
|
||
* 函数功能 : LCD1602清屏
|
||
* 输 入 : 无
|
||
* 输 出 : 无
|
||
*******************************************************************************/
|
||
void lcd1602_clear(void)
|
||
{
|
||
lcd1602_write_cmd(0x01);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* 函 数 名 : lcd1602_show_string
|
||
* 函数功能 : LCD1602显示字符
|
||
* 输 入 : x,y:显示坐标,x=0~15,y=0~1;
|
||
str:显示字符串
|
||
* 输 出 : 无
|
||
*******************************************************************************/
|
||
void lcd1602_show_string(u8 x,u8 y,u8 *str)
|
||
{
|
||
u8 i=0;
|
||
|
||
if(y>1||x>15)return;//行列参数不对则强制退出
|
||
|
||
if(y<1) //第1行显示
|
||
{
|
||
while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
|
||
{
|
||
if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
|
||
{
|
||
lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置
|
||
}
|
||
else
|
||
{
|
||
lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置
|
||
}
|
||
lcd1602_write_data(*str);//显示内容
|
||
str++;//指针递增
|
||
i++;
|
||
}
|
||
}
|
||
else //第2行显示
|
||
{
|
||
while(*str!='\0')
|
||
{
|
||
if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
|
||
{
|
||
lcd1602_write_cmd(0x80+0x40+i+x);
|
||
}
|
||
else
|
||
{
|
||
lcd1602_write_cmd(0x80+i+x-16);
|
||
}
|
||
lcd1602_write_data(*str);
|
||
str++;
|
||
i++;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
#endif |