glcd 64x128
DESCRIPTION
glcdTRANSCRIPT
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 1/13
GLCD 64x128
(Chip điều khiển ST7920)
1.Hình dạng, sơ đồ chân và chức năng từng chân.
Hình 12.1 GLCD 128x64 Hình 12.2 Sơ đồ chân GLCD 128x64
Chân số Tên chân Chức năng 1 - 2 VSS -VDD -Cấ p nguồn
3 V0 -Chỉnh độ tương phản
4 RS (Register select)
CS (Chip select )
-Chọn thanh ghi
0: Chọn thanh ghi mã lệnh1: Chọn thanh ghi dữ liệu
-Khi giao tiế p theo chuẩn SPI thì chân nàylà chân chip select0: Không chọn GLCD1: Chọn GLCD
5 R/W (Read/Write)SID (Serial Data Input)
-Chọn chế độ đọc hoặc ghi GLCD0: Ghi
1: Đọc
-Khi giao tiế p theo chuẩn SPI thì chân nàylà chân nhận dữ liệu nối tiế p.
6 E (Enable)
SCLK (Serial Clock )
-Nhận xung cho phép
-Khi giao tiế p theo chuẩn SPI thì đây làchân nhận xung clock.
7-10 D0-D3 -4 bit dữ liệu thấ p khi giao tiế p theo chuẩn
8 bit
11-14 D4-D7 -4 bit dữ liệu cao khi giao tiế p theo chuẩn 8
bit
-4 bit dữ liệu khi giao tiế p theo chuẩn 4 bit
15 PSB -Chọn chế độ điều khiển
0: SPI (nối tiế p)1: 8 hoặc 4 bit (song song)
16 NC (No Connect) Bỏ tr ống
17 RST (Reset) Reset GLCD
18 Vout Điện áp ra GLCD
19-20 BLA-BLK(Back Light Anode – Cathode) Cấp điện cho led nền giúp quan sát đượ ctrong bóng tối
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 2/13
2. Các loại vùng nhớ của ST7920
- CGROM (Character Generation ROM) : ROM dung lượ ng 2M-bits chứa font chữ Trung
Quốc dạng 16x16.
- HCGROM (Half Height CGROM): ROM dung lượ ng 16K-bits chứa font của 168 ký tự dạng
16x8 như trong hình 12.3.
Hình 12.3 Các ký tự 16x8 trong vùng nhớ HCGROM
- CGRAM (Character Generation RAM) : RAM kích thướ c 64x16 –bits cho phép người dùngtự tạo ký tự riêng dạng 16x16
Hình 12.4 Cách tạo ký tự trong CGRAM
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 3/13
- IRAM (ICON RAM) : RAM để tạo icon 240 điểm dạng 15x16
- DDRAM (Display Data RAM): RAM lưu dữ liệu hiển thị ra màn hình
+ Hiển thị fonts của HCGROM: ghi 2 bytes vào DDRAM để hiển thị 2 ký tự dạng 16x8,
nỗi byte là 1 ký tự. Các byte đượ c ghi phải nằm trong phạm vi 02H〜7FH
+ Hiển thị fonts của CGRAM: ghi 2 bytes vào DDRAM để hiển thị một ký tự dạng 16x16.
Chỉ được phép ghi 4 giá trị sau 0000H,0002H,0004H,0006H
+ Hiển thị fonts của CGROM: ghi 2 bytes vào DDRAM để hiển thị một ký tự. A140H〜
D75FH là mã BIG5, A1A0H〜F7FFH là mã GB.
Chú ý : Luôn ghi byte cao trước và byte thấ p sau.
Hình 12.5 Cách ghi dữ liệu vào vùng nhớ DDRAM
- GDRAM (graphic display RAM) : Vùng nhớ hiển thị ảnh gồn 64x256 bits. Các bước để ghi
dữ liệu hiển thị lên GDRAM: + Đặt đặt địa chỉ hàng dọc (Y)
+ Đặt địa chỉ hàng ngang (X)
+ Ghi D15-D8 vào GDRAM ( byte thứ 1)
+ Ghi D7-D0 vào GDRAM (byte thứ 2 )
- Địa chỉ GDRAM sẽ tự động tăng lên 1 để chuẩn bị ghi 2 bytes tiế p theo.
Hinh 12.6 Tổ chức vùng nhớ GDRAM
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 4/13
3. Tập lệnh
Nhóm lệnh 1 (Khi RE=0: nhóm lệnh cơ bản)
Lệnh
Mã lệnh
Mô tả
Thờ igian
thực
hiện
RS RW D7 D6 D5 D4 D3 D2 D1 D0
CLEAR 0 0 0 0 0 0 0 0 0 1
Xóa màn hình - ghi đầyvùng nhớ DDRAM giá trị “20H (mã của khoảng
tr ắng)” và đưa con trỏ về
địa chỉ “00H”
1.6ms
HOME 0 0 0 0 0 0 0 0 1 X
Đưa con trỏ về địa chỉ “00H” trong vùng nhớ DDRAM
72us
ENTRY
MODE0 0 0 0 0 0 0 1 I\D S
Cài đặt cách dịch con tr ỏ
khi đọc hoặc ghi dữ liệu.72us
DISPLAY
ON/OFF0 0 0 0 0 0 1 D C B
D=1: Bật hiển thị C=1: Bật con tr ỏ
B=1: Con tr ỏ nhấp nháy
72us
CURSOR
DISPLAY
CONTROL
0 0 0 0 0 0 S\C R\L X X
Điều khiển vị trí con trỏ vàdịch hiển thị; nội dung của
DDRAM không đổi
72us
FUNCTION
SET0 0 0 0 1 DL X
0
REX X
DL=1: Chế độ 8 bit
DL=0: Chế độ 4 bit
RE=1: Lệnh mở r ộng
RE=0: Lệnh cơ bản
72us
SETCGRAM
ADDR
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0Đặt địa chỉ con tr ỏ trong
vùng nhớ CGRAM72us
SETDDRAM
ADDR
0 0 1 0AC6
AC5 AC4 AC3 AC2 AC1 AC0
Đặt địa chỉ con tr ỏ trong
vùng nhớ DDRAM
AC6 luôn bằng 072us
READ
BUSY
FLAG(BF) &
ADDR.
0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
Đọc cờ bận (BF) xem
GLCD đã thực hiện lệnh
trước đó xong chưa, đồngthời đọc giá trị của tại vị trí con trỏ.
0us
WRITE
RAM1 0 D7 D6 D5 D4 D3 D2 D1 D0
Ghi dữ liệu vào bộ nhớ RAM nội (DDRAM/
CGRAM/IRAM/GDRAM)
72us
READ
RAM1 1 D7 D6 D5 D4 D3 D2 D1 D0
Đọc dữ liệu từ bộ nhớ RAM nội (DDRAM/
CGRAM/IRAM/GDRAM)
72us
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 5/13
Nhóm lệnh 2 (Khi RE=1: nhóm lệnh mở rộng)
Lệnh
Mã lệnh
Mô tả
Thờ igian
thực
hiện
RS RW D7 D6 D5 D4 D3 D2 D1 D0
STAND BY 0 0 0 0 0 0 0 0 0 1
Đưa GLCD vào chế độ
chờ và thoát khỏi chế độ chờ khi nhận bất cứ lệnh
nào
72us
SCROLL or
RAM
ADDR.
SELECT
0 0 0 0 0 0 0 0 1 SR
SR=1: Cho phép cuộn dọchiển thị SR=0: Cho phépIRAM(chế độ mở r ộng)
SR=0: Cho phépCGRAM(chế độ cơ bản)
72us
EXTENDEDFUNCTION
SET
0 0 0 0 DL X1
REG 0
DL=1: Chế độ 8 bit
DL=0: Chế độ 4 bitRE=1: Lệnh mở r ộng
RE=0: Lệnh cơ bảnG=0:Tắt hiển thị ảnh
G=1: Bật hiển thị ảnh
72us
SET IRAM
or SCROLL
ADDR
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0
Bit SR (xem lại nhómlệnh “SCROLL or RAM
ADDR. SELECT”)
SR=1: AC0-AC5 địa chỉ bắt đầu cuộn dọc
SR=0:AC0-AC3 địa chỉ của IRAM
72us
SET
GRAPHICRAM
ADDR.
0 0 10
AC6
0
AC5
0
AC4
AC3
AC3
AC2
AC2
AC1
AC1
AC0
AC0
Đặt địa chỉ cho GDRAM
Đầu tiên đặt địa chỉ cho
cột sau đó là địa chỉ hàng
Địa chỉ cột :AC0-AC6Địa chỉ hàng: AC0-AC3
72us
Bài 12.1 Viết chương trình thư viện GLCD.c để tiện sử dụng trong các bài tập liên quan đến
LCD graphic.
Nội dung thư viện như sau: #define ON 1
#define OFF 0
#define XVAL 16
#define YVAL 32
#define GLCD_WIDTH 128
#define TEXT 0x30 // Mã khở i tạo chế độ text
#define graphic 0x36 // Mã khở i tạo chế độ graphic
typedef union
{
unsigned int16 word;
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 6/13
unsigned int8 nbyte[2];
} Dots;
typedef struct
{
int1 refresh; // cho phép cậ p nhật dữ liệu từ Ram VDK lên LCD
Dots pix[YVAL][XVAL];
} GD_RAM;
GD_RAM gdram;
void xuat_glcd(unsigned int8 lcd_signal,unsigned int8 lcd_ins_hthi)
{ lcd_signal = ~ lcd_signal; lcd_ins_hthi = ~lcd_ins_hthi;
xuat_1byte(lcd_signal); xuat_1byte(lcd_ins_hthi);
xuat_1byte(0); xuat_1byte(0);
mo_lcd;
mo_ic_74573_a_thong_dl();
output_high(rck_lcd20x4); output_low(rck_lcd20x4);
chot_ic_74573_a_goi_du_lieu;
}
void glcdcmd(unsigned int8 cmd) // Chương trình ghi mã điều khiển
{
XUAT_GLCD(0x07,cmd);
XUAT_GLCD(0x03,cmd);
}
void glcdchar(unsigned int8 dl) // Chương trình ghi dữ liệu
{
XUAT_GLCD(0x17,dl);XUAT_GLCD(0x13,dl);
}
void glcdmaunen(int1 color) // Chương trình tô màu nền (0-1) ở chế đô graphic
{
int8 v, h;
int16 d;
if(color)d=0xffff; else d=0;
for (v=0; v < YVAL; v++)
{for (h=0; h < XVAL; h++)
{
gdram.pix[v][h].word = d;
}
}
gdram.refresh = TRUE;
}
void capnhatvung(int8 x,int8 y,int8 rong, int8 cao) // Chương trình cậ p nhật nội dung ở vùng
{ // Ram vi điều khiển lên 1 vùng của LCDint8 v, h,hesox,hesoy; // ở chế độ graphic
if (gdram.refresh)
{ if((x/16)!=(x+rong)/16)rong=((rong+15)/16)+1;else rong=((rong+15)/16); x=x/16;
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 7/13
for (v=y; v <(y+cao); v++)
{ if(v>31){hesox=8+x;hesoy=v-32;}else {hesox=x;hesoy=v;}
glcdcmd( 0x80 |hesoy); // đặt địa chỉ hàng
glcdcmd( 0x80 | hesox); // đặt địa chỉ cột
for (h=hesox; h <(hesox+rong); h++)
{
glcdchar( gdram.pix[hesoy][h].nbyte[1]); // Ghi byte cao
glcdchar( gdram.pix[hesoy][h].nbyte[0]); // Ghi byte thấ p}
}
gdram.refresh = FALSE;
}
}
void glcdcapnhat () // Chương trình cậ p nhật nội dung vùng nhớ Ram xuất ra hiển thị { // toàn bộ màn hình LCD ở chế độ Graphic
int8 v, h;
if (gdram.refresh)
{
for (v=0; v <YVAL; v++)
{
glcdcmd( 0x80 | v); // đặt địa chỉ hàng
glcdcmd( 0x80 | 0); // đặt địa chỉ cột
for (h=0; h <XVAL; h++){
glcdchar( gdram.pix[v][h].nbyte[1]); // ghi byte cao
glcdchar( gdram.pix[v][h].nbyte[0]); // ghi byte thấ p}
}
gdram.refresh = FALSE; // báo cậ p nhật xong
}
}
void ktglcd(int8 mode) // Chương trình khở i tạo GLCD theo chế độ { // text hoặc graphic
glcdcmd(mode);
delay_ms(5);
glcdcmd(0x0c);
delay_ms(5);
}
void glcd_pixel(int8 x, int8 y, int1 color) // Chương trình ghi một điểm ảnh tại tọa độ x,y
{int8 v, h, b;
if(y>31){x += 128; y-= 32;};
v = y;
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 8/13
h = x/16;
b = 15 - (x%16);
if (color == ON) bit_set (gdram.pix[v][h].word, b);
else bit_clear (gdram.pix[v][h].word, b);
gdram.refresh = TRUE;
}
void xuatanh(int width,int height,int x,int y) // Chương trình cho phép xuất ảnh ra LCD
{ // Thay đổi “Logo_DHSPKTTP[ ]” để đổi
unsigned int i=0, j=0, k=0; // ảnh khác
unsigned int16 count=0;
for(j=0;j<height;j++)
{
for(;i<width;)
{
for(k=8;k>0;k--)
{
glcd_pixel(i+x,j+y,bit_test(Logo_DHSPKTTP[count],(k-1)));
i++;
}
count++;
}
i=0;
}
}
Phần A : Chế độ textĐịa chỉ DDRAM
Bài mẫu 12.2 Sử dụng chế độ text hiển thị lên GLCD nội dung sau:
Chương trình:
#include<TV_PICKIT2_SHIFT_1.c>
#include<tvglcd.c>
0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87
0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97
0x88 0x89 0x8A 0x8B 0x8C 0x8D 0x8E 0x8F
0x98 0x99 0x9A 0x9B 0x9C 0x9D 0x8E 0x9F
Dai Hoc SPKTBo Mon: DTCN
TTVXL Pic18F4550Module LCDGraphic
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 9/13
void main()
{
SET_UP_PORT_IC_CHOT();
ktglcd(text); // Khở i tạo chế độ text
glcdcmd(0x01); // Xóa màn hình
delay_ms(5);
glcdcmd(0x80); // Đầu hàng 1
glcdchar(" Dai Hoc SPKT");
glcdcmd(0x90);
glcdchar(" Bo Mon: DTCN");
glcdcmd(0x88);
glcdchar("TTVXL Pic18F4550");
glcdcmd(0x98);
glcdchar("Modul LCDGraphic");
WHILE(TRUE);
}
Bài 12.3 Viết chương trình đo nhiệt độ LM35, DS18B20,đếm sản phẩm 99-79 đồng thời đếm
giây chính xác 00-59 hiển thị GLCD ở chế độ text theo hình sau.
Chú ý: Để hiển thị giá trị số SV tách số và chuyển qua mã ASCII giống như LCD text mà SVđã đượ c học.
Phần B: Chế độ Graphic
1. Hướ ng dẫn chuyển ảnh thành file mã hex dùng 2 phần mềm GNU(thay đổi kích thước vàchuyển ảnh bất k ỳ thành ảnh nhị phân) và LCDAssistant ( chuyển ảnh nhị phân sang mãhex)
a.
Sử dụng phần mềm GNU
- Click vào icon để chạy phền mềm GNU- Mở ảnh cần chuyển đổi Tậ p tin/ Mở => chọn ảnh cần mở - Thay đổi kích thướ c ảnh cho phù hợp đề hiển thị lên được màn hình 128x64: Chọn
Ảnh/Co dãn ảnh
LM: 32DS: 33SP: 82TI : 28
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 10/13
Sửa lại kích thướ c ảnh mong muốn r ồi click “Co dãn” - Chuyển ảnh về thành ảnh nhị phân: Chọn Ảnh/Chế độ / Đã phụ lục..
Click chọn “Dùng bảng chọn màu đen và trắng (1bit)” r ồi chọn “Chuyển đổi”
- Lưu ảnh dướ i dạng đuôi BMP : Chọn Tập tin/ Lưu dạng…
b. Sử u dụng phần mềm LCDAssistant
- Click vào icon để chạy phần mềm
- Mở file cần chuyển đổi: File/Load image
- Cấu hình file lấy mã theo chiều ngang bằng cách click vào mục “Horizontal”
- Chuyển ảnh sang mã hex: Chọn File/Save output => đặt tên file ( tenfile.c) rồi nhấn
“Save”
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 11/13
Bài mẫu 12.4 Viết chương trình hiển thị Logo DH SPKT kích thước 64x64 đồng thờ i hiển
thị game Ping Pong bên nửa LCD còn lại
Chương trình
#include<TV_PICKIT2_SHIFT_1.c>
#include<spkt.c> // mã hex của logo SPKT
#include<tvglcd.c>#include<graphics.c> // Thư viện chứa các chương trình vẽ đườ ng
#include <stdlib.H> // thẳng, đườ ng tr òn ….
void main()
{ unsigned int8 xb,yb,sstop=0,xt=82,lt=15,diem=0;
signed int chieux=1, chieuy=1;
int tatdiem=0;
set_tris_b(0x3c);
SET_UP_PORT_IC_CHOT();
ktglcd(text); // Khở i tạo chế độ text
glcdcmd(0x01); delay_ms(5); // Xóa màn hình
glcdcmd(0x94);glcdchar(" 0="); glcdchar(0x1a); // Giao diện hướ ng dẫn chơi game
glcdcmd(0x8c);glcdchar(" 1="); glcdchar(0x1b);
glcdcmd(0x9c);glcdchar(" 2=Play");
delay_ms(5);
ktglcd(graphic); // Khở i tạo chế độ Graphic
glcdmaunen(0) ;
xuatanh(64,64,0,0) ; // Hiển thị Logo SPKT (chiều r ộng, chiều cao, x,y)
glcd_rect(65, 0, 127, 63, 0, 1); // Hiển thị khung vuông bao quanh cửa sổ game
glcd_rect(66, 1, 126, 62, 0, 1);
glcd_rect(65, 60, 127, 63, 1, 0); // Xóa cạnh đáy của khung vuông
glcdcapnhat () ; // Cho phép hiển thị ra màn hình
WHILE(TRUE)
{
if(sstop)
{
glcd_circle(xb, yb,4, 1, 1); // hiển thị trái banh hình tròn
capnhatvung (xb-6,yb-6,13,13) ; // Cho phép hiển thị trái banh glcd_rect(xt, 60, xt+lt, 62, 1, 1); // Hiển thị thanh hứng trái banh
capnhatvung (64,60,128,3) ; // Cho phép hiển thị thanh hứng banh
glcd_circle(xb,yb,4, 1, 0); // Xóa trái banh ở vị tr í cũxb+=chieux; // Cậ p nhật vị trí mới cho trái banh
yb+=chieuy;
if((yb<40)&&(tatdiem==1)) // Tắt hiển thị điểm khi tạo độ y banh <40
{tatdiem=0;ktglcd(text);glcdcmd(0x95);glcdchar(" ");ktglcd(graphic);}
if(xb>=121)chieux=rand()%1-2; if(xb<=71) chieux=rand()%2+1;
if((yb<=7))chieuy=rand()%2+1; // Khi banh đụng các cạnh bao thì đổi chiều di chuyểnif(yb>=60) // Khi tọa độ y của banh >59 thì Game Over { ktglcd(text); // Khở i tạo chế độ text để hiển thị Game Over
glcdcmd(0x95);
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 12/13
glcdchar("Game");
glcdcmd(0x8d);
glcdchar("Over");
sstop=0;
ktglcd(graphic);
}
else if(((yb==55)||(yb==56))&&((xb>(xt-4))&&(xb<(xt+lt+4))))
{ // Khi thanh hứng được banh thì tăng điểm đồng thời đổi chiều y của banh
diem++;
chieuy=rand()%1-2; // Chiều y đượ c nhận ngẫu nhiên giá trị -1 hoặc -2
ktglcd(text);
glcdcmd(0x95);glcdchar(" ");glcdchar(diem/10+48);glcdchar(diem%10+48);
tatdiem=1; // Hiển thị điểm số
ktglcd(graphic);
}
}
if(input(pin_b2)==0) // Kiểm tra nút điều khiển qua phải
{
glcd_rect(xt, 60, xt+lt, 62, 1, 0);
if(xt<110) xt+=2;
}
if(input(pin_b3)==0) // Kiểm tra nút điều khiển qua trái {
glcd_rect(xt, 60, xt+lt, 62, 1, 0);
if(xt>69) xt-=2;
}if(input(pin_b4)==0) // Kiểm tra nút Play
{ delay_ms(10);
if(input(pin_b4)==0)
{
diem=0;
xb= 75;yb= 10;
sstop=1;
ktglcd(text);
glcdcmd(0x01); delay_ms(2);ktglcd(graphic);
glcd_rect(67, 3,112, 63, 1, 0);
capnhatvung (67,3,45,61) ;
while(input(pin_b4)==0);
}
}
}
}
7/17/2019 GLCD 64x128
http://slidepdf.com/reader/full/glcd-64x128 13/13
Bài 12.5 Viết chương trình đồng hồ số DS13B07 hiển thị GLCD theo hình sau:
( ví dụ: 6 giờ 40 phút 15 giây)
Bài 12.7 Viết chương trình vẽ 1 hình người ( dùng chương trình vẽ đườ ng thẳng và hình tròn)hiển thị GLCD và dùng các phím 1,9,4,6 của phím ma trận để điều khiển cho người này dichuyền qua trái , phải , lên , xuống.
12 3 6 9 12HM
S