📄 lcmdrv.h
字号:
/****************************************************************************
* 文件名:LCMDRV.C
* 功能:1602图形液晶模块驱动程序。使用LPC2148的GPIO口控制操作。
* 液晶模块与LPC2148的连接如下所示:
* D0 (7) -- P1.16
* . -- .
* . -- .
* . -- .
* D7 (14) -- P1.23
* RW -- P0.28
* RS -- P0.22
* E -- P0.29
*
* R/W为0进行写操作,为1时进行读操作;
* RS为1表示数据传送, 为0表示命令传送;
* E读写脉冲;
*
*
* 作者:陈柱
* 日期:2007/11/4
****************************************************************************/
#include "config.h"
/* 定义总线起始的GPIO,即D0对应的GPIO值(P1.16) */
#define BUS_NO 8
/* 输出总线数据宏定义 */
#define OutData(dat) IO0CLR =IO0CLR|0xFF<<BUS_NO; IO0SET =IO0SET|(dat&0xff)<<BUS_NO
/* 定义RS控制 */
#define LCM_RS 21
#define SRS() IO1SET =IO1SET|1<<LCM_RS
#define CRS() IO1CLR =IO1CLR|1<<LCM_RS
/* 定义R/W控制 */
#define LCM_RW 22
#define SRW() IO1SET =IO1SET|1<<LCM_RW
#define CRW() IO1CLR =IO1CLR|1<<LCM_RW
/* 定义E控制 */
#define LCM_E 23
#define SE() IO1SET = IO1SET|1<<LCM_E
#define CE() IO1CLR = IO1CLR|1<<LCM_E
/* 定义LCM操作的命令字 */
#define LCM_DISPON 0x3f /* 打开LCM显示 */
#define LCM_STARTROW 0x02 /* 显示起始行0,可以用LCM_STARTROW+x设置起始行。(x<64) */
#define LCM_ADDRSTRX 0xb8 /* 页起始地址,可以用LCM_ADDRSTRX+x设置当前页(即X)。(x<8) */
#define LCM_ADDRSTRY 0x40 /* 列起始地址,可以用LCM_ADDRSTRY+x设置当前列(即Y)。(x<64) */
/*********************************************************************************
* 名称:DELAY5()
* 功能:软件延时函数。用于LCM显示输出时序控制。
* 入口参数:无
* 出口参数:无
**********************************************************************************/
//void DELAY5(void)
//{ int i;
// for(i=0; i<100; i++);
//}
void DELAY5(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/***********************************************************************
* 名称:LCM_WrCommand()
* 功能:写命令子程序
* 入口参数:command 要写入LCM的命令字
* 注:数据口为P0口(作IO口)
***********************************************************************/
void LCM_WrCommand(uint8 command)
{ CE();
CRS(); // RS=0,表示发送命令
CRW();
OutData(command);
DELAY5();
SE();
DELAY5();
CE();
DELAY5();
}
/***********************************************************************
* 名称:LCM_WrData()
* 功能:写数据子程序
* 入口参数:wrdata 要写入LCM的数据
***********************************************************************/
void LCM_WrData(uint8 wrdata)
{ CE();
SRS(); // RS=1,表示发送数据
CRW();
OutData(wrdata);
DELAY5();
SE();
DELAY5();
CE();
DELAY5();
}
/***********************************************************************
* 名称:LCM_WriteByte()
* 功能:向指定点写数据(一字节)。
* 入口参数:x x坐标值(0-15)
* y y坐标值(0-1)
* wrdata 所要写的数据
* 说明:
***********************************************************************/
void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata)
{ x = x&0x0f; // 限制X不能大于15,Y不能大于1
y = y&0x01;
if (y) x |= 0x40; //当要显示第二行时地址码+0x40;
x |= 0x80; // 算出指令码
LCM_WrCommand(x); //这里不检测忙信号,发送地址码
LCM_WrData(wrdata);
}
/***********************************************************************
* 名称:LCM_WriteString()
* 功能:向指定点写数据(一字节)。
* 入口参数:x x坐标值(0-15)
* y y坐标值(0-1)
* wrstring 所要写的数据
* 说明:
***********************************************************************/
void LCM_WriteString(uint8 x, uint8 y, char *wrstring)
{
unsigned char ListLength;
ListLength = 0;
y &= 0x01;
x &= 0x0f; //限制X不能大于15,Y不能大于1
while (wrstring[ListLength]>0x20) //若到达字串尾则退出,字符长度小于32
{
if (x <= 0x0f) //X坐标应小于0xf(15)
{
LCM_WriteByte(x, y, wrstring[ListLength]); //显示单个字符
ListLength++;
x++;
}
}
}
/***********************************************************************
* 名称:LCM_DispIni()
* 功能:LCM显示初始化
* 入口参数:无
* 出口参数:无
* 注:
***********************************************************************/
void LCM_DispIni(void)
{
PINSEL0 &= ~(0xffff<<(2*BUS_NO));
PINSEL2 = PINSEL2 & (~0x08);
// 设置I/O为输出方式
IO0DIR = IO0DIR|(0xff<<BUS_NO);
IO1DIR = IO1DIR|(1<<LCM_RW)|(1<<LCM_RS)|(1<<LCM_E);
OutData(0);
LCM_WrCommand(0x38); //三次显示模式设置,不检测忙信号
DELAY5();
LCM_WrCommand(0x38);
DELAY5();
LCM_WrCommand(0x38);
DELAY5();
LCM_WrCommand(0x38); //显示模式设置,开始要求每次检测忙信号
LCM_WrCommand(0x08); //关闭显示
LCM_WrCommand(0x01); //显示清屏
LCM_WrCommand(0x06); // 显示光标移动设置
LCM_WrCommand(0x0C); // 显示开及光标设置
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -