📄 lcd.c
字号:
//===========================================================================================
//液晶模块山的电阻设置为并行方式即可
//FileName =lcd.c
//Date =20071214...20071215
//RewriteBy =JLXLS
//LCD FORMAT =16 ASCII CHAR * 2 LINES
//===========================================================================================
//
#include "lcd.h"
#include "delay.h"
//---------------------------------------------------------
//液晶发送半字节的函数
//输入:
// dat 需要发送的数据字节(高半字节有效)
//输出:
// 无
//---------------------------------------------------------
static void lcd_send_nibble(uchar dat)
{
dat &=0xF0;
LCD_DATA_PORT &=0x0F;
LCD_DATA_PORT |=dat;
delay_x1us(1);
LCD_CONTROL_PORT |=BIT(LCD_EN_PIN);
delay_x1us(2);
LCD_CONTROL_PORT &=~BIT(LCD_EN_PIN);
}
//---------------------------------------------------------
//液晶发送字节的函数
//输入:
// data_or_cmd !=0 数据字节标志, =0 指令字节标志
// dat 需要发送的字节
//输出:
// 无
//---------------------------------------------------------
static void lcd_send_byte(uchar data_or_cmd, uchar dat)
{
LCD_CONTROL_PORT &=~BIT(LCD_RS_PIN);
if(data_or_cmd)
{ //数据
LCD_CONTROL_PORT |=BIT(LCD_RS_PIN);
}
else
{ //指令
LCD_CONTROL_PORT &=~BIT(LCD_RS_PIN);
}
delay_x1us(50);
LCD_CONTROL_PORT &=~BIT(LCD_EN_PIN);
//高半字节先发送
lcd_send_nibble(dat);
lcd_send_nibble(dat <<4);
}
//---------------------------------------------------------
//液晶初始化函数,4BIT数据口方式
//输入:
// 无
//输出:
// 无
//---------------------------------------------------------
void lcd_init(void)
{
uchar i;
//引脚初始化,都是输出方式,输出0
LCD_DATA_DDR |= (BIT(LCD_D7) | BIT(LCD_D6) | BIT(LCD_D5) | BIT(LCD_D4));
LCD_CONTROL_DDR |= (BIT(LCD_RS_PIN) | BIT(LCD_RW_PIN) | BIT(LCD_EN_PIN));
LCD_DATA_PORT &= ~(BIT(LCD_D7) | BIT(LCD_D6) | BIT(LCD_D5) | BIT(LCD_D4));
LCD_CONTROL_PORT &= ~(BIT(LCD_RS_PIN) | BIT(LCD_RS_PIN) | BIT(LCD_RS_PIN));
delay_x1ms(50);
//需要硬件上配合将液晶配置为4位接口方式
for(i =1; i <=3; ++i)
{
lcd_send_nibble(0x30);
delay_x1ms(15);
}
lcd_send_nibble(0x20);
lcd_send_byte(WRITE_COMMAND, SET_FUNCTION);
lcd_send_byte(WRITE_COMMAND, DISPLAY_ON);
lcd_send_byte(WRITE_COMMAND, DISPLAY_CLR);
lcd_send_byte(WRITE_COMMAND, ENTRY_MODE);
}
//---------------------------------------------------------
//液晶位置定位函数
//输入:
// x 列位置(1-0x10)
// y 行位置(1-2)
//输出:
// 无
//---------------------------------------------------------
void lcd_gotoxy(uchar x, uchar y)
{
uchar address;
address =LCD_LINE_ONE;
if(y !=1) address =LCD_LINE_TWO;
address +=(x-1);
lcd_send_byte(WRITE_COMMAND, SET_DDRAM|address);
}
//---------------------------------------------------------
//液晶输出控制函数
//输入:
// c 命令:
// LCD_OP_CMD_CLR_SCREEN 清屏
// LCD_OP_CMD_NEXT_LINE 换行,到第二行
// LCD_OP_CMD_BACK_COLUM 退格命令
// 其他,显示字符
//输出:
// 无
//---------------------------------------------------------
void lcd_putc(uchar c)
{
if(c ==LCD_OP_CMD_CLR_SCREEN)
{
lcd_send_byte(WRITE_COMMAND, DISPLAY_CLR);
delay_x1ms(2);
}
else if(c ==LCD_OP_CMD_NEXT_LINE)
{
lcd_gotoxy(1, 2);
}
else if(c ==LCD_OP_CMD_BACK_COLUM)
{
lcd_send_byte(WRITE_COMMAND, CURSOR_BACK);
}
else
{ //显示字节
lcd_send_byte(WRITE_DATA, c);
}
}
//---------------------------------------------------------
//液晶显示字符串
//输入:
// ptr 显示字符串指针
//输出:
// 无
//---------------------------------------------------------
void lcd_print(uchar *ptr)
{
while(*ptr)
{
lcd_putc(*ptr++);
}
}
//End Of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -