/********************************************************************
函 数 名: LCD_write_char
功能描述: 写入LCD命令或数据函数,时序参照LCD1602的Datasheet
函数说明: 当命令变量(LCD_Command)为0时写入数据,否则写入命令
调用函数: 无
全局变量: 无
输 入: LCD_Command(欲写入的命令),LCD_Data(欲写入的数据)
返 回: 无
**********************************************************************/
void LCD_write_char(unsigned char LCD_Command,unsigned char LCD_Data)
{
LCD_DATA_DDR=0xff;//设置液晶数据口为输出
/*if (busy) // 是否判忙
{
ReadStatusLcd();
}*/
LCD_EN_LOW();
if(LCD_Command==0)
{
LCD_RS_HIGH();
LCD_RW_LOW();
Delay10uS();
LCD_EN_HIGH();
Delay10uS();
LCD_DATA_PORT=LCD_Data;//写入数据
Delay10uS();
LCD_EN_LOW();
Delay10uS();
LCD_RW_HIGH();
Delay10uS();
}
else
{
LCD_RS_LOW();
LCD_RW_LOW();
Delay10uS();
LCD_EN_HIGH();
Delay10uS();
LCD_DATA_PORT=LCD_Command;//写入命令
Delay10uS();
LCD_EN_LOW();
Delay10uS();
LCD_RW_HIGH();
Delay10uS();
}
}
/********************************************************************
函 数 名: DisplayOneChar
功能描述: LCD1602显示一个字节函数
函数说明: 无
调用函数: 无
全局变量: 无
输 入: XStart(显示位置X),YStart(显示位置Y),DData(显示的内容)
返 回: 无
**********************************************************************/
void DisplayOneChar(unsigned char XStart, unsigned char YStart, unsigned char DData)
{
// 限制x不能大于16,y不能大于1
YStart &= 0x01; // Y的变化范围0 ~ 1
XStart &= 0x0f; // X的变化范围0 ~ 16
if (YStart != 0) // 若Y=1,显示第二行
{
// 当要显示第2行时地址码+40h
XStart |= 0x40;
}
// 指令码为地址+0x80
XStart |= DD_RAM;
LCD_write_char(XStart,0);// 不检测忙信号,发送地址码
DelayMS(1);
LCD_write_char(0,DData);
DelayMS(1);
}
/********************************************************************
函 数 名: DisplayListChar
功能描述: LCD1602显示字符串函数
函数说明: 无
调用函数: 无
全局变量: 无
输 入: XStart(显示位置X),YStart(显示位置Y),pData(显示字符串指针)
返 回: 无
**********************************************************************/
void DisplayListChar(unsigned char XStart, unsigned char YStart,char *pData)
{
unsigned char ListLength = 0; // 字符串长度
// 限制x不能大于16,y不能大于1
YStart &= 0x01;
XStart &= 0x0f;
// XStart坐标应小于16并且若到达字串尾则退出
while (XStart <= 0x0f)
{
if (pData[ListLength] == '\0')
{
return;
}
// 显示单个字符
DisplayOneChar(XStart, YStart, pData[ListLength]);
ListLength++;
XStart++;
}
DDRB = 0x00;
}
#ifndef _lcd1602_h
#define _lcd1602_h
//---------------------------------------------------------
// HD44780 LCD指令集
#define LCD_CLEAR_DISPLAY 0x01 // 清屏
// 光标归位设定,光标移到左上角
#define LCD_Return_Home 0x02
// 设定字符进入模式
// 模式1:光标左移一格,AC值减1,字符全部不动
#define LCE_MODE_SET1 0x04
// 模式2:光标不动,AC值减1,字符全部右移一格
#define LCE_MODE_SET2 0x05
// 模式3:光标右移一格,AC值加1,字符全部不动
#define LCE_MODE_SET3 0x06
// 模式4:光标不动,AC值加1,字符全部右移一格
#define LCE_MODE_SET4 0x07
// 显示器开关
#define LCD_DISPLAY_ON 0x08 // 关显示
// 光标设定模式1
// 光标会出现在地址计数器所指的位置,光标不闪烁
#define LCD_CURSOR_SET1 0x0E
// 光标设定模式2
// 光标会出现在地址计数器所指的位置,光标闪烁
#define LCD_CURSOR_SET2 0x0F
// 光标会出现在地址计数器所指的位置,光标不出现
#define LCD_CURSOR_SET3 0x0C
// 光标显示移位
// 光标左移1格,AC值减1
#define LCD_CURSOR_SHOW_SHIFT1 0x10
// 光标右移1格,AC值加1
#define LCD_CURSOR_SHOW_SHIFT2 0x11
// 字符和光标同时左移1格
#define LCD_CURSOR_SHOW_SHIFT3 0x12
// 字符和光标同时右移1格
#define LCD_CURSOR_SHOW_SHIFT4 0x13
// LCD功能设定(按4位数据)
// 单行显示,字体5x7
#define LCD_FUNCTION_SET01 0x20
// 单行显示,字体5x10
#define LCD_FUNCTION_SET02 0x24
// 双行显示,字体5x7
#define LCD_FUNCTION_SET03 0x28
// 双行显示,字体5x10
#define LCD_FUNCTION_SET04 0x2C
// LCD功能设定(按8位数据)
// 单行显示,字体5x7
#define LCD_FUNCTION_SET1 0x30
// 单行显示,字体5x10
#define LCD_FUNCTION_SET2 0x34
// 双行显示,字体5x7
#define LCD_FUNCTION_SET3 0x38
// 双行显示,字体5x10
#define LCD_FUNCTION_SET4 0x3C
//---------------------------------------
// 自定义字型RAM(CG RAM)地址初始
// #define CG_RAM_ADDRESS 0x40
// 数据显示RAM(DD RAM)地址初始
// #define DD_RAM_ADDRESS 0x80
// RAM类型
#define CG_RAM 0x40 // 自定义字型RAM
#define DD_RAM 0x80 // 数据显示RAM
/*****************************************************************************************
电路连接方式:
数据D0~D7-----PA
RS------------PG0(WR)
RW------------PG1(RD)
EN------------PC7
*****************************************************************************************/
//端口定义
/*
#define LCD_RS_DDR DDRG
#define LCD_RS_PORT PORTG
#define LCD_RS_PIN 0
#define LCD_RW_DDR DDRG
#define LCD_RW_PORT PORTG
#define LCD_RW_PIN 1
#define LCD_EN_DDR DDRC
#define LCD_EN_PORT PORTC
#define LCD_EN_PIN 7
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
#define LCD_RS_HIGH() LCD_RS_PORT |= _BV(LCD_RS_PIN) //RS置高电平
#define LCD_RS_LOW() LCD_RS_PORT &= ~_BV(LCD_RS_PIN) //RS置低电平
#define LCD_RW_HIGH() LCD_RW_PORT |= _BV(LCD_RW_PIN) //RW置高电平
#define LCD_RW_LOW() LCD_RW_PORT &= ~_BV(LCD_RW_PIN) //RW置低电平
#define LCD_EN_HIGH() LCD_EN_PORT |= _BV(LCD_EN_PIN) //EN置高电平
#define LCD_EN_LOW() LCD_EN_PORT &= ~_BV(LCD_EN_PIN) //EN置低电平
*/
#define LCD_RS_DDR DDRA
#define LCD_RS_PORT PORTA
#define LCD_RS_PIN 4
#define LCD_RW_DDR DDRA
#define LCD_RW_PORT PORTA
#define LCD_RW_PIN 5
#define LCD_EN_DDR DDRA
#define LCD_EN_PORT PORTA
#define LCD_EN_PIN 6
#define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR DDRB
#define LCD_DATA_PIN PINB
#define LCD_RS_HIGH() LCD_RS_PORT |= _BV(LCD_RS_PIN) //RS置高电平
#define LCD_RS_LOW() LCD_RS_PORT &= ~_BV(LCD_RS_PIN) //RS置低电平
#define LCD_RW_HIGH() LCD_RW_PORT |= _BV(LCD_RW_PIN) //RW置高电平
#define LCD_RW_LOW() LCD_RW_PORT &= ~_BV(LCD_RW_PIN) //RW置低电平
#define LCD_EN_HIGH() LCD_EN_PORT |= _BV(LCD_EN_PIN) //EN置高电平
#define LCD_EN_LOW() LCD_EN_PORT &= ~_BV(LCD_EN_PIN) //EN置低电平
//unsigned char X=0,Y=0;//全局变量,用于设置显示坐标
void LCD_Init(void);//液晶初始化函数
void LCD_set_xy( unsigned char xx, unsigned char yy );//设置显示的位置
void LCD_write_char(unsigned char LCD_Command,unsigned char LCD_Data);
void DisplayListChar(unsigned char XStart, unsigned char YStart,char *pData);//写入LCD命令或数据函数,时序参照LCD1602的Datasheet
int LCD_putc(unsigned char c);//标准输入流,写一个字节子函数
#endif