最后一次优化和调整代码,增加支持keil4的中文注释。
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
/******************************************************************************
|
||||
* 文件名: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
|
||||
Reference in New Issue
Block a user