📄 lcm-1602a.c
字号:
/**********************************************************************************************
作者: 李雪川
时间: 2009-7-29
说明: YJD1602A-1液晶显示程序
地址设置:地址为后7位,第8位为1
N=0 一行显示 地址0x00-0x4f
N= 1 两行显示 首行 0x00-0x2f, 次行0x40-0x67
版本: V1
注意:u = LCM_BYTE; ***********特别注意:往往一时大意容易出小错,结果出不来*******
while (u & 0x80); BF=1:忙 BF = 0: 空闲
return(u);
**------------------------------------------------------------------------------------
** 修改信息:
** 修改 人: 李雪川
** 修改日期: 2009-10-25
** 修改内容: 添加液晶测试宏定义,方便测试
***********************************************************************************************/
/* LCM-1602A.C */
#include "LCM-1602A.H"
/*******************************************************************************************
** 函数名称:delay_ms
** 函数功能:延时ms
*******************************************************************************************/
/*******************************************************************************************
** 函数名称: uchar lcm_rdbyte(void)
** 函数功能:向1602a-1读一个数据
*******************************************************************************************/
uchar lcm_rdbyte(void)
{
LCM_RS = 1; /* 读数据 */
LCM_R_W = 1;
LCM_E = 1; /* 高电平有效 */
return(LCM_BYTE);
}
/*******************************************************************************************
** 函数名称: uchar lcm_rdint(void)
** 函数功能:向1602a-1读BF , AC
*******************************************************************************************/
uchar lcm_rdint(void)
{
LCM_BYTE = 0xff;
LCM_RS = 0; /* 读寄存器 */
LCM_R_W = 1;
LCM_E = 1; /* 高电平有效 */
/***u = LCM_BYTE; //***********特别注意:往往一时大意容易出小错,结果出不来*************/
while (LCM_BYTE & 0x80); /* BF=1:忙 BF = 0: 空闲 */
return(LCM_BYTE);
}
/*******************************************************************************************
** 函数名称: void lcm_wrint(uchar byte, uchar busyc)
** 函数功能:向1602a-1写寄存器. 包括些控制字和地址
** 地址设置:地址为后7位,第8位为1
N=0 一行显示 地址0x00-0x4f
N= 1 两行显示 首行 0x00-0x2f, 次行0x40-0x67
*******************************************************************************************/
void lcm_wrint(uchar byte, uchar busyc)
{
if (busyc) lcm_rdint(); /* busyc 为0 忽略遇忙检测 */
// LCM_BYTE = byte;
LCM_RS = 0; /* 写寄存器 */
LCM_R_W = 0;
LCM_BYTE = byte;
LCM_E = 0; /*下降沿有效 */
_nop_();
LCM_E = 1;//////////////////////////////////////////////////////////////////
}
/*******************************************************************************************
** 函数名称: void lcm_wrbyte(uchar byte)
** 函数功能:向1602a-1写一个数据,(写完后ac可设置自动加一)
*******************************************************************************************/
void lcm_wrbyte(uchar byte)
{
lcm_rdint(); /* 遇忙检测 */
LCM_RS = 1; /* 写数据 */
LCM_R_W = 0;
LCM_BYTE = byte;
LCM_E = 0; /*下降沿有效 */
_nop_();
LCM_E = 1;
}
/*******************************************************************************************
** 函数名称: void lcm_ac(uchar x, uchar y)
** 函数功能: 将AC光标移动到指定位置
*******************************************************************************************/
void lcm_ac(uchar x, uchar y)
{
y &= 0x01; /* 算地址 */
x &= 0x0F; //限制X不能大于15,Y不能大于1
if (y) x |= 0x40; //当要显示第二行时地址码+0x40;
x |= 0x80; // 算出指令码
lcm_wrint(x, 0); //这里不检测忙信号,发送地址码
}
/*******************************************************************************************
** 函数名称: void lcm_displist(uchar x, uchar y, uchar *ddata)
** 函数功能:向1602a-1任意地址显示一串字符
*******************************************************************************************/
void lcm_displist(uchar x, uchar y, uchar *ddata)
{
uchar line = x; /* 字符串首列地址 */
uchar listlength = 0;
y &= 0x01;
x &= 0x0F; //限制X不能大于15,Y不能大于1
if (y) line |= 0x40; //当要显示第二行时地址码+0x40;
line |= 0x80; // 算出指令码
lcm_wrint(line, 1); //检测忙信号,发送地址码
while(ddata[listlength] != '\0') //若到达字串尾则退出
{
if (x <= 0x0F) //X坐标应小于0xF
{
// lcm_diapchar(x, y, ddata[listlength]);
lcm_wrbyte(ddata[listlength]);
x++;
listlength++;
}
else
{
break;
}
}
}
/*******************************************************************************************
** 函数名称: void lcm_init()
** 函数功能:1602a-1初始设置
*******************************************************************************************/
void lcm_init()
{
lcm_wrint(0x38,1); /* D4= 1:8位数据接口,0:4位数据接口,D3=1:两行显示 0:一行显示
D2 = 1: 5*10点阵 0 :5*7点阵*/
lcm_wrint(0x08,1); /* 显示开关控制D3=1, D2显示开关,D1光标开关,D0闪烁开关. 1:开,0:关 */
lcm_wrint(0x0e,1);
lcm_wrint(0x01,1); /* 清零 */
lcm_wrint(0x02,1); /* 光标归为到HOME */
lcm_wrint(0x06,1); /* 输入方式设置,D2=1, D1=1:AC自加,0:自减, D0=1:画面平移,0:不动\
这里画面设置为不动*/
//lcm_wrint(0x1c,1); /* 光标画面移位,D3=1:画面移 0:光标移动,D2=1:右移0:左移 */
}
/*--------------------------------宏编译---------------------------------------------------*/
#if LCM_1602A_TEST > 0
void main()
{
uint i = 500000;
uchar code tab1[] = {"zhu yao xing fu!!!!"};
uchar code tab2[] = {" yong yuan! "};
while(i--);
lcm_init();
lcm_wrbyte('a');
lcm_wrbyte('a');
lcm_wrbyte('a');
lcm_wrbyte('a');
lcm_displist(0,1,tab2);
lcm_displist(0,0,tab1);
lcm_rdbyte(); //测试可不要
while(1);
}
#endif
/*----------------------------宏编译结束------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -