⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcm-1602a.c

📁 LCD1602.rar
💻 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 + -