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

📄 lcd1602.txt

📁 是LCD1602的驱动程序
💻 TXT
字号:
/************************ ***************************************************
程序名称:LCD.C
程序功能:LCD1602驱动程序

****************************************************************************/
#include<reg51.h>
#include<intrins.h>
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit DPORT = P0;


const unsigned char NoDisp = 0;   //无显示
const unsigned char NoCur = 1;    //有显示无光标
const unsigned char CurNoFlash = 2; //有光标但不闪烁
const unsigned char CurFlash = 3;   //有光标且闪烁
void LcdPos( unsigned char, unsigned char );  //确定光标位置
void LcdWd(unsigned char);             //写字符
void LcdWc(unsigned char);             //送控制字(检测忙信号)
void LcdWcn(unsigned char);            //送控制字子程序(不检测忙信号)
void mDelay(unsigned char);            //延时,毫秒数由j决定
void WaitIdle();                       //正常读写操作之前检测LCD控制器状态
void SetCur(unsigned char para);        //设置光标的4种状态
void WriteString(unsigned char *s, unsigned char xPos, unsigned char yPos); //向光标处写字符串
void LcdWc( unsigned char c );          //清屏
void WriteChar(unsigned char c, unsigned char xPos, unsigned char yPos);    //向光标出处写字符
void RstLcd();                          //LCD复位函数

/**************************************************************
函数名称:void WaitIdle()
功能:正常读写操作之前检测LCD控制器状态
**************************************************************/
void WaitIdle()
{
    unsigned char temp;          //定义临时变量
    RS = 0;                   //RS=0输入指令,RS=1输入数据
    RW = 1;                  //RW=1从LCD读取信息,RW=0向LCD写入指令或数据
    E = 1;                   //E=1读取信息,E在下降沿从1到0执行指令
    _nop_();
    for(; ;)
    {
        temp = DPORT;
        temp &= 0x80;
        if ( temp == 0 )          //DB0--DB7全都是0
        {
            break;
        }
    }
    E = 0;                    //执行指令
}



/**************************************************************
函数名称:void mDelay(unsigned  char j)
功能:延时程序,延时时间有变量j决定
**************************************************************/
void mDelay( unsigned char j )
{
    unsigned int i = 0;
    for( ; j>0; j-- )
    {
        for (i=0; i<124; i--)
        {; ;}
    }
}



/**************************************************************
函数名称:void LcdWd(unsigned char c)
功能: 写字符
参数:c 待写字符
**************************************************************/
void LcdWd(unsigned char c)
{
    WaitIdle();       //正常读写之前检测LCD控制器状态
    RS = 1;           //输入数据
    RW = 0;           //向LCD写入指令或数据,这里是写入数据
    DPORT = c;        //将待写字符数据送入LCD端口
    E = 1;
    _nop_();
    _nop_();
    E = 0;           //E的下降沿开始执行指令
}




/**************************************************************
函数名称:void LcdWcn(unsigned char c )
功能:送控制字子程序(不检测忙信号)
参数:c :控制字
**************************************************************/
void LcdWcn( unsigned char c )
{
    RS = 0;         //输入指令
    RW = 0;         // 写入
    DPORT = c;      //送LCD端口
    E = 1;
    _nop_();
    _nop_();
    E = 0;          //下降沿执行指令
}




/**************************************************************
函数名称:void LcdWc(unisgned char c)
功能:送控制字子程序(检测忙信号)
参数:c: 控制字
**************************************************************/
void LcdWc( unsigned char c )
{
    WaitIdle();                       //正常读写操作之前检测LCD控制器状态
        LcdWcn(c);
}




/**************************************************************
函数名称:void ClrLcd()
功能:清屏
**************************************************************/    
void ClrLcd()
{
    LcdWc(0x01);            //调用送控制字子程序,令DB0=1,实现清屏,见手册
}




/**************************************************************
函数名称:void SetCur(unsigned char para)
函数功能:设置光标
参数:para 对应四种光标类型
**************************************************************/
void SetCur(unsigned char para)
{
    mDelay(2);
    switch( para )
    {
        case 0:
        LcdWc(0x08);                     //关显示
        break;
        
        case 1:
        LcdWc(0x0c);                    //开显示但无光标
        break;
        
        case 2:
        LcdWc(0x0f);                    //开显示有光标但不闪烁
        break;
        
        case 3:
        LcdWc(0x0e);                    //开显示有光标且闪烁
        break;
        
        default:
        break;
    }      
    
    
                   


/**************************************************************
函数名称:void LcdPos(unsigned char xPos, unsigned char yPos)
函数功能:设定第(xPos,yPos)个字符的地址
参数:xPos,yPos  光标所在的地址
**************************************************************/
void LcdPos( unsigned char xPos, unsigned char yPos )
{
    unsigned char temp;              //设置临时变量
    xPos &= 0x0f;                    //保证每行不超过16个。x位置范围是0-15
    yPos &= 0x01;                    //y位置范围是0-1    00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 
0BH 0CH 0DH 0EH 0FH ┊
       if ( yPos == 0 )                 //显示第一行        40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 
4CH 4DH 4EH 4FH ┊  
        
            temp = xPos;
        
            
            else
            temp = xPos + 0x40;
            temp |= 0x80;           //根据手册让DB7 = 1 设定DDRAM地址
            LcdWc(temp);
        
}



            
        
                                                                                                       
                                   
/**************************************************************
函数名称:void WriteChar(unsigned char c, unsigned char xPos, unsigned char yPos)
函数功能:在指定的行与列处显示指定的字符
参数:c 待显示的字符;xPos 光标所在行;yPos 光标所在列
**************************************************************/
void WriteChar(unsigned char c, unsigned char xPos, unsigned char yPos)
{
    LcdPos(xPos, yPos);         // 设定要显示字符的地址
    LcdWd(c);                   //写字符c
}





/**************************************************************
函数名称:void WriteString(unsigned char *s,unsigned char xPos, unsigned char yPos)
函数功能:向坐标处写入字符串
参数:*s 指向待显示的字符串,xPos 光标所在行, yPos 光标所在列
说明:如果显示不下,则八字符串多余的截掉
**************************************************************/
void WriteString(unsigned char *s, unsigned char xPos, unsigned char yPos)
{
    unsigned char i;
    if ( *s == 0 )
    return;
    for(i=0; ; i++)
    {
        if ( *(s + i) == 0 )
        break;
        WriteChar(*(s + i), xPos, yPos);
        xPos++;
        if ( xPos >= 15 )
        break;
    }
}




/**************************************************************
函数名称:void RstLcd()
函数功能:LCD复位函数

**************************************************************/
void RstLcd()
{
    mDelay(30);              //延时
    LcdWc(0x38);             //现实模式:数据总线为8位,显示两行,5*7点阵每字符
    LcdWc(0x08);             //显示关闭,具体见手册
    ClrLcd();                //显示清屏,等同与LcdWc(0x01)
    LcdWc(0x10);             //光标光标左移1格,且AC值减1 注:此处与书不同,见手册
        LcdWc(0x0c);             //显示功能开,无光标

//===========================================================================================//
函数名称:void main()
函数功能:LCD1602驱动程序

//===========================================================================================//
    
void main()
{
    unsigned char xPos;          //光标位置
    unsigned char yPos;
    unsigned char *s = "welcome to shenyang!"
    xPos = 0;
    yPos = 0;                    //可以试yPos = 1的情况
        
        RstLcd();                    //复位
        ClrLcd();                    //清屏
        SetCur( CurFlash );          //开启光标有闪烁
        WriteString(s, xPos, yPos);
        for(; ;)
        {;}
}    
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -