51微控制器驅動1602液晶顯示器的小例子
阿新 • • 發佈:2019-01-08
首先附上1602的相關資料:
引腳功能:
第1腳:VSS為電源地
第2腳:VCC接5V電源正極
第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。
第4腳:RS為暫存器選擇,高電平1時選擇資料暫存器、低電平0時選擇指令暫存器。
第5腳:RW為讀寫訊號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。
第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取資訊,負跳變時執行指令。
第7~14腳:D0~D7為8位雙向資料端。
第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。
指令表:
指令碼 | 功 能 | ||||||||||
令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
清除顯示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 將DDRAM填滿"20H",並且設定DDRAM的地址計數器(AC)到"00H" |
地址歸位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 設定DDRAM的地址計數器(AC)到"00H",並且將遊標移到開頭原點位置;這個指令不改變DDRAM 的內容 |
顯示狀態開/關 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | [D=1: 整體顯示 ON][C=1: 遊標ON] [B=1:遊標位置反白允許] |
進入點設定 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 指定在資料的讀取與寫入時,設定遊標的移動方向及指定顯示的移位 |
遊標或顯示移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | X | X | 設定遊標的移動與顯示的移位控制位;這個指令不改變DDRAM 的內容 |
功能設定 | 0 | 0 | 0 | 0 | 1 | DL | X | RE | X | X | [DL=0/1:4/8位資料] [RE=0/1: 基本指令操作 / 擴充指令操作] |
設定CGRAM地址 | 0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 設定CGRAM 地址 |
設定DDRAM地址 | 0 | 0 | 1 | 0 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 設定DDRAM 地址(顯示位址) [第一行:80H-A7H] [第二行:C0H-E7H] |
讀取忙標誌和地址 | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 讀取忙標誌(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值 |
寫資料到RAM | 1 | 0 | 資料 | 將資料D7——D0寫入到內部的RAM (DDRAM/CGRAM/IRAM/GRAM) | |||||||
讀出RAM的值 | 1 | 1 | 資料 | 從內部RAM讀取資料D7——D0(DDRAM/CGRAM/IRAM/GRAM) |
特性:
3.3V或5V工作電壓,對比度可調
內含復位電路
提供各種控制命令,如:清屏、字元閃爍、游標閃爍、顯示移位等多種功能
有80位元組顯示資料儲存器DDRAM
內建有192個5X7點陣的字型的字元發生器CGROM
8個可由使用者自定義的5X7的字元發生器CGRAM
測試電路原理圖:
測試程式碼:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^2; //使能端
sbit lcdrs=P3^0; //資料命令選擇端
sbit rw=P3^1;
uchar code table[]="xian shi 1"; //輸入的字元
uchar code table1[]="xian shi 2"; //輸入的字元
uchar num=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//根據寫時序圖寫出指令程式
{
lcdrs=0;
rw=0;
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//根據寫時序圖寫出資料程式
{
lcdrs=1;
rw=0;
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0; //使能端為低電平
write_com(0x38);
/*顯示模式設定 00111000 設定16*2顯示 5*7點陣 8位資料介面*/
write_com(0x0f);
/*顯示開關及游標設定 00001DCB
D=1,開顯示 D=0, 關顯示
C=1,顯示游標 C=0,不顯示游標
B=1,游標閃爍 B=0,游標不閃爍*/
write_com(0x06);//地址指標自動+1且游標+1,寫字元螢幕不會移動
write_com(0X01);
write_com(0X80);
}
void main()
{
init();
for(num=0;num<10;num++) //輸入的字元數量,修改
{
write_data(table[num]);
delay(50);
}
write_com(0X80+0x40);
for(num=0;num<10;num++) //輸入的字元數量,修改
{
write_data(table1[num]);
delay(50);
}
while(1);
}
測試效果: