LCD1602

一、LCD1602引脚定义

LCD1602_第1张图片

二、LCD1602代码实现

  • LCD1602指令编码
    LCD1602_第2张图片
  • 引脚定义

    • RS:控制写入命令或写入数据
    • R/W:是如否写
    • E:1->0使能执行命令,1读取数据,0清除使能。
    • DB7~DB0:存放数据和其他功能
  • LCD1602显示字符流程,分为八位数据总线和四位数据总线

    • 初始化,void LcdInit() 。
    • 写命令,void LcdWriteCom(uchar dat)。
    • 写数据,void LcdWriteData(uchar dat)。
    • 主函数,main。
  • 初始化,清屏,光标位置设置,设置指针起点,指针加一。选择四位或8位数据总线

    
    #ifndef       LCD1602_4PINS
    
    void LcdInit()                          //8位数据总线初始化
    {
        LcdWriteCom(0x38);  //开显示
        LcdWriteCom(0x0c);  //不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置指针起始位置
    }
    
    #else
    
    void LcdInit()                          //LCD³õʼ»¯×Ó³ÌÐò
    {
        LcdWriteCom(0x32);   //选择四位数据总线
        LcdWriteCom(0x28);   //在四位线上的初始化
        LcdWriteCom(0x0c);  //不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置指针起始位置
    }
  • 写命令。先写入,后E由1->0使能执行命令。

    ifndef    LCD1602_4PINS    //四位数据总线
    void LcdWriteCom(uchar com)     //8位数据总线
    {
        LCD1602_E = 0;     //使能清零
        LCD1602_RS = 0;    //选择命令写入
        LCD1602_RW = 0;    //写入开
    
        LCD1602_DATAPINS = com;     //写入命令
        Lcd1602_Delay1ms(1);        //等待数据稳定
    
        LCD1602_E = 1;            //使能,执行命令
        Lcd1602_Delay1ms(5);      //
        LCD1602_E = 0; 
    }
    
    #else 
    
    void LcdWriteCom(uchar com)     //
    {
        LCD1602_E = 0;   //使能清零
        LCD1602_RS = 0;  //选择命令写入
        LCD1602_RW = 0;  //写入开
    
        LCD1602_DATAPINS = com; //写入命令,先先写入高四位
        Lcd1602_Delay1ms(1);   
    
        LCD1602_E = 1;   //使能
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
    
        LCD1602_DATAPINS = com << 4; //写入第四位命令
        Lcd1602_Delay1ms(1);
    
        LCD1602_E = 1;   //使能,执行命令
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
    }
    
    #endif
    
  • 写入数据。RS = 1.写入数据后E使能执行数据。

    
    #ifndef   LCD1602_4PINS          
    
    void LcdWriteData(uchar dat)          //八位数据总线
    {
        LCD1602_E = 0;  //清楚使能
        LCD1602_RS = 1; //选择写入数据
        LCD1602_RW = 0; //允许写入
    
        LCD1602_DATAPINS = dat; //写入数据
        Lcd1602_Delay1ms(1);
    
        LCD1602_E = 1;   //使能执行
        Lcd1602_Delay1ms(5);   
        LCD1602_E = 0;
    }
    
    #else
    
    void LcdWriteData(uchar dat)          //四位总线
    {
        LCD1602_E = 0;  //清楚使能
        LCD1602_RS = 1; //选择写入数据
        LCD1602_RW = 0; //允许写入
    
        LCD1602_DATAPINS = dat; //写入高四位数据
        Lcd1602_Delay1ms(1);
    
        LCD1602_E = 1;    //使能,写入数据
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
    
        LCD1602_DATAPINS = dat << 4; //写入低四位数据
        Lcd1602_Delay1ms(1);
    
        LCD1602_E = 1;    //使能
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
    }
    
    #endif
    

  • 主函数,将数据写入LCD1602并显示

  #include "reg52.h"             
  #include "lcd.h"
  #include "temp.h" //参考之前温度传感器博客
  typedef unsigned int u16;   
  typedef unsigned char u8;
  u8 DisplayData[6];
  void datapros(int temp)    
  {
        float tp;  
      if(temp< 0)   //  
     {
            DisplayData[0] = 0x40;    
            temp=temp-1;
            temp=~temp;
            tp=temp;
            temp=tp*0.0625*100+0.5; 
      }
      else
      {         
            DisplayData[0] = 0x00;
            tp=temp;
            temp=tp*0.0625*100+0.5; 
       }
        //求出温度值每一位
        DisplayData[1] = temp / 10000;
        DisplayData[2] = temp % 10000 / 1000 ;
        DisplayData[3] = temp % 1000 / 100;
        DisplayData[4] = temp % 100 / 10;
        DisplayData[5] = temp % 10;
  }

  void main(void) //main函数
  {
        u8 i;
        LcdInit();
        while(1)
        {
        LcdWriteCom(0x80);//每次都要写入地址,要不然屏幕一直刷新。
        datapros(Ds18b20ReadTemp()); //读取温度请参考之前温度传感器的代码。
        //写入字符串"temp:"
        LcdWriteData('t'); 
        LcdWriteData('e');
        LcdWriteData('m');
        LcdWriteData('p');
        LcdWriteData(':');
        for(i=2;i<4;i++)
        {
            LcdWriteData(DisplayData[i]+'0');   
        }
        LcdWriteData('.');
        for(i=4;i<6;i++) //写入后两位小数点
        {
            LcdWriteData(DisplayData[i]+'0');   //写入数据,ASCLL码
        }
        LcdWriteData('C');
        Delay1ms(1000);
        }
  }

你可能感兴趣的:(C51)