• STC51单片机32——液晶1602显示


    //用LCD循环右移显示字符
    //开发板上的跳帽连接Vcc
    #include    //包含单片机寄存器的头文件
    #include  //包含_nop_()函数定义的头文件

    sbit E=P2^7;     //使能信号位,将E位定义为P2.7引脚
    sbit RS=P2^6;    //寄存器选择位,将RS位定义为P2.6引脚
    sbit RW=P2^5;    //读写选择位,将RW位定义为P2.5引脚
    sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
    unsigned char code string1[ ]={"Welcome to China"};
    unsigned char code string2[ ]={"Hello!"};
    /*****************************************************
    函数功能:延时1ms
    (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
    ***************************************************/
    void delay1ms()
    {
       unsigned char i,j;    
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;        
     }
     /*****************************************************
    函数功能:延时若干毫秒
    入口参数:n
    ***************************************************/
     void delay(unsigned int n)
     {
       unsigned int i;
        for(i=0;i        delay1ms();
     }
    /*****************************************************
    函数功能:判断液晶模块的忙碌状态
    返回值:result。result=1,忙碌;result=0,不忙
    ***************************************************/
     unsigned char BusyTest(void)
      {
        bit result;
        RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
        RW=1;
        E=1;        //E=1,才允许读写
        _nop_();   //空操作
        _nop_();
        _nop_();
        _nop_();   //空操作四个机器周期,给硬件反应时间    
        result=BF;  //将忙碌标志电平赋给result
        E=0;
        return result;
      }
    /*****************************************************
    函数功能:将模式设置指令或显示地址写入液晶模块
    入口参数:dictate
    ***************************************************/
    void WriteInstruction (unsigned char dictate)
    {   
        while(BusyTest()==1); //如果忙就等待
         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
         RW=0;   
         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
                                 // 就是让E从0到1发生正跳变,所以应先置"0"
         _nop_();
         _nop_();             //空操作两个机器周期,给硬件反应时间
         P0=dictate;            //将数据送入P0口,即写入指令或地址
         _nop_();
         _nop_();
         _nop_();
         _nop_();               //空操作四个机器周期,给硬件反应时间
         E=1;                   //E置高电平
         _nop_();
         _nop_();
         _nop_();
         _nop_();               //空操作四个机器周期,给硬件反应时间
          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
         delay(1);
     }
    /*****************************************************
    函数功能:指定字符显示的实际地址
    入口参数:x
    ***************************************************/
     void WriteAddress(unsigned char x)
     {
         WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
     }
    /*****************************************************
    函数功能:将数据(字符的标准ASCII码)写入液晶模块
    入口参数:y(为字符常量)
    ***************************************************/
     void WriteData(unsigned char y)
     {
        while(BusyTest()==1);  
          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
          RW=0;
          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
                           // 就是让E从0到1发生正跳变,所以应先置"0"
          P0=y;           //将数据送入P0口,即将数据写入液晶模块
          _nop_();
          _nop_();
           _nop_();
         _nop_();       //空操作四个机器周期,给硬件反应时间
          E=1;          //E置高电平
          _nop_();
          _nop_();
          _nop_();
         _nop_();        //空操作四个机器周期,给硬件反应时间
         E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
     }
    /*****************************************************
    函数功能:对LCD的显示模式进行初始化设置
    ***************************************************/
    void LcdInitiate(void)
    {
       delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
       WriteInstruction(0x38);  //16×2显示,5×7点阵,8位数据接口
         delay(5);   //延时5ms
         WriteInstruction(0x0f);  //显示开,有光标,光标闪烁
         WriteInstruction(0x06);  //光标右移,字符不移
         WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
     }
    void main(void)            //主函数
     {
      unsigned char i;
      LcdInitiate();         //调用LCD初始化函数  
      delay(10);
      while(1)
      {
        WriteInstruction(0x01);//清显示:清屏幕指令
            WriteAddress(0x00);  // 设置显示位置为第一行的第1个字
          i = 0;
            while(string1[i] != '\0')
            {                        // 显示字符
                        WriteData(string1[i]);
                        i++;
                        delay(50);
            }
          i = 0;
            WriteAddress(0x40);  // 设置显示位置为第二行的第1个字
            while(string2[i] != '\0')
            {                        // 显示字符
                        WriteData(string2[i]);
                        i++;
                        delay(50);
            }        
            delay(2000);
        }
                  
            
    }

    完整资料打包(含仿真):

    STC51单片机32-液晶1602显示-单片机文档类资源-CSDN下载

  • 相关阅读:
    N皇后-力扣
    pytest-gitignore插件详解
    在 Spring 4.3.9下升级 Velocity 1.7.x to Velocity 2.0.x 出现的问题
    Lvs+Nginx+NDS
    esp32c3 nuttx 移植 micropython 尝试
    java计算机毕业设计体检系统源码+系统+数据库+lw文档
    卷积神经网络卷积层公式,卷积神经网络层数计算
    Linux设备树详细学习笔记
    9月1日目标检测学习笔记——文本检测
    Redis-持久化讲解
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127932462