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