📄 lcd1602.i
字号:
---------------------------------------------------------------------------*/
unsigned int temp;
/*******************************************************************************************************
** 函数名称: delay_1us
** 功能描述: delay 1 us,16mhz, 1 nop bring 62.5ns delay
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void delay_1us(void)
{
unsigned char i;
for(i = 15; i > 0; i--);
}
/*******************************************************************************************************
** 函数名称: delay_xus
** 功能描述: 延时 N uS
** 输入参数: INT8U t: N 个单位
** 输出参数: 无
********************************************************************************************************/
void delay_xus(unsigned char t)
{
for( ; t>0; t--)
{
delay_1us();
}
}
/*******************************************************************************************************
** 函数名称: lcd_write_cmd
** 功能描述: 最初的初始化设置中,写入数据函数
** 输入参数: INT8U cmd: 命令
** 输出参数: 无
********************************************************************************************************/
void lcd_write_cmd(unsigned char cmd)
{
PORTA &= ~(1 << (7)) ;
if(cmd & (1<<7))
{PORTB |= (1 << (4)) ;}
else
{PORTB &= ~(1 << (4)) ;}
if(cmd & (1<<6))
{PORTD |= (1 << (2)) ;}
else
{PORTD &= ~(1 << (2)) ;}
if(cmd & (1<<5))
{PORTD |= (1 << (3)) ;}
else
{PORTD &= ~(1 << (3)) ;}
if(cmd & (1<<4))
{PORTD |= (1 << (6)) ;}
else
{PORTD &= ~(1 << (6)) ;}
PORTA |= (1 << (6)) ; // E 信号
delay_us(5);
PORTA &= ~(1 << (6)) ;
}
/*******************************************************************************************************
** 函数名称: lcd_write_byte
** 功能描述: 向LCD写入数据
** 输入参数: INT8U byte: 数据
** INT8U type: 类型
** 输出参数: 无
********************************************************************************************************/
void lcd_write_byte(unsigned char byte, unsigned char type)
{
if(type)
{PORTA |= (1 << (7)) ;}
else
{PORTA &= ~(1 << (7)) ;}
temp = byte;
if(byte & (1<<7))
{PORTB |= (1 << (4)) ;}
else
{PORTB &= ~(1 << (4)) ;}
if(byte&(1<<6))
{PORTD |= (1 << (2)) ;}
else
{PORTD &= ~(1 << (2)) ;}
if(byte&(1<<5))
{PORTD |= (1 << (3)) ;}
else
{PORTD &= ~(1 << (3)) ;}
if(byte&(1<<4))
{PORTD |= (1 << (6)) ;}
else
{PORTD &= ~(1 << (6)) ;}
PORTA |= (1 << (6)) ; // E 信号
delay_us(5);
PORTA &= ~(1 << (6)) ;
delay_xus(39); // 39 us!
byte <<= 4;
if(byte & (1<<7))
{PORTB |= (1 << (4)) ;}
else
{PORTB &= ~(1 << (4)) ;}
if(byte & (1<<6))
{PORTD |= (1 << (2)) ;}
else
{PORTD &= ~(1 << (2)) ;}
if(byte & (1<<5))
{PORTD |= (1 << (3)) ;}
else
{PORTD &= ~(1 << (3)) ;}
if(byte & (1<<4))
{PORTD |= (1 << (6)) ;}
else
{PORTD &= ~(1 << (6)) ;}
PORTA |= (1 << (6)) ; // E 信号
delay_xus(5);
PORTA &= ~(1 << (6)) ;
delay_ms(10); // 延时 10 mS
}
/*******************************************************************************************************
** 函数名称: lcd_cls
** 功能描述: 清屏
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_cls()
{
lcd_write_byte(0x01, 0);
}
/*******************************************************************************************************
** 函数名称: lcd_init
** 功能描述: 1602 液晶初始化函数
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_init()
{
// 相关IO配置
DDRB |= (1 << (4)) ;
DDRD |= (1 << (2)) ;
DDRD |= (1 << (3)) ;
DDRD |= (1 << (6)) ;
DDRA |= (1 << (6)) ;
DDRA |= (1 << (7)) ;
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, 0); // 0x28 = 4 位数据线,双行显示,5*7 字型
//LCD_write_byte(0x0e, CMD); // 0x0e = 显示开,光标不闪烁
lcd_write_byte(0x0c, 0); // 0x0c = 显示开,光标不显示
lcd_write_byte(0x06, 0); // 0x06 = 每次输入后光标右移一格
lcd_cls(); // 清屏
}
/*******************************************************************************************************
** 函数名称: lcd_write_char
** 功能描述: 在 X,Y 坐标写单字符
** 输入参数: INT8U lcd_x: x 坐标
** INT8U lcd_y: y 坐标
** INT8U data: 单字符
** 输出参数: 无
********************************************************************************************************/
void lcd_write_char(unsigned char lcd_x, unsigned char lcd_y, unsigned char data)
{
if(lcd_y) // 第二行
{
lcd_write_byte(0xc0+lcd_x, 0);
}
else // 第一行
{
lcd_write_byte(0x80+lcd_x, 0);
}
lcd_write_byte(data, 1);
}
/*******************************************************************************************************
** 函数名称: lcd_locate
** 功能描述: 定位 LCD 行列位置
** 输入参数: INT8U lcd_x: x 坐标
** INT8U lcd_y: y 坐标
** 输出参数: 无
********************************************************************************************************/
void lcd_locate(unsigned char lcd_x, unsigned char lcd_y)
{
if(lcd_y) // 第二行
{
lcd_write_byte(0xc0 + lcd_x, 0);
}
else // 第一行
{
lcd_write_byte(0x80 + lcd_x, 0);
}
}
/*******************************************************************************************************
** 函数名称: lcd_print_string
** 功能描述: 向 LCD 发送显示文字
** 输入参数: char *pstring: 显示文字指针pstring
** 输出参数: 无
********************************************************************************************************/
void lcd_print_string(char *pstring)
{
while(*pstring)
{
lcd_write_byte(*pstring, 1);
pstring++;
}
}
/*******************************************************************************************************
** 函数名称: lcd_print_stringF
** 功能描述: 向 LCD 发送显示文字
** 输入参数: flash char *pstring: 显示文字指针pstring
** 输出参数: 无
********************************************************************************************************/
void lcd_print_stringF(flash char *pstring)
{
while(*pstring)
{
lcd_write_byte(*pstring, 1);
pstring++;
}
}
/*******************************************************************************************************
** 函数名称: lcd_print_number
** 功能描述: 向 LCD 发送显示数据
** 输入参数: INT16S number: 数值, 为有符号的整数
** INT8U ca: 显示的位数 (1 - 6)
** INT8U cb: 其中的小数位数,(类似定点的小数),显示整数时,cb 置 0 即可
** 输出参数: 无
********************************************************************************************************/
void lcd_print_number(int number , unsigned char ca , unsigned char cb)
{
unsigned char _bit[5]; // 最多 5 位
unsigned char *pbit;
unsigned char i;
if(number > 0)
{
temp = number;
}
else
{
temp = -number;
}
// temp = 12345;
// 算出每一位 057920
_bit[4] = (unsigned char)(temp/10000);
_bit[3] = (unsigned char)(temp/1000 - _bit[4]*10);
_bit[2] = (unsigned char)(temp/100 - _bit[4]*100 - _bit[3]*10);
_bit[1] = (unsigned char)(temp/10 - _bit[4]*1000 - _bit[3]*100 - _bit[2]*10);
_bit[0] = (unsigned char)(temp - _bit[4]*10000 - _bit[3]*1000 - _bit[2]*100 - _bit[1]*10);
if(number < 0) // 负值
{
lcd_write_byte('-', 1); //先显示负号
pbit = &(_bit [4]); //指向最高位
for(i = 5 - ca; i > 0; i--)
{
pbit --;
}
while(ca)
{
if(ca == cb)
{
lcd_write_byte('.', 1);
}
lcd_write_byte(*pbit+48, 1);
pbit --;
ca--;
}
}
else // 正数
{
pbit = &(_bit [4]); //指向最高位
for(i = 5 - ca; i > 0; i--)
{
pbit --;
}
while(ca)
{
if(ca == cb)
{
lcd_write_byte('.', 1);
}
lcd_write_byte(*pbit+48,1);
pbit --;
ca--;
}
}
}
/**************************************************************************************×*****************
** END OF FILE
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -