初学者模式下的12864液晶(一)

欢迎来围观小白讲知识,作为硬件中的小白一枚,对于很多大神讲得东西总是摸不透,恕小白直言,大神研究得太深入,小白还依然在表面,所以小白还是看小白写得东西能懂许多。最后还是那一句 大神勿喷
接下来进入主题教你在12864液晶上显示一些简单的文字,这仅仅是显示文字哦,对于要显示图啊什么的,我们还有后续继续说。

初学者模式下的12864液晶(一)_第1张图片
12864液晶

虽然很简单,但对于初学者来说,找不到路就很难了,很可能你把代码烧录了进去但没有显示,这就很尴尬了。所以今天带大家来学学入何简单地让显示屏显示你要显示的文字。


液晶基本特征

1. 低电源电压(VDD:+3V 或+5V),DM12864-A 为 5V,
    DM12864-L 为 3.3, 驱动芯片:ST7920
2.显示分辨率:128×64 点
3. 内置汉字字库,提供 8192 个 16×16 点阵汉字(简繁体可选)
4. 内置 128 个 16×8 点阵字符
5. 2MHZ 时钟频率
6. 显示方式:STN、半透、正显
7. 驱动方式:1/32DUTY,1/5BIAS
8. 视角方向:6 点
9. 背光方式:侧部高亮白色 LED,蓝光白字,功耗仅为普通 LED 的 1/5—1/10
10. 通讯方式:串行、并口可选
11 内置 DC-DC 转换电路,无需外加负压
12 无需片选信号,简化软件设计
13 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃

并行模式下的引脚定义

初学者模式下的12864液晶(一)_第2张图片
并行引脚

控制界面的4种模式

初学者模式下的12864液晶(一)_第3张图片
4种模式

由于我们并不需要从液晶中读出数据,因为没什么可读出来的,所以我们只需向液晶写入数据和写入命令,因此R/W=0

控制液晶的指令

初学者模式下的12864液晶(一)_第4张图片
![ ![](http://upload-images.jianshu.io/upload_images/6472160-3ecc42ecf8253020.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![一些基本指令和扩充指令](http://upload-images.jianshu.io/upload_images/6472160-317e494438e7e146.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://upload-images.jianshu.io/upload_images/6472160-8e933c0c8f89cc36.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

对于这些指令,当我们要用时,刻意去查找就行了,指令中的X表示可以为任何的值,即1或0 。

液晶的时序图

初学者模式下的12864液晶(一)_第5张图片
液晶时序图

对于要做的任意模块来说,看懂时序图是非常重要的,时序图就是让你知道何时写数据、指令。之前我们说了,我们只需写入就行,不需要读所以,把R/W置0。

当我们要写代码时,先把端口定义好先,然后在写。写指令把RS置0,按照时序图延时一下,然后把使能E置0,也延时一下,把指令写入指令口,即赋值,也要延时一下,再把使能端E拉高,即把E置1,再延时一下,这样就把指令发送给了液晶了。

void write_com(uchar cmdcode)
 {
    chk_busy();
    LCM_RS=0; 
    LCM_RW=0; 
    LCM_EN=1;
    Lcd_Bus=cmdcode;
    LCM_EN=0;
}

写数据,写数据时,我们要把RS拉低,即置0,按照时序图延时一下,然后把使能E置0,也延时一下,把数据写入数据口,即赋值,也要延时一下,再把使能端E拉高,即把E置1,再延时一下,这样就把数据发送给了液晶了

void write_data(uchar Dispdata)
{    
    chk_busy();
    LCM_RS=1; 
    LCM_RW=0; 
    LCM_EN=1;
    Lcd_Bus=Dispdata;
    LCM_EN=0;
}

只有使能端E处于高电平时,数据才是稳定的,所以我们发完数据或指令要稍微延时一下的原因。接下来我们就要在屏幕上指定我们要显示的地方显示了,即定位我们文字的位置。


void lcd_pos(uchar X,uchar Y)
 {                          
        uchar  pos;
        if (X==0)
             {X=0x80;}
        else if (X==1)
             {X=0x90;}
        else if (X==2)
             {X=0x88;}
        else if (X==3)
             {X=0x98;}
        pos = X+Y ;  
        write_com(pos);     //设置地址
}

在发送数据或指令时,我们得检查一下,是否液晶已经处理完数据或指令了,所以我们得忙位检查一下

void chk_busy()
{
      LCM_RS=0; 
      LCM_RW=1; 
      LCM_EN=1;
      Lcd_Bus=0xff;
      while((Lcd_Bus&0x80)==0x80);
      LCM_EN=0;
}

当我们要显示第二主页面时,我们要清理一下屏幕上的文字,即清屏。
清屏很简单,只需发送指令0x01即可。

  void lcm_clr(void)
  {
        write_com(0x01);    
 }

当然我们显示之前得初始化一下液晶,即要是液晶如何显示,有无光标等

void lcm_init()     //初始化液晶函数
{  
    write_com(0x30);  //选择8bit数据流
    write_com(0x0c);  //开显示(无游标、不反白)
    lcm_clr();        //清除显示,并且设定地址指针为00H
    write_com(0x06);  //光标右移,DDRAM位址计数器(AC)加1,不整屏    移动
}

好了,有了这些函数,显示文字也就很容易了

 #inclue
 #define uchar unsigned char
 #define uint  unsigned int
 #define Lcd_Bus P0             //数据口   
 sbit LCM_EN  = P1^0;            //液晶使能控制
 sbit LCM_RW  = P1^1;            //液晶读/写控制
 sbit LCM_RS  = P1^2;            //寄存器选择输入 
sbit LCM_PSB = P1^3;            //串/并方式控制   0时为串,1时为并
uchar code dis1[] = {"欢迎关注"};
uchar code dis3[] = {"五分钱特效"};
uchar code dis4[] = {"不定期更新"};

void  main()
{
    void lcm_init();
    void lcm_clr(void);
    uchar i;
    Delay(10);                 //延时

     lcd_pos(0,1);             //设置显示位置为第一行的第1位开始显示
     i = 0;
    while(dis1[i] != '\0')
   {                         //显示字符
      write_data(dis1[i]);
       i++;
   }

   lcd_pos(1,1);             //设置显示位置为第三行的第1位开始显示
     i = 0;
   while(dis3[i] != '\0')
   {
        write_data(dis3[i]);      //显示字符
        i++;
   }
    lcd_pos(2,1);             //设置显示位置为第三行的第1个字符  
    i = 0;
   while(dis4[i] != '\0')
   {
       write_data(dis4[i]);      //显示字符
       i++;
    } 
   while(1);




}
这样就能显示想要显示的文字了

你可能感兴趣的:(初学者模式下的12864液晶(一))