Files

152 lines
3.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************************************************************
* 文件名:lcd.c
* 功能:LCD1602 液晶显示驱动
* 说明:支持 4 位和 8 位数据总线模式,由 LCD1602_4PINS 宏控制。
* 当前使用 4 位模式,RS=P2^6,RW=P2^5,EN=P2^7,数据口=P0。
* 编译器:Keil C51
******************************************************************************/
#include"lcd.h"
/******************************************************************************
* 函数名:Lcd1602_Delay1ms
* 功能:毫秒级延时函数(12MHz 晶振,12T 模式)
* 输入:c = 延时毫秒数
* 输出:无
******************************************************************************/
void Lcd1602_Delay1ms(uint c)
{
uchar a, b;
for(; c > 0; c--)
{
for(b = 199; b > 0; b--)
{
for(a = 1; a > 0; a--);
}
}
}
/******************************************************************************
* 函数名:LcdWriteCom
* 功能:向 LCD1602 写入一个 8 位指令
* 输入:com = 指令字节
* 输出:无
* 说明:根据是否定义 LCD1602_4PINS,编译为 4 位或 8 位模式
******************************************************************************/
#ifndef LCD1602_4PINS /* 8 位数据线模式 */
void LcdWriteCom(uchar com)
{
LCD1602_E = 0; /* 使能信号置低 */
LCD1602_RS = 0; /* 选择指令寄存器 */
LCD1602_RW = 0; /* 选择写操作 */
LCD1602_DATAPINS = com; /* 输出指令字节 */
Lcd1602_Delay1ms(1); /* 等待数据稳定 */
LCD1602_E = 1; /* 产生使能脉冲 */
Lcd1602_Delay1ms(5); /* 保持高电平 */
LCD1602_E = 0;
}
#else /* 4 位数据线模式 */
void LcdWriteCom(uchar com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DATAPINS = com; /* 先送高 4 位 */
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(1);
LCD1602_E = 0;
Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; /* 再送低 4 位 */
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(1);
LCD1602_E = 0;
}
#endif
/******************************************************************************
* 函数名:LcdWriteData
* 功能:向 LCD1602 写入一个 8 位数据
* 输入:dat = 数据字节
* 输出:无
******************************************************************************/
#ifndef LCD1602_4PINS /* 8 位数据线模式 */
void LcdWriteData(uchar dat)
{
LCD1602_E = 0; /* 使能信号置低 */
LCD1602_RS = 1; /* 选择数据寄存器 */
LCD1602_RW = 0; /* 选择写操作 */
LCD1602_DATAPINS = dat; /* 输出数据字节 */
Lcd1602_Delay1ms(1);
LCD1602_E = 1; /* 产生使能脉冲 */
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#else /* 4 位数据线模式 */
void LcdWriteData(uchar dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat; /* 先送高 4 位 */
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(1);
LCD1602_E = 0;
Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = dat << 4; /* 再送低 4 位 */
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(1);
LCD1602_E = 0;
}
#endif
/******************************************************************************
* 函数名:LcdInit
* 功能:LCD1602 初始化(设置显示模式、开显示、清屏)
* 输入:无
* 输出:无
******************************************************************************/
#ifndef LCD1602_4PINS /* 8 位数据线模式初始化 */
void LcdInit()
{
LcdWriteCom(0x38); /* 设置显示模式:16x2、5x7 点阵、8 位数据 */
LcdWriteCom(0x0c); /* 开显示,不显示光标 */
LcdWriteCom(0x06); /* 写入数据后地址自动加 1 */
LcdWriteCom(0x01); /* 清屏 */
LcdWriteCom(0x80); /* 设置 DDRAM 起始地址为 0x00(第一行) */
}
#else /* 4 位数据线模式初始化 */
void LcdInit()
{
LcdWriteCom(0x32); /* 从 8 位模式切换为 4 位模式 */
LcdWriteCom(0x28); /* 4 位模式下设置显示模式 */
LcdWriteCom(0x0c); /* 开显示,不显示光标 */
LcdWriteCom(0x06); /* 写入数据后地址自动加 1 */
LcdWriteCom(0x01); /* 清屏 */
LcdWriteCom(0x80); /* 设置 DDRAM 起始地址为 0x00(第一行) */
}
#endif