Home | Looking for something? Sign In | New here? Sign Up | Log out

Vi Điêu Khiển PIC và Giao thức SPI

I. GIỚI THIỆU GIAO THỨC SPI:
I.1. Giới thiệu:
SPI : Serial Perippheral Interface- Giao tiếp ngoại vi nối tiếp
Giao thức SPI do hãng Motorola phát minh và còn được biết đến với tên gọi khác là Microwire (hãng National Semiconductor phát triển). Cả SPI và Microwire đều có chung nguyên tắc hoạt động. Hiện nay giao thức SPI đã có các phiên bản cải tiến như QSPI (Queue SPI) và Microwire Plus.
Giao thức SPI cung cấp một giao thức nối tiếp đơn giản giữa MCU và thiết bị ngoại vi. Giống với các Bus nối tiếp khác như I2C, CAN hoặc USB , chuẩn giao tiếp SPI ngày càng được sử dụng rộng rãi trong lĩnh vực điện tử, đặc biệt là trong giao tiếp trao đổi dữ liệu với các ngoại vi.
Giao thức SPI được tích hợp trong một số loại thiết bị như:
+ Các bộ chuyển đổi (ADC và DAC)
+ Các loại bộ nhớ (EEPROM và FLASH)
+ Các loại IC thời gian thực
+ Các loại cảm biến (nhiệt độ, áp suất…)
+ và một số loại khác như: bộ trộn tín hiệu, LCD, Graphic LCD…
I.2. Kĩ thuật SPI:
I.2.1 BUS SPI
Giao tiếp SPI được thực hiện thông qua BUS 4 dây MISO, MOSI, SCK, SS nên đôi khi SPI còn được gọi là giao thức giao tiếp 4 dây.
a. MISO: Master Input Slave Output
Trong VĐK PIC, chân MISO được kí hiệu là SDO
Chân MISO dùng để truyền dữ liệu ra khỏi Modun SPI khi đặt cấu hình là Slave và nhận dữ liệu khi đặt cấu hình là Master.
b. MOSI: Master Output Slave Input.
Trong VĐK PIC, chân MOSI được kí hiệu là SDI
Chân MOSI dùng để truyền dữ liệu ra khỏi Mođun SPI khi đặt cấu hình là Master và nhận dữ liệu khi đặt cấu hình là Slave.
c. SCK : Serial Clock
Chân SCK cấp xung đồng bộ để truyền nhận dữ liệu với một Slave nào đó được chọn
d. SS : Slave Select
Chân SS cấp tín hiệu chọn chip ở ngõ ra của Mođun SPI đến một ngoại vi khác nếu đặt cấu hình là Master và chân SS sẽ là ngõ vào nhận tín hiệu chọn chip nếu được cấu hình là Slave
I.2.2 SPI là giao thức đồng bộ
Modun SPI cho phép giao tiếp nối tiếp đồng bộ kép giữa MCU hoặc MPU với thiết bị ngoại vi
- Tín hiệu SCK được cung cấp bởi Master nhằm tạo xung đồng bộ cho phép dữ liệu được truyền đi hoặc khi đọc dữ liệu nhận được
- Khi tín hiệu SCK được phát ra thì tín hiệu này có thể thay đổi nhưng không làm hỏng dữ liệu. Lí do là trong giao thức SPI, tốc độ của dữ liệu truyền đi sẽ thay đổi theo sự thay đổi của SCK. Điều này rất có lợi nếu như MCU hoặc MPU bị cấp xung đồng hồ không chính xác (VD: bộ dao động RC)
I.2.3 SPI là giao thức chủ-tớ
Giao diện cơ bản của giao tiếp SPI
Thiết bị tên ‘Processor’ đóng vai trò Master, thiết bị ‘Peripheral’ là Slave.
Cả Master và Slave đều có thanh ghi dịch nối tiếp ở bên trong. Thiết bị Master bắt đầu việc trao đổi dữ liệu bằng cách truyền đi một Byte vào thanh ghi dịch của nó, sau đó Byte dữ liệu sẽ được đưa sang Slave theo đường tín hiệu MOSI (SDI), Slave sẽ truyền dữ liệu nằm trong thanh ghi dịch của chính nó ngược trở về Master thông qua đường tín hiệu MISO (SDO). Bằng cách này, dữ liệu của hai thanh ghi sẽ được trao đổi với nhau. Việc đọc và ghi dữ liệu vào Slave diễn ra cùng một lúc nên tốc độ trao đổi dữ liệu diễn ra rất nhanh. Do đó, giao thức SPI là một giao thức rất có hiệu quả.
Trong giao thức chủ-tớ, chỉ có thiết bị Master mới có thể điều khiển (phát ra) xung SCK. Dữ liệu sẽ không được truyền đi nếu như Master không cung cấp xung SCK và tất cả các thiết bị Slave đều được điều khiển bởi xung nhịp phát ra từ Master trong khi đó, Slave lại không có khả năng phát xung.
Có 2 cách kết nối Master-Slave:
a. Master và các Slave độc lập
Trong cách kết nối này, tín hiệu SCK và SDO từ Master được cung cấp đến từng Slave. Đường tín hiệu SDO của các Slave nối chung lại với nhau và truyền về Master. Lúc này, Master sẽ lựa chọn Chip Slave nào để trao đổi dữ liệu thông qua các chân SS riêng lẻ.
b. Cách nối Daisy-Chained
Hình dưới đây mô tả cách kết nối Daisy-Chained giữa Master và Slave
Ví dụ ta thực hiện giao tiếp SPI giữa Master và 3 thiết bị Slave. Cách nối dây như hình vẽ, khác với cách kết nối cơ bản, ở phương pháp này ta chỉ sử dụng duy nhất 1 chân SS (Chip Select). Giả sử Master truyền đi 3 Bytes dữ liệu lên Bus SPI. Byte đầu tiên được dịch vào Slave A. khi byte thứ hai truyền đến A, byte đầu tiên sẽ bị đẩy ra khỏi A và truyền đến B. Tương tự, khi byte thứ ba truyền vào A, byte thứ hai sẽ bị dịch sang B và Byte đầu tiên sẽ bị dịch sang C. Nếu Master muốn đọc lại dữ liệu trong Slave A, nó phải truyền lại chuỗi 3 Bytes dữ liệu (giả) lần nữa. Khi đó dữ liệu trong A sẽ chuyển sang B rồi chuyển sang C, sau đó về Master. Suốt quá trình sử lý, Master luôn nhận được Byte dữ liệu từ Slave B và C.
Tuy nhiên, cách nối SPI Daisy-Chained không phải lúc nào cũng áp dụng được cho tất cả các thiết bị Slave. Do đó, ta cần phải tham khảo datasheet trước khi tiến hành kết nối.
I.2.4 SPI là giao thức trao đổi dữ liệu
Dữ liệu lúc nào cũng được truyền qua lại giữa các thiết bị SPI. Thật ra, không có khái niệm thiết bị phát hay thiết bị nhận trong giao thức SPI mà mỗi thiết bị có 2 đường dữ liệu, một đường dữ liệu vào và một đường dữ liệu ra.
Dữ liệu truyền đi được điều khiển bởi xung SCK từ Master.
Khi được truyền đi, dữ liệu vào cần phải được đọc ngay, nếu không sẽ bị mất đi và khi đó, giao thức SPI có thể sẽ ngưng hoạt động. Để tránh tình trạng này, lúc nào ta cũng phải đọc dữ liệu về ngay sau khi truyền đi cho dù dữ liệu đõ không thực sự cần thiết.
Thường thì 1 tín hiệu chọn Slave sẽ tác động mức thấp để chỉ ra Slave nào được truy cập. Tín hiệu này phải được sử dụng khi có nhiều hơn 1 Slave trong cùng hệ thống và thường không sử dụng đến khi trong mạch chỉ có 1 Slave. Tuy nhiên, theo nguyên tắc thì ta nên sử dụng tín hiệu này trong cả hai trường hợp trên.
Tín hiệu SS sẽ chỉ ra Slave nào mà Master muốn bắt đầu một quá trình trao đổi dữ liệu bằng giao thức SPI giữa thiết bị Slave đó và chính nó. Nếu tín hiệu trên đường SS là 0 thì chứng tỏ giao thức SPI đang hoạt động. Ngược lại, nếu tín hiệu là mức 1 thì giao thức SPI không hoạt động.
Một đặc điểm khác khá quan trọng của tín hiệu SS là nó vó tác dụng làm tăng cường khả năng miễn nhiễm cho hệ thống. Lí do là SS sẽ Reset Slave để nó có thể nhận Byte dữ liệu tiếp theo.
SPI có 4 mode hoạt động, phụ thuộc vào cực tính và pha của xung đồng hồ. Trong trường hợp cực âm của xung đồng hồ, tín hiệu SCK sẽ ở mức thấp trong quá trình nghỉ và chuyển sang mức cao trong quá trình truyền dữ liệu. Ngược lại, đối với trường hợp cực dương của xung đồng hồ, tín hiệu SCK ở mức cao trong quá trình nghỉ và chuyển sang mức thấp khi truyền dữ liệu.
+ SPI Mode 0:
Mô tả : Xung dương, dữ liệu được chốt trước khi dịch
Giản đồ thời gian:
+ SPI Mode 1:
Mô tả : Xung dương, dữ liệu được dịch đi trước khi chốt
Giản đồ thời gian
+ SPI Mode 2:
Mô tả : Xung âm, dữ liệu được chốt lại trước khi dịch
Giản đồ thời gian:
+ SPI Mode 3:
Mô tả : Xung âm, dữ liệu bị dịch đi trước khi chốt lại
Giản đồ thời gian:
II – SPI TRONG VĐK PIC :
SPI Mode trong PIC cho phép 8 bit dữ liệu được truyền nhận đồng bộ 1 cách simultaneously. Hỗ trợ hoạt động ở cả 4 Mode. Để tiến hành hoạt động giao tiếp, về cơ bản, 3 chân sau đây được sử dụng:
+ Serial Data Out – RC5/SDO
+ Serial Data In – RC4/SDI/SDA
+ Serial Clock – RC3/SCK/SCL
Ngoài ra, nếu trong hệ thống có nhiều hơn 1 Slave thì chân Chip Select sẽ được dùng:
+ Slave Select – RA5/AN4/SS/HLVDIN
Sơ đồ nguyên lý của khối SPI tích hợp trong Vi Điều Khiển PIC
Để sử dụng Mode SPI ta cần phải thiết lập các giá trị chính xác cho các thanh ghi Control. Module MSSP của PIC có 4 thanh ghi dành cho Mode SPI. Đó là:
+ MSSP Control Register 1 (SSPCON1)
+ MSSP Status Register (SSPSTAT)
+ Serial Receive/Transmit Buffer Register (SSPBUF)
+ MSSP Shift Register (SSPSR) – Không truy xuất trực tiếp được
SSPCON1 và SSPSTAT là các thanh ghi điều khiển và cho biết trạng thái hoạt động của Mode SPI. SSPCON1 là thanh ghi có thể đọc hoặc ghi. Trong khi đó, 6 bit thấp của SSPSTAT chỉ có thể đọc, còn 2 bit cao ta có thể đọc hoặc ghi.
SSPSR là thanh ghi có chức năng ghi dịch dữ liệu vào hoặc ra.
SSPBUF là thanh ghi Buffer, có chức năng lưu dữ liệu tạm thời trước khi ghi vào Slave hoặc sau khi đọc về.
Ở hoạt động nhận dữ liệu, SSPSR và SSPBUF kết hợp lại tạo thành bộ nhận dữ liệu được đệm kép. Khi SSPSR nhận 1 byte hoàn chỉnh, nó sẽ được chuyển đến SSPBUF và bit SSPIF được Set lên 1.
Trong suốt quá trình truyền dữ liệu, SSPBUF không được đệm kép. Nếu ta ghi dữ liệu vào SSPBUF thì dữ liệu sẽ được ghi vào cả 2 thanh ghi SSPBUF và SSPSR.
Chi tiết về các bit của các thanh ghi SPI Mode
+ SSPSTAT (MSSP Status Register)

Bit7 SMP: bit Lấy Mẫu
SPI Master Mode:
1 = dữ liệu vào được lấy mẫu tại thời điểm cuối của dữ liệu ra
0 = dữ liệu vài được lấy mẫu tại giữa thời điểm dữ liệu ra
SPO Slave Mode:
Bit SMP phải được xóa khi sử dụng ở Slave Mode
Bit6 CKE: SPI Clock Select bit
1 = quá trình truyền diễn ra khi xung clock chuyển từ trạng thái tác động sang trạng thái nghỉ
0 = quá trình truyền diễn ra khi xung clock chuyển từ trạng thái nghỉ sang trạng thái hoạt động
Bit5 D/A: Data/Address bit, chỉ sử dụng ở Mode I2C
Bit4 P : Stop bitm chỉ sử dụng ở Mode I2C
Bit3 S : Start bit, chỉ sử dụng ở Mode I2C
Bit2 R/W : bit Read/Write, chỉ sử dụng ở Mode I2C
Bit1 UA : Update Address bit, chỉ sử dụng ở Mode I2C
Bit0 BF : Buffer Full Status bit (chỉ sử dụng ở Mode nhận)
1 = Đã nhận đủ dữ liệu, SSPBBUF đầy
0 = Chưa nhận đủ dữ liệu SSPBUF rỗng
+ SSPCON1 (MSSP Control Register)
Hình trên cho biết vị trí các bit của thanh ghi SSPCON1
Các bit điều khiển quá trình giao tiếp SPI là :
SSPOV : bit Cờ Tràn, cho biết Synchronous Serial Port bị tràn dữ liệu
SSPEN : viết tắt của Synchronous Serial Port Enable
CKP : điều khiển Clock Polarity
SSPM3:SSPM0 : các bit lựa chọn Mode SPI
Nếu là 0101 : SPI Slave Mode,clock=SCK pin, chân SS bị cấm.
0100 : SPI Slave Mode,clock=SCK pin, chân SS được cho phép.
0011 : SPI Master Mode, clock=TMR2 output/2
0010 : SPI Master Mode, clock= Fosc/64
0001 : SPI Master Mode, clock= Fosc/16
0000 : SPI Master Mode, clock= Fosc/4
HOẠT ĐỘNG CỦA SPI TRONG PIC
Khi khởi tạo giao tiếp SPI,ta phải chỉ rõ là thiết lập chế độ hoạt động nào bằng cách ghi vao thanh ghi SSPCON1 và SSPSTAT các giá trị thích hợp. Giá trị này sẽ cho biết các thông số sau được chọn hay không:
- Master Mode (SCK là ngõ ra xung clock)
- Slave Mode (SCK là ngõ vào xung clock)
- Clock Polarity (trạng thái nghỉ của xung SCK)
- Data Input Sample Phase (tại điểm giữa hoặc cuối của xung clock khi data out)
- Cạnh xung clock (dữ liệu được truyền đi tại cạnh lên/xuống của xung clock)
- Clock Rate (chỉ cho phép iử Master Mode)
- Slave Select Mode (chỉ sử dụng ở Slave Mode)
Như đã giới thiệu, Module MSSP của PIC có 2 thanh ghi chức năng Truyền/Nhận là Thanh ghi-dịch SSPSR và thanh ghi đệm SSPBUF. SSPSR sẽ dịch chuyển data vào hoặc ra khỏi thiết bj, bit Msb trước. SSPBUF sẽ giữ dữ liệu mà dữ liệu này đã được ghi vào SSPSR cho đến khi nhận được byte dữ liệu kế tiếp. Nếu SSPBUF đã nhận đủ 8 bit dữ liệu thì bit BF (Buffer Full detect bit)và SSPIF (Interrupt Flag bit) của thanh ghi SSPSTAT được set. Bất cứ việc ghi/đọc dữ liệu trong thanh ghi SSPBUF trong qua trình truyền/nhận đều bị cấm và bit WCOL sẽ được set lên 1.Bit này cần được xóa để nếu dữ liệu tiếp theo được ghi vào SSPBUF hoàn tất thành công.
Cần phải đọc dữ liệu trong SSPBUF ngay sau khi nhận về để cho phép các dữ liệu tiếp theo được ghi vào. Bit BF sẽ cho biết khi nào SSPBUF đầy dữ liệu (quá trình truyền hoàn tất). Khi ta đọc giá trị trong thanh ghi SSPBUF, bit BF sẽ được xóa.
Một cách tổng quát, Ngắt của Module MSSP thường dùng để xét xem quá trình truyền/ nhận xong hay chưa. Nếu bit SSPIF = 1 thì chứng tỏ quá trình truyền nhận đã hoàn tất. Ngược lại, nếu bit SSPIF = 0 thì quá trình chưa hoàn thành.
THIẾT LẬP CHÂN VÀO/RA SPI:
Để thiết lập PORT nối tiếp, ta cần phải set bit cho phép SPI hoạt động – bit SSPEN của thanh ghi SSPCON1. Nếu muốn thiết lập lại cấu hình SPI, ta chỉ việc xóa bit SSPEN, khởi tạo lại giá trị cho thanh ghi SSPCON, sau đó lại Set bit SSPEN = 1. Lúc này, các chân của Port nối tiếp là SDI, SDO,SCK, SS. Muốn các chân này có đầy đủ chức năng của Port dữ liệu vào ra ta phải chọn hướng dữ liệu cho từng chân bằng cách thao tác lên thanh ghi TRISx như sau:
+ SDI : chiều dữ liệu tự động được điều khiển bởi Mode SPI
+ SDO : Chân dữ liệu ra nên cần phải xóa bit 5 của TRISC.
+ SCK : Nếu ở chế độ Master thì phải xóa bit 3 của TRISC
+ SCK : Nếu ở chế độ Slave thì bit 3 của TRISC cần được set lên 1
+ SS : Set bit 7 của TRISF
PIC Ở MODE MASTER SPI
Chip Master trong giao tiếp SPI có thể khởi tạo trao đổi dữ liệu bất cứ lúc nào vì nó có thể diều khiển xung SCK. Ở Master Mode, dữ liệu được truyền đi hoặc nhận về ngay khi được ghi vào SSPBUF. Nếu Master chỉ nhận mà không truyền dữ liệu thì chân SDO có thể sử dụng như chân ngõ vào. Thanh ghi SSPSR vẫn tiếp tục dịch dữ liệu bên trong nó đồng bộ với xung SCK. Cứ mỗi Byte nhận được, PIC sẽ lưu vào trong thanh ghi SSPBUF (cờ ngắt và các bit trạng thái có thể được set lên 1).
Cực tính của xung SCK được chọn bằng cách thao tác lên bit CKP (SSPCON1<4>). Dạng sóng của giao tiếp SPI được biểu diễn như hình bên dưới với bit MSB được truyền đi trước. Ở Master Mode, tốc độ xung SCK của giao tiếp SPI được chọn một trong số 4 tùy chọn sau:
- Fosc/4 ( hoặc Tcy)
- Fosc/16 (hoặc 4 - Tcy)
- Fosc/64 (hoặc 16 – Tcy)
- Timer2 output/2
Tốc độ truyền dữ liệu có thể đạt giá trị cao nhất là 10 Megabit/giây (với tần số thạch anh ngoài là 40MHz).
Hình sau cho thấy dạng sóng của SPI Master Mode. Khi bit CKP = 1, dữ liệu trên dây SDO hợp lệ trước mỗi cạnh lên/xuống của xung SCK.
PIC Ở MODE SLAVE SPI
Ở chế độ Slave, dữ liệu chỉ được truyền đi hay nhận về khi có xung SCK. Khi bit cuối cùng đã được chốt, cờ ngắt SSPIF sẽ được set.
Trước khi cho phép PIC hoạt động ở Slave Mode ta cần phải chú ý đến xung SCK. Xung clock phải khớp với trạng thái nghỉ của xung SCK. Trạng thái nghỉ được lựa chọn bằng việc thao tác lên bit CKP.
Trong khi đang ở SPI Slave Mode, xung clock cần thiết cho việc trao đổi dữ liệu được lấy từ chân SCK. PIC có thể truyền/ nhận trong lúc đang ‘ngủ đông’. Nếu có 1 byte dữ liệu được nhận thì PIC sẽ ‘thức dậy’.
THIẾT BỊ SLAVE TỰ ĐỘNG LỰA CHỌN SỰ ĐỒNG BỘ HÓA
Chân Slave Select (SS) cho phép đồng bộ hóa ở chế độ SPI Slave. Do đó, nếu đặt cấu hình hoạt động ở chế độ Slave thì ta nên cho phép chân SS để điều khiển (đặt các bit SSPCON1<3:0> = 0x04). Khi chân SS được đưa xuống mức thấp, sự truyền/ nhận dữ liệu được cho phép và chân SDO sẽ được thúc để tải dữ liệu. Khi chân SS được đưa lên mức cao, chân SDO sẽ không được thúc nữa, dữ liệu sẽ không được lưu thông.
Nếu SPI Slave Mode có chân SS điều khiển được kích hoạt, thì mô-đun SPI sẽ reset khi chân SS được đưa lên Vdd. Lúc này bit counter bị xóa về ‘0’. Ta cũng có thể xóa bit counter bằng cách xóa bit SSPEN.
Cần phải sử dụng chân SS nếu như SPI Slave Mode được dùng với bit CKE được set.
DẠNG SÓNG CỦA SPI SLAVE MODE (CKE = 0)
DẠNG SÓNG CỦA SPI SLAVE MODE (CKE = 1)

Thứ ba, ngày 10 tháng ba năm 2009

PIC16F877A+GLCD

- Chuẩn bị :
+ PIC16F877A
+ GLCD 128x64 pixel
+ Tốt nhất là mua luôn mạch HMX_PIC_Quick_Start_KIT để thực tập về sau.
- Việc giao tiếp giữa PIC và GLCD (Graphic LCD) được thực hiện như sơ đồ bên dưới. PORTB của PIC giữ vai trò là BUS điều khiển, PORTD làm BUS data trong kết nối với GLCD.

Sau đây là chương trình viết cho PIC16F877A:

/*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
_/ Project : GIAO TIEP PIC16F877A va GLCD 128x64 /_
_/ UNG DUNG DON GIAN VOI VIEC HIEN THI CHUOI TEXT /_
_/ Thuc hien : HOANG MINH XUAN /_
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Linh kien can thiet:
1> Mach phat trien HMX_PIC_Quick_Start_KIT ( lien he 0949 044 033)
2> GLCD 128x64 pixels
3> PIC16F877A
4> Mach nap PIC - PICKIT2 V1.0
Mo ta phan cung:
Chan cua PIC16F877A | Chan GLCD tuong ung
RD0 | D0
RD1 | D1
RD2 | D2
RD3 | D3
RD4 | D4
RD5 | D5
RD6 | D6
RD7 | D7
RB2 | CS2
RB3 | CS1
RB4 | RS
RB5 | R/W
RB6 | E
RB7 | RST
*/
void main()
{
// khoi tao PORT cho PIC

TRISB = 0x00; // PORT B is output
TRISD = 0x00; // PORT D is output
PORTB = PORTD = 0x00; // clear all output PORT

// khoi tao GLCD

Glcd_Init(&PORTB,3,2,4,5,7,6,&PORTD);
Glcd_Set_Font(font5x7,5,7,32);
Glcd_Fill(0); // clear screen
while(1)
{
Glcd_Write_Text("HOANG MINH XUAN",5,2,1);
Glcd_Write_Text("From: Cantho City",5,3,1);
Glcd_Write_Text("Place I work: RVC",5,4,1);
Glcd_Write_Text("Hello Girls !",5,5,1);
}

}

- Giải thích ý nghĩ một số hàm trong chương trình

+ Hàm Glcd_Init : khởi tạo cho GLCD bằng cách chỉ định PORT_điều_khiển, các chân điều khiển, PORT_data. Ở đây tôi chọn PORT B làm các chân điều khiển giao tiếp, tương ứng như sau:
. RB2 (chân RB2 của PORT B) nối với chân Chip_Select_1 của GLCD.
. RB3 ------ Chip_Select_2
. RB4 ------ RS
. RB5 ------ Read/Write
. RB6 ------ Enable the screen
. RB7 ------ Reset the GLCD
và, PORT D làm BUS dữ liệu 8 bit song song, chuyển dữ liệu hoặc commen lên GLCD.
+ Hàm Glcd_Set_Font: đặt Font chữ cho GLCD. Ở đây tôi chọn Font 5x7 (1 kí tự có kích thước 5x7 pixel)
+ Hàm Glcd_Fill: nếu tham số truyền vào là 0 --> các điểm ảnh sẽ bị xóa, màn hình như được làm sạch (clear screen). Nếu tham số là 1 thì màn hình sẽ đầy các điểm ảnh được ghi (nhìn đen thui)
+ Hàm Glcd_Write_Text: Ghi 1 đoạn Text lên GLCD.
Sau khi biên dịch chương trình, tôi dùng mạch nạp PICKIT2 V1.0 nạp file HEX xuống chip PIC16F877A, giao diện phần mềm PICKIT2 khi nạp thành công :


và đây là kết quả chương trình trên: