📄 lcd1602.c
字号:
/****************************************Copyright (c)**************************************************
** 智 能 充 电 器 开 发 小 组
** OurAVR 论坛
** QQ 群: 26052247
**
** http://www.ouravr.com/bbs
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: LCD1206.c
**创 建 人: Trinove
**最后修改日期: 2008年01月13日
**描 述: LCD1602字符型液晶的底层函数 FOR AVR MCU / Mega16
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕海安
** 版 本: v1.0
** 日 期: 2008年01月13日
** 描 述: 原始版本
**
**--------------历史版本信息------------------------------------------------------------------------------
** 修改人: martin7wind
** 日 期: 2008年02月03日
** 描 述: For 智能充电器
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 吕海安
** 日 期: 2008年03月02日
** 描 述: 修改格式,归档
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 村长 aleyn.wu
** 日 期: 2008年3月3日
** 描 述: 修改了一些BUG,使本项目能在CVAVR下编译通过
** 增加了一个函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "LCD1602.h"
/*----------------------------------------------------------------------------
四线模式:
LCD: 1602
PIN0~7, RW, E, RS
连线如下:
PIN7 --> PB4
PIN6 --> PD2
PIN5 --> PD3
PIN4 --> PD6
RW --> GND (R/W = 0 write)
E --> PA6 (E = 1 enable )
RS --> PA7 (RS = 0 CMD; RS = 1 DATA )
---------------------------------------------------------------------------*/
#define LCD_DATA7_DDR DDRB
#define LCD_DATA6_DDR DDRD
#define LCD_DATA5_DDR DDRD
#define LCD_DATA4_DDR DDRD
#define LCD_DATA7_PIN PINB
#define LCD_DATA6_PIN PIND
#define LCD_DATA5_PIN PIND
#define LCD_DATA4_PIN PIND
#define LCD_DATA7_PORT PORTB
#define LCD_DATA6_PORT PORTD
#define LCD_DATA5_PORT PORTD
#define LCD_DATA4_PORT PORTD
#define LCD_DATA7 PB4
#define LCD_DATA6 PD2
#define LCD_DATA5 PD3
#define LCD_DATA4 PD6
#define LCD_E_DDR DDRA
#define LCD_E_PORT PORTA
#define LCD_E PA6
#define LCD_E_HIGH BIT_SET(LCD_E_PORT, LCD_E)
#define LCD_E_LOW BIT_CLR(LCD_E_PORT, LCD_E)
#define LCD_RS_DDR DDRA
#define LCD_RS_PORT PORTA
#define LCD_RS PA7
#define LCD_DATA_MODE BIT_SET(LCD_RS_PORT, LCD_RS)
#define LCD_CMD_MODE BIT_CLR(LCD_RS_PORT, LCD_RS)
#define BIT_POSITION7 (1<<7)
#define BIT_POSITION6 (1<<6)
#define BIT_POSITION5 (1<<5)
#define BIT_POSITION4 (1<<4)
#define LINE_1 0
#define LINE_2 1
INT16U temp;
/*******************************************************************************************************
** 函数名称: delay_1us
** 功能描述: delay 1 us,16mhz, 1 nop bring 62.5ns delay
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void delay_1us(void)
{
INT8U i;
for(i = 15; i > 0; i--);
}
/*******************************************************************************************************
** 函数名称: delay_xus
** 功能描述: 延时 N uS
** 输入参数: INT8U t: N 个单位
** 输出参数: 无
********************************************************************************************************/
void delay_xus(INT8U t)
{
for( ; t>0; t--)
{
delay_1us();
}
}
/*******************************************************************************************************
** 函数名称: lcd_write_cmd
** 功能描述: 最初的初始化设置中,写入数据函数
** 输入参数: INT8U cmd: 命令
** 输出参数: 无
********************************************************************************************************/
void lcd_write_cmd(INT8U cmd)
{
LCD_CMD_MODE;
if(cmd & BIT_POSITION7)
{BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
else
{BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
if(cmd & BIT_POSITION6)
{BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
else
{BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
if(cmd & BIT_POSITION5)
{BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
else
{BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
if(cmd & BIT_POSITION4)
{BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
else
{BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
LCD_E_HIGH; // E 信号
delay_us(5);
LCD_E_LOW;
}
/*******************************************************************************************************
** 函数名称: lcd_write_byte
** 功能描述: 向LCD写入数据
** 输入参数: INT8U byte: 数据
** INT8U type: 类型
** 输出参数: 无
********************************************************************************************************/
void lcd_write_byte(INT8U byte, INT8U type)
{
if(type)
{LCD_DATA_MODE;}
else
{LCD_CMD_MODE;}
temp = byte;
if(byte & BIT_POSITION7)
{BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
else
{BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
if(byte&BIT_POSITION6)
{BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
else
{BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
if(byte&BIT_POSITION5)
{BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
else
{BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
if(byte&BIT_POSITION4)
{BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
else
{BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
LCD_E_HIGH; // E 信号
delay_us(5);
LCD_E_LOW;
delay_xus(39); // 39 us!
byte <<= 4;
if(byte & BIT_POSITION7)
{BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
else
{BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
if(byte & BIT_POSITION6)
{BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
else
{BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
if(byte & BIT_POSITION5)
{BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
else
{BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
if(byte & BIT_POSITION4)
{BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
else
{BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
LCD_E_HIGH; // E 信号
delay_xus(5);
LCD_E_LOW;
delay_ms(10); // 延时 10 mS
}
/*******************************************************************************************************
** 函数名称: lcd_cls
** 功能描述: 清屏
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_cls()
{
lcd_write_byte(0x01, CMD);
}
/*******************************************************************************************************
** 函数名称: lcd_init
** 功能描述: 1602 液晶初始化函数
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_init()
{
// 相关IO配置
BIT_SET(LCD_DATA7_DDR, LCD_DATA7);
BIT_SET(LCD_DATA6_DDR, LCD_DATA6);
BIT_SET(LCD_DATA5_DDR, LCD_DATA5);
BIT_SET(LCD_DATA4_DDR, LCD_DATA4);
BIT_SET(LCD_E_DDR, LCD_E);
BIT_SET(LCD_RS_DDR, LCD_RS);
delay_ms(15); // 上电延时15MS以上
lcd_write_cmd(0x30); // 上电初始化命令
delay_ms(5); // delay > 5.1MS
lcd_write_cmd(0x30);
delay_ms(5); // delay > 100us
lcd_write_cmd(0x30);
delay_ms(15);
lcd_write_cmd(0x20); // 四位数据模式
delay_ms(15);
//功能设定
lcd_write_byte(0x28, CMD); // 0x28 = 4 位数据线,双行显示,5*7 字型
//LCD_write_byte(0x0e, CMD); // 0x0e = 显示开,光标不闪烁
lcd_write_byte(0x0c, CMD); // 0x0c = 显示开,光标不显示
lcd_write_byte(0x06, CMD); // 0x06 = 每次输入后光标右移一格
lcd_cls(); // 清屏
}
/*******************************************************************************************************
** 函数名称: lcd_write_char
** 功能描述: 在 X,Y 坐标写单字符
** 输入参数: INT8U lcd_x: x 坐标
** INT8U lcd_y: y 坐标
** INT8U data: 单字符
** 输出参数: 无
********************************************************************************************************/
void lcd_write_char(INT8U lcd_x, INT8U lcd_y, INT8U data)
{
if(lcd_y) // 第二行
{
lcd_write_byte(0xc0+lcd_x, CMD);
}
else // 第一行
{
lcd_write_byte(0x80+lcd_x, CMD);
}
lcd_write_byte(data, DATA);
}
/*******************************************************************************************************
** 函数名称: lcd_locate
** 功能描述: 定位 LCD 行列位置
** 输入参数: INT8U lcd_x: x 坐标
** INT8U lcd_y: y 坐标
** 输出参数: 无
********************************************************************************************************/
void lcd_locate(INT8U lcd_x, INT8U lcd_y)
{
if(lcd_y) // 第二行
{
lcd_write_byte(0xc0 + lcd_x, CMD);
}
else // 第一行
{
lcd_write_byte(0x80 + lcd_x, CMD);
}
}
/*******************************************************************************************************
** 函数名称: lcd_print_string
** 功能描述: 向 LCD 发送显示文字
** 输入参数: char *pstring: 显示文字指针pstring
** 输出参数: 无
********************************************************************************************************/
void lcd_print_string(char *pstring)
{
while(*pstring)
{
lcd_write_byte(*pstring, DATA);
pstring++;
}
}
/*******************************************************************************************************
** 函数名称: lcd_print_stringF
** 功能描述: 向 LCD 发送显示文字
** 输入参数: flash char *pstring: 显示文字指针pstring
** 输出参数: 无
********************************************************************************************************/
void lcd_print_stringF(flash char *pstring)
{
while(*pstring)
{
lcd_write_byte(*pstring, DATA);
pstring++;
}
}
/*******************************************************************************************************
** 函数名称: lcd_print_number
** 功能描述: 向 LCD 发送显示数据
** 输入参数: INT16S number: 数值, 为有符号的整数
** INT8U ca: 显示的位数 (1 - 6)
** INT8U cb: 其中的小数位数,(类似定点的小数),显示整数时,cb 置 0 即可
** 输出参数: 无
********************************************************************************************************/
void lcd_print_number(INT16S number , INT8U ca , INT8U cb)
{
INT8U _bit[5]; // 最多 5 位
INT8U *pbit;
INT8U i;
if(number > 0)
{
temp = number;
}
else
{
temp = -number;
}
// temp = 12345;
// 算出每一位 057920
_bit[4] = (INT8U)(temp/10000);
_bit[3] = (INT8U)(temp/1000 - _bit[4]*10);
_bit[2] = (INT8U)(temp/100 - _bit[4]*100 - _bit[3]*10);
_bit[1] = (INT8U)(temp/10 - _bit[4]*1000 - _bit[3]*100 - _bit[2]*10);
_bit[0] = (INT8U)(temp - _bit[4]*10000 - _bit[3]*1000 - _bit[2]*100 - _bit[1]*10);
if(number < 0) // 负值
{
lcd_write_byte('-', DATA); //先显示负号
pbit = &(_bit [4]); //指向最高位
for(i = 5 - ca; i > 0; i--)
{
pbit --;
}
while(ca)
{
if(ca == cb)
{
lcd_write_byte('.', DATA);
}
lcd_write_byte(*pbit+48, DATA);
pbit --;
ca--;
}
}
else // 正数
{
pbit = &(_bit [4]); //指向最高位
for(i = 5 - ca; i > 0; i--)
{
pbit --;
}
while(ca)
{
if(ca == cb)
{
lcd_write_byte('.', DATA);
}
lcd_write_byte(*pbit+48,DATA);
pbit --;
ca--;
}
}
}
/**************************************************************************************×*****************
** END OF FILE
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -