学习关键:先看懂液晶操作时序图(写操作:写命令、写数据)

读状态

输入

RS=L,R/W=H,E=H

输出

D0—D7=状态字

写指令

输入

RS=L,R/W=L,D0—D7=指令码,E=高脉冲

输出

读数据

输入

RS=H,R/W=H,E=H

输出

D0—D7=数据

写数据

输入

RS=H,R/W=L,D0—D7=数据,E=高脉冲

输出

 


 

由时序图可知,写操作时(包括写指令、写数据),RS=0;RW=0;再进行I/O口写操作,然后使能端口完成一次高脉冲(——高——低),这是液晶就会执行写操作的内容;

1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标返回

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关控制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发生存贮器地址

0

0

0

1

字符发生存贮器地址

8

置数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标志或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM)

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容

 

思路:

 

1、控制液晶显示输出,需要对其进行写数据(写数据前,同样需要先告诉液晶你下一步要在哪里写,因此写数据前,要写命令先设定数据指针)

程序设计方式:

write_com();//写命令函数,

write_date();//写数据函数

 

2、由于要先进行初始化,(初始化实际就是对液晶写指令,告诉其工作方式等)因此初始化函数里面自然就需要调用写命令函数write_com();

程序结构如下:

int init()

{

  EN = 0;
  write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
  write_com(0X0C);//设置开显示,不显示光标
  write_com(0X06);//写一个字符时,整屏右移
  write_com(0X01);//显示清零

  return 0;

} 

主函数部分程序结构:

int main()

{

  init();//调用初始化函数

  write_com(0x80);//调用写指令函数,设置写数据开始指针(第一行) 
  for(x=0;x<6;x++)//数据写入循环程序
  {
    write_date(table[x]);
    delay(150);
  }
  write_com(0x80+0x40); ;//调用写指令函数,设置写数据开始指针(第二行) 
  for(x=0;x<17;x++)//数据写入循环程序
  {
    write_date(table1[x]);
    delay(150);
  }
  while(1);
return 0;

}

完整程序如下:

 1 #include<reg52.h>
 2     int init();    //声明初始化函数
 3     int write_com(unsigned char);//声明写命令函数
 4     int write_date(unsigned char);//声明写数据函数
 5     int delay(unsigned char);//声明延迟函数
 6     unsigned char x;
 7     sbit RS = P1^0;
 8     sbit RW = P1^1;
 9     sbit EN = P1^2;
10     unsigned char code table[]="HELLO!";
11     unsigned char code table1[]="MY name is Terry!";
12 
13 int main(void)//主函数
14 {    
15     init();
16     write_com(0x80);    
17     for(x=0;x<6;x++)
18     {
19          write_date(table[x]);
20         delay(150);
21     }
22     write_com(0x80+0x40);    
23     for(x=0;x<17;x++)
24     {
25          write_date(table1[x]);
26         delay(150);
27     }
28     while(1);            
29     return 0;
30 }
31 
32 int init()//初始化函数体
33 {
34     EN = 0;
35     write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
36     write_com(0X0C);//设置开显示,不显示光标
37     write_com(0X06);//写一个字符时,整屏右移
38     write_com(0X01);//显示清零
39     return 0;
40 }
41 
42 int write_com(unsigned char com)//写命令的函数体
43 {
44     RS = 0;
45     RW = 0;
46     P0 = com;
47     delay(5);
48     EN = 1;
49     delay(5);
50     EN = 0;
51     return 0;        
52 }
53 
54 int write_date(unsigned char date)//写数据的函数体
55 {
56     RS = 1;
57     RW = 0;
58     P0 = date;
59     delay(5);
60     EN = 1;
61     delay(5);
62     EN = 0;
63     return 0;        
64 }
65 
66 int delay(unsigned char xms)
67 {
68     unsigned char x,y;
69     for(x=xms;x>0;x--)
70         for(y=110;y>0;y--);
71     return 0;
72 }

显示输出如下:

 

版权声明:本文为czf-gd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/czf-gd/p/5495086.html