单片机笔记之LCD1602显示屏

2019-07-14 02:09发布

LCD1602显示屏概念: 工业字符型液晶,能够同时显示16x02即32个字符。

LCD1602显示屏原理图:
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。

第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。

LCD1602显示程序:
  1.     #include
  2.     #include 
  3.     #define uchar unsigned char
  4.     #define uint unsigned int
  5.     sbit RS=P2^6;    //定义数据命令选择端
  6.     sbit RW=P2^5;   //定义读写选择端
  7.     sbit E=P2^7;       //定义使能端
  8.     uchar shuju1[]="JackTao";      
  9.     uchar shuju2[]="Helloworld"; 
  10.     void delay_ms(uint z)  //延时函数(1毫秒)
  11.     {
  12.        uint x,y;
  13.        for(x=z;x>0;x--)
  14.           for(y=110;y>0;y--);
  15.     }

  16. /*****************侧忙函数****************/
  17.    uchar Lcd1602_ReadBusy()   //判断lcd1602是否处于忙的状态
  18.     {
  19.        uchar temp;
  20.        RS=0;
  21.        RW=1;
  22.        _nop_();
  23.        P0=0xff;     //读某IO口数据前,先将该口置为1            
  24.     /*原因:电路中存在的一个普遍的现象:高电平很容易被低电平拉低,而低电平一般不可能被高电平拉高。所以在读数据之前将单片机IO口拉高才不会影响原来数据线上的数据!*/
  25.        _nop_();
  26.        E=1;
  27.        _nop_();
  28.        temp=P0;   //读取此时lcd1602的状态字
  29.        _nop_();
  30.        E=0;
  31.        return (temp&0x80);  //如果忙
  32.        /*状态字为temp(8位2进制数)的最高位,最高位为1表示禁止读写,为0表示允许读写,即temp&0x80得1表示忙,得0表示不忙*/

  33.     }

  34. /*****************写命令****************/
  35.     void Lcd1602_WriteCom(uchar com)  
  36.     {
  37.        while(Lcd1602_ReadBusy());  //判忙
  38.        RS=0;   //命令
  39.        RW=0;   //写
  40.        _nop_();
  41.        P0=com;   //准备发送命令
  42.        _nop_();
  43.        E=1;      //由时序图知,使能端为高电平时才允许数据交换
  44.        _nop_();
  45.        _nop_();
  46.        E=0;      //由时序图知,使能端在完成数据交换后要拉低
  47.        _nop_();
  48.        _nop_();   
  49.     }

  50. /****************写数据****************/
  51.     void Lcd1602_WriteData(uchar dat)  
  52.     {
  53.        while(Lcd1602_ReadBusy());   //判忙
  54.        RS=1;   //数据
  55.        RW=0;   //写
  56.        _nop_();
  57.        P0=dat;
  58.        _nop_();
  59.        E=1;
  60.        _nop_();
  61.        _nop_();
  62.        E=0;
  63.        _nop_();
  64.        _nop_();   
  65.     }


  66.     void Lcd1602_init()   //初始化函数
  67.     {
  68.        delay_ms(15);
  69.        write_com(0x38);   //显示模式设置
  70.        delay_ms(5);
  71.        write_com(0x38);
  72.        delay_ms(5);
  73.        write_com(0x38);
  74.        write_com(0x0c);  //显示开
  75.        write_com(0x01);  //显示清屏
  76.        write_com(0x06);  //显示光标
  77.     }


  78.     void main()
  79.     {
  80.        uchar i,j;
  81.        Lcd1602_init();   //Lcd初始化
  82.       Lcd1602_WriteCom(0x80);   //0x80是第一行的第一个字符的地址
  83.       for(i=0;i<7;i++)  
  84.           Lcd1602_WriteData(shuju1[i]);   
  85.        Lcd1602_WriteCom(0x80+0x40);   //0xc0是第二行的第一个字符的地址,可以用0xc0,0x80+0x40,0x80|0x40等等
  86.        for(j=0;j<10;j++)
  87.           Lcd1602_WriteData(shuju2[j]);   
  88.     }