文章來源:《單片機C語言編程與Proteus仿真技術(shù)》。
點陣字符型LCD顯示模塊只能顯示英文字符和簡單的漢字,要想顯示較為復雜的漢字或圖形,就必須采用點陣圖型LCD顯示模塊,比如12864點陣圖型LCD顯示模塊。
一、 LCD12864點陣圖型顯示模塊
12864點陣圖型LCD顯示模塊內(nèi)部控制器采用KS0108或HD61202。其引腳排列如下圖所示:
各引腳功能功能如下表:
引腳 | 符號 | 功能 | 引腳 | 符號 | 功能 |
1 | /CS1 | 1=選擇左邊64x64點 | 7 | RW | 1=數(shù)據(jù)讀取,0=數(shù)據(jù)寫入 |
2 | /CS2 | 1=選擇右邊64x64點 | 8 | E | 使能信號,負跳變有效 |
3 | GND | 地 | 9~16 | DB0~DB7 | 數(shù)據(jù)信號 |
4 | VCC | +5V電源 | 17 | /RST | 復位,低電平有效 |
5 | V0 | 顯示驅(qū)動電源0~5V | 18 | -Vout | LCD驅(qū)動負電源 |
6 | RS | 1=數(shù)據(jù)輸入,0=命令輸入 | 有些模塊19、20引腳為空腳 |
12864點陣圖型LCD內(nèi)部存儲器DDRAM與顯示屏上的顯示內(nèi)容具有對應關(guān)系,使用時只需要將顯示內(nèi)容寫入到1286412864內(nèi)部顯示存儲器DDRAM中,就能正確顯示。
12864點陣圖型LCD屏橫向有128個點,縱向有64個點,分為左半屏和右半屏。
DDRAM與顯示屏的對應關(guān)系如下表:
/CS1=1(左半屏) | /CS2=1(右半屏) | ||||||||||
Y= | 0 | 1 | ... | 62 | 63 | 0 | 1 | ... | 62 | 63 | 行號 |
X=0 | DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
0 ↓ 7 |
X=1 | DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
8 ↓ 15 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
X=7 | DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
DB0 ↓ DB7 |
56 ↓ 63 |
在12864點陣圖型LCD屏上顯示圖形或漢字時,可以利用字模提取軟件獲得圖形或漢字的點陣代碼。
二、12864的指令
12864點陣圖型LCD顯示模塊的指令功能比較簡單,共有8條指令。
- 讀忙標志
編碼格式為:
RS | R/W | E | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | BUSY | 0 | ON/OFF | RESET | 0 | 0 | 0 | 0 |
BUSY=1表示顯示模塊內(nèi)部控制器忙,不能進行操作,只有BUSY=0時才允許操作。
ON/OFF=1表示顯示關(guān)閉,ON/OFF=0表示顯示打開。
RESET=1表示復位狀態(tài),RESET=0表示正常狀態(tài)。
在BUSY和RESET狀態(tài)下,除讀忙標志指令外,其它指令均不對液晶顯示模塊產(chǎn)生作用。
- 寫指令
編碼格式為:
RS | R/W | E | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 下降沿 | 指令 |
- 寫數(shù)據(jù)
編碼格式為:
RS | R/W | E | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 0 | 下降沿 | 顯示數(shù)據(jù) |
- 顯示開/關(guān)
編碼格式為:
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | D | 3E/3F |
D=1表示顯示RAM中的內(nèi)容,D=0表示關(guān)閉顯示。
- 顯示起始行
編碼格式為:
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 1 | 1 | 顯示起始行(0~63) |
該指令規(guī)定顯示屏上起始行對應DDRAM的行地址,有規(guī)律地改變現(xiàn)實起始行,可以實現(xiàn)現(xiàn)實滾屏的效果。
- 頁面地址
編碼格式為:
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 1 | 0 | 1 | 1 | 1 | 頁面(0~7) |
DDRAM共64行,分8頁,每頁8行。
- 列地址
編碼格式為:
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 1 | 顯示列地址(0~63) |
列地址計數(shù)器在每一次讀/寫數(shù)據(jù)后自動加1,每次操作后明確起始列的地址。設置了頁面地址和列地址,就唯一確定了DDRAM中的一個單元。這樣單片機就可以用讀/寫指令讀出該單元中的內(nèi)容或向該單元寫進一個字節(jié)數(shù)據(jù)。
- 讀數(shù)據(jù)
編碼格式為:
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 1 | 顯示數(shù)據(jù) |
該指令將DDRAM對應單元中的內(nèi)容讀出,然后列地址計數(shù)器自動加1.需要注意的是,進行讀操作之前,必須有一次空讀操作,緊接著再讀才會讀出所要求單元中的數(shù)據(jù)。
三、 12864 LCD接口應用使用示例
單片機與12864圖型LCD模塊之間可以采用直接方式接口,也可以采用間接方式接口。
如下圖,在proteus仿真電路圖中采用間接方式實現(xiàn)51單片機與12864圖型LCD模塊的接口電路。LCD模塊的/CS1、/CS2、RS、R/W和E信號分別由單片機的P2.0、P2.1、P2.2、P2.3和P2.4來控制,數(shù)據(jù)信號連接到單片機的P0口。由于間接控制方式需要通過單片機的端口引腳來操作液晶模塊,在編寫驅(qū)動程序時要特別注意時序的配合。
軟件設計,判斷12864是否忙,根據(jù)讀忙標志指令判斷,代碼如下:
// 判斷是否忙
void IsBusy()
{
do
{
EN=0;
RW=1; // 讀操作
RS=0; // 0表示命令輸入
EN=1; // 產(chǎn)生一個負跳變
EN=0;
}while(BUSY); // BUSY=1時表示顯示模塊內(nèi)部控制器忙
}
其中定義全局變量:
#define PORT P0
sbit CS1=P2^0;
sbit CS2=P2^1;
sbit RS=P2^2;
sbit RW=P2^3;
sbit EN=P2^4;
sbit BUSY=P0^7; // 忙標志
其它指令按照類似的方式編寫。編寫清屏函數(shù),為顯示做準備,首先清左半屏,打開顯示;清右半屏,關(guān)閉顯示。設置每個點不顯示字符,即寫顯示數(shù)據(jù)為0x00。代碼如下:
// 清屏,為顯示做準備
void Ready()
{
uint i,j;
ClearLeft(); // 清左半屏
WriteCom(0x3F); // 顯示開
ClearRight(); // 清右半屏
WriteCom(0x3F); // 顯示開
ClearLeft();
for(i=0;i<8;i++)
{
SetPage(i); // 設置顯示起始頁
SetCol(0x00); // 設置顯示起始列為第一列
for(j=0;j<64;j++)
{
WriteDat(0x00); // 設置每行的數(shù)據(jù)為00
}
}
ClearRight();
for(i=0;i<8;i++)
{
SetPage(i);
SetCol(0x00);
for(j=0;j<64;j++)
{
WriteDat(0x00); // 設置每行的數(shù)據(jù)為00
}
}
}
每個漢字設置為16*16點陣大小,代碼如下:
// 顯示16*16的漢字,縱向取模,字節(jié)倒序
void Display(uchar *s, uchar page, uchar line)
{
uchar i;
SetPage(page);
SetCol(line);
for(i=0;i<16;i++)
{
WriteDat(*s);
s++;
}
SetPage(page+1);
SetCol(line);
for(i=0;i<16;i++)
{
WriteDat(*s);
s++;
}
}
主函數(shù)中聲明字符點陣數(shù)據(jù),比如漢字“單片機”,點陣數(shù)據(jù)如下:
// 字符點陣數(shù)據(jù)
uchar code Disp[]=
{
//單(0) 片(1) 機(2)
0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00,
0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00,/*"單",0*/
0x00,0x00,0x00,0xFE,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,/*"片",1*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00/*"機",2*/
};
主函數(shù)中調(diào)用函數(shù)Display
,如下:
void main()
{
uchar page=0x03;
Ready();
ClearLeft();
Display(Disp, page, 0);
Display(Disp+32, page, 16);
Display(Disp+32*2, page, 16*2);
while(1);
}
仿真結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-804180.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-804180.html
到了這里,關(guān)于【51單片機系列】proteus中的LCD12864液晶屏的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!