LCD1602學習——Proteus仿真(顯示操作)


學習關鍵:先看懂液晶操作時序圖(寫操作:寫命令、寫數據)

讀狀態

輸入

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 }

顯示輸出如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM