學習關鍵:先看懂液晶操作時序圖(寫操作:寫命令、寫數據)
讀狀態 |
輸入 |
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 }
顯示輸出如下: