📄 lcm_2002.c
字号:
#include "STC12C.h"
#include "Io.h"
//#define BUSE // 4/8位总线方式开关
#define ROW 20 // 单行显示最大字符个数
/*==============================================
函数原型:static void Delay(unsigned char dat)
函数功能:延时xxms
入口参数:无
出口参数:无
==============================================*/
static void Delay(unsigned char dly)
{
unsigned char i;
do
{
i=250;
while (--i);
i=250;
while (--i);
}
while (--dly);
}
#ifdef BUSE
/*==============================================
函数原型:static void LCM_BF(void)
函数功能:LCM忙检测
入口参数:无
出口参数:无
==============================================*/
static void LCM_BF(void)
{
unsigned char dat;
LCM_RS=0;
LCM_RS=0;
LCM_RW=1;
LCM_RW=1;
do
{
LCM_Port=0xff;
LCM_E=1;
LCM_E=1;
dat=LCM_Port;
LCM_E=0;
LCM_E=0;
}
while ((dat&0x80)==0x80);
}
/*==============================================
函数原型:static void LCM_WT(bit flag,unsigned char dat)
函数功能:以8位数据方式写入LCM
入口参数:bit flag,unsigned char dat
flag=0:写入命令字dat
flag=1:写入数据dat
出口参数:无
==============================================*/
static void LCM_WT(bit flag,unsigned char dat)
{
LCM_RS=flag;
LCM_RS=flag;
LCM_RW=0;
LCM_RW=0;
LCM_Port=dat;
LCM_E=1;
LCM_E=1;
LCM_E=0;
LCM_E=0;
}
/*==============================================
函数原型:void LCM_Init(void)
函数功能:LCM初始化
入口参数:无
出口参数:无
==============================================*/
void LCM_Init(void)
{
LCM_E=0;
LCM_E=0;
Delay(20);
LCM_WT(0,0x30); // 重复送3次 0 0 1 1 * * * *
Delay(1);
LCM_WT(0,0x30);
Delay(1);
LCM_WT(0,0x30);
LCM_BF();
LCM_WT(0,0x38); // 0 0 1 DL N F * * DL=1:8位总线;N=1:两行;F=0:5*7点阵
LCM_BF();
LCM_WT(0,0x8); // 0 0 0 0 1 D C B D=0:显示关;C=0:光标关;B=0:闪烁关
LCM_BF();
LCM_WT(0,0x1); // 0 0 0 0 0 0 0 1 清屏
LCM_BF();
LCM_WT(0,0x6); // 0 0 0 0 0 1 ID S ID=1:增量方式;S=0:无移位
LCM_BF();
LCM_WT(0,0x0c); // 0 0 0 0 1 D C B D=1:显示开;C=0:光标关;B=0:闪烁关
}
#else
/*==============================================
函数原型:static void LCM_BF(void)
函数功能:LCM忙检测
入口参数:无
出口参数:无
==============================================*/
static void LCM_BF(void)
{
unsigned char dat,over_tmr=220;
LCM_RS=0;
LCM_RS=0;
LCM_RW=1;
LCM_RW=1;
do
{
LCM_Port|=0xf0;
LCM_E=1;
LCM_E=1;
LCM_E=1;
dat=LCM_Port&0xf0;
LCM_E=0;
LCM_E=0;
LCM_Port|=0xf0;
LCM_E=1;
LCM_E=1;
LCM_E=1;
dat|=LCM_Port>>4;
LCM_E=0;
LCM_E=0;
}
while ((dat&0x80)==0x80&&--over_tmr);
}
/*==============================================
函数原型:static void LCM_WT_4(unsigned char dat)
函数功能:写入半个字节到LCM
入口参数:unsigned char dat
出口参数:无
==============================================*/
static void LCM_WT_4(unsigned char dat)
{
LCM_Port&=0x0f;
LCM_Port|=dat;
LCM_E=1;
LCM_E=1;
LCM_E=0;
LCM_E=0;
}
/*==============================================
函数原型:static void LCM_WT(bit flag,unsigned char dat)
函数功能:以4位数据方式写入LCM
入口参数:bit flag,unsigned char dat
flag=0:写入命令字dat
flag=1:写入数据dat
出口参数:无
==============================================*/
static void LCM_WT(bit flag,unsigned char dat)
{
LCM_RS=flag;
LCM_RS=flag;
LCM_RW=0;
LCM_RW=0;
LCM_WT_4(dat&0xf0);
LCM_WT_4(dat<<4);
}
/*==============================================
函数原型:void LCM_Init(void)
函数功能:LCM初始化
入口参数:无
出口参数:无
==============================================*/
void LCM_Init(void)
{
LCM_RS=0;
LCM_RS=0;
LCM_RW=0;
LCM_RW=0;
LCM_E=0;
LCM_E=0;
Delay(20);
LCM_WT_4(0x30); // 重复送3次 0 0 1 1 * * * *
Delay(1);
LCM_WT_4(0x30);
Delay(1);
LCM_WT_4(0x30);
Delay(1);
LCM_WT_4(0x20);
LCM_BF();
LCM_WT(0,0x28); // 0 0 1 DL N F * * DL=0:4位总线;N=1:两行;F=0:5*7点阵
LCM_BF();
LCM_WT(0,0x8); // 0 0 0 0 1 D C B D=0:显示关;C=0:光标关;B=0:闪烁关
LCM_BF();
LCM_WT(0,0x1); // 0 0 0 0 0 0 0 1 清屏
LCM_BF();
LCM_WT(0,0x6); // 0 0 0 0 0 1 ID S ID=1:增量方式;S=0:无移位
LCM_BF();
LCM_WT(0,0x0c); // 0 0 0 0 1 D C B D=1:显示开;C=0:光标关;B=0:闪烁关
}
#endif
/*==============================================
函数原型:void LCM_Data(unsigned char dat)
函数功能:显示单个字符
入口参数:unsigned char dat
出口参数:无
==============================================*/
void LCM_Data(unsigned char dat)
{
LCM_BF();
LCM_WT(1,dat);
}
/*==============================================
函数原型:void LCM_Command(unsigned char dat)
函数功能:发送给LCM控制命令
入口参数:unsigned char dat
出口参数:无
==============================================*/
void LCM_Command(unsigned char dat)
{
LCM_BF();
LCM_WT(0,dat);
}
/*==============================================
函数原型:void LCM_Cursor(bit flag,unsigned char row)
函数功能:设置显示坐标
入口参数:
bit flag:0第一行;1第二行
unsigned char row: DDRAM地址row(0-ROW)
出口参数:无
==============================================*/
void LCM_Cursor(bit flag,unsigned char row)
{
if (row>=ROW)
{
row=0;
}
if (flag)
{
row|=0xc0;
}
else
{
row|=0x80;
}
LCM_Command(row);
}
/*==============================================
函数原型:void LCM_String(unsigned char code * pc)
函数功能:显示字符串
入口参数:unsigned char code * pc
出口参数:无
==============================================*/
void LCM_String(unsigned char code * pc)
{
while (*pc)
{
LCM_Data(*pc);
pc++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -