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

📄 yejing.c

📁 LCM1602液晶显示驱动程序,8051单片机使用
💻 C
字号:
/*-------------------------------------------------------------------
                      LCD1602.c      1602用的函数
      
                作者:liunian     

                邮箱:liunian_leon@sohu.com

                日期:2008.7.13
              
                版本:V1.0 适合初学者使用
-------------------------------------------------------------------*/

#include<reg51.h>
#include<absacc.h>
#include<intrins.h>


#define uint unsigned int
#define uchar unsigned char

sbit EN=P1^7;         //使能信号
sbit RW=P1^6;         //读写控制信号
sbit RS=P1^5;         //数据命令选择端口
#define D_port P0      //传送数据的端口设为P0,以上端口根据实际硬件电路图可做修改




/****************延时函数******************************/

delay(uint k)
{
    uint i,j;
    for(i=0;i<k;i++)
    {
        for(j=0;j<60;j++){;}
    }
}




/****************查询液晶是否忙*************************/

Checkbusy()
{   
    
    D_port=0xff;                   //P0全部置1,可以查询判断P0口状态,读取液晶的命令
    RS=0;
    RW=1;
    EN=1;
    _nop_();                       //读液晶命令时各控制位的状态几时序
    while(D_port&0x80)             //判断最高位状态,最高位是液晶忙的状态位
    {
        EN=0;
        _nop_();
        _nop_();
        EN=1;
        _nop_();
        _nop_();
    }                             //如果液晶忙,则循环查询
    EN=0;

}

/****************写数据到液晶***************************/

D_write(uchar a)
{    
     Checkbusy();        //检查忙标志位
     D_port=a;
     RS=1;               
     RW=0;
     EN=1;               //写数据各控制位的值既对应的时序
     _nop_();
     _nop_();
     _nop_();           //发送数据,此处是发送到P0口,程序前已经定义
     EN=0;
}

/****************写指令到液晶***************************/

C_write(uchar a)
{
     Checkbusy();        //检查忙标志位
     D_port=a;
     RS=0;
     RW=0;
     EN=1;               //写指令各控制位的值既对应的时序
     
     _nop_();
     _nop_();
     _nop_();           //发送指令,此处是发送到P0口,程序前已经定义
     EN=0;
}

/***************液晶初始化******************************/

Initial()
{
     D_port=0;
     delay(20);
     C_write(0x38);
     delay(10);
     C_write(0x38);
     delay(10);
     C_write(0x38);
     delay(10);
     Checkbusy();
     C_write(0x38);
     Checkbusy();
     C_write(0x08);        //关闭显示
     Checkbusy();       
     C_write(0x01);        //清屏
     Checkbusy();
     C_write(0x06);        //显示光标右移设置
     Checkbusy();
     C_write(0x0c);        //显示开,光标不显示,不闪烁
     delay(5);
}                          //根据1602初始化的指令顺序来初始化LCD,相关初始化步骤可查阅相关资料

/***************设定显示位置函数************************/

setpos(uchar posx,uchar posy)
{
     posx=posx&0xf;                         //将显示在第几位置转为二十六进制,每行总共16个位置
     posy=posy&0x1;                         //设置显示在第几行 
     C_write(posx|posy*0x40+0x80);          //设置位置命令最高位必须为一,所以要加0x80
}


/***************显示一个字符子程序**********************/

displaychar(uchar x,uchar y,uchar a)
{   
     Checkbusy();          //检查忙标志位
     setpos(x,y);          //设置显示位置
     D_write(a);           //将要显示的数据写到液晶
}

/***************显示一串字符串**************************/

displaystring(uchar x,uchar y,unsigned char code *string)
{
     uchar length=0;       //定义一个字符串长度
     Checkbusy();          
     while(string[length]!='\0')     //字符串是以'\0'结束的,因此只要每结束就显示下一字符
     {
     displaychar(x,y,string[length++]);  //显示一个字符子程序
     x++;                               //液晶显示的位置+1
     }
}

/*********************主程序 ***************************************/
 main()
 {
 Initial();
 
  displaychar(5, 0, 0x31);
	 while(1);
	
	}

⌨️ 快捷键说明

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