PIC Vietnam

Go Back   PIC Vietnam > Các Đề Tài > Các dự án mã nguồn mở

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Các dự án mã nguồn mở Nếu bạn không mở mã nguồn, ít nhất là một phần nào đó trong dự án của bạn, xin đừng vào đây.

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 04-01-2014, 02:27 AM   #1
caddish12
Đệ tử 1 túi
 
caddish12's Avatar
 
Tham gia ngày: Apr 2010
Bài gửi: 25
:
Cool Điều Khiển Màn Hình Nokia 6100 với PIC18F4620

Chào cả nhà!

Hôm nay mình muốn giới thiệu đến các bạn cách điều khiển màn hình 4096 màu của Nokia 6100 bằng PIC18F4620
(mình chọn con pic này do mình sẵn có, các bạn có thể tùy ý dùng với mọi con khác, avr, arm...)


P/s: Đây là dự án mã nguồn mở nên các bạn có thể tùy ý sử dụng thư viện vào các project của các bạn mà không cần sự cho phép của tác giả

Như các bạn đã biết, những module màn hình màu có sẵn trên thị trường hiện nay thì giá có thể nói là mắc (đối với sinh viên), vậy tại sao chúng ta không lấy màn hình của nokia này và làm cho mình 1 module nho nhỏ nhỉ? Giá màn hình này khá rẻ, chỉ 45k/cái =]]

Trước tiên thì mình giới thiệu sơ qua về màn hình:

Nokia 6100 LCD

- Độ phân giải là 132x132 pixels
- Màn hình 4096 màu
- Các chế độ hiển thị: 8-bit (RRRGGGBB), 12-bit (4-bit Red, 4-bit Green, 4-bit Blue)
- Hoạt động ở điện áp 3.3V
- Giao tiếp 9-bit SPI
- Dùng chip điều khiển là Phillips PCF8833 hoặc Epson S1D15G0 (Ở vn mình thường bán màn hình dùng chip của Phillips)

Và lưu ý là màn hình này bán ở tiệm đt ở tp.hcm với giá giao động 45-55k tùy chất lượng, nhưng theo kinh nghiệm thực tế thì các bạn k nên mua loại màn hình có pad để gắn socket màu xanh như ở mục sơ đồ chân vì nó cho màu cùi lô lắm , mà nên mua loại màu vàng hoặc vàng nâu như thế này:



Sơ đồ chân

Các bạn có thể phân biệt được các chân của LCD qua hình dưới:


Để kết nối với PIC18F thì các bạn có thể dùng chân bất kỳ của PIC, như ví dụ ở dưới thì mình dùng hẳn 1 port để nối dây cho tiện, các bạn có thể tham khảo:
Code:
//
// SPI define to interface with LCD
//
#define SPI_SDO 		LATDbits.LATD4 
#define SPI_SCK 		LATDbits.LATD5 
#define SPI_SDO_TRIS 	TRISDbits.TRISD4
#define SPI_SCK_TRIS 	TRISDbits.TRISD5

//
// IO pin assignments that connect to the LCD display
//
#define LCD_CS	 			LATDbits.LATD6
#define LCD_CS_TRIS 		TRISDbits.TRISD6
#define LCD_RESET	 		LATDbits.LATD3 
#define LCD_RESET_TRIS 		TRISDbits.TRISD3
#define LCD_LED_TRIS		TRISDbits.TRISD7	
#define LCD_LED				LATDbits.LATD7

Giải thích về ý nghĩa các PIN của LCD

VCC: Đây là nguồn supply cho màn hình,bao gồm chung cho VCC logic và VCC analog của màn hình, màn hình này chạy ở mức điện áp là 1.8->3.6V (3.6 thì mình thử gòi chứ 1.8 thì chưa có điều kiện )
RESET: Hardware reset cho màn hình
CS: Chip select trong giao tiếp SPI, enable module
CLK: Xung nhịp cấp cho giao tiếp SPI (SCK trong define của mình)
DATA: Chân này nhận dữ liệu vào LCD( SDO trong define)
VLED+: Chân (+) của LED màn hình
VLED-: chân (-) của LED màn hình

Giao Tiếp

Nokia 6100 LCD dùng kiểu giao tiếp SPI nhưng chỉ dùng có 2 dây là SCK (clock) và SDA (data in) mà chắc chẳng ai muốn lấy dữ liệu gì ra từ cái màn hình này quá )

Một điều cần lưu ý trong khi giao tiếp với màn hình này là nó dùng 9-bit, tức là bit đầu tiên sẽ để xác định lệnh cần gửi là data(dữ liệu ghi vào) hay command (lệnh), nếu data thì bit đầu tiên sẽ là HIGH, còn nếu là command thì sẽ là LOW như hình ở dưới:


Theo như mình thử nghiệm thì màn hình này có thể hoạt động được ở xung 80MHz (dùng PIC32, chạy nuột như con chuột :O) tức là 1 lệnh thực hiện trong vòng 12.5ns

Dưới đây là mạch giao tiếp với pic18, các bạn có thể down ở link cuối bài


Các bạn chú ý là điện áp giữa chân VLED+ và VLED- là 7V nhé, dòng cỡ khoảng 50mA là đủ độ sáng, nếu thích có thể tăng lên 150mA, rất sáng nhưng sẽ làm nóng màn hình
Mình dùng IC boost nguồn MC34063 của ON Semi để nâng điện áp từ 3.3V lên 7V, dùng transistor để điều khiển on/off cũng như để kéo dòng. Nếu muốn điều chỉnh độ sáng màn hình các bạn có thể dùng PWM để điều khiển transistor-> dim màn hình.




Addressing Pixel Memory

(tạm dịch là định địa chỉ bộ nhớ cho điểm ảnh - có nhìu từ mình xin k dịch ra tiếng việt nhé :3)

Chip driver PCF8833 có 17424 ô nhớ word (132x132 pixel), mỗi word sẽ chứa 12pixel RGB. Chúng ta định địa chỉ của mỗi điểm ảnh nhất định thông qua lênh định địa chỉ hàng (page address set) và lệnh định địa chỉ cột (column address set) của pixel đó. Page address set và Column address set sẽ được định nghĩa bởi pixel bắt đầu và pixel kết thúc.
Bộ nhớ pixel sẽ có 132 hàng và 132 cột như hình dưới:


Để định địa chỉ cho 1 pixel, ta dùng set cùng 1 address cho điểm bắt đầu và điểm kết thúc, như câu lệnh bên dưới:

Code:
	// define the right & left 
	WriteCommandToLCD(PASET);  //Page address set
	WriteDataByteToLCD(2);           // hàng của điểm bắt đầu
	WriteDataByteToLCD(2);          // hàng của điểm kết thúc
	
	// define the top and bottom
	WriteCommandToLCD(CASET);  //column address set
	WriteDataByteToLCD(9);
	WriteDataByteToLCD(9);
Để định địa chỉ cho một ô hình chữ nhật cho hình trên, ta sẽ định địa chỉ lần lượt cho hàng và cột của điểm bắt đầu và điểm kết thúc, như ví dụ:

Code:
	// define the right & left 
	WriteCommandToLCD(PASET);  //Page address set
	WriteDataByteToLCD(4);           // điểm bắt đầu
	WriteDataByteToLCD(11);  //điểm kết thúc
	
	// define the top and bottom
	WriteCommandToLCD(CASET);  //column address set
	WriteDataByteToLCD(3);
	WriteDataByteToLCD(9);
Và trong project này mình dùng chế độ 8-bit để hiện thị chữ, còn 12-bit để hiện thị hình ảnh được lưu trong bộ nhớ chương trình hoặc được load lên từ sdcard (bài sau)

Với chế độ 8-bit (3-bit đỏ, 3-bit xanh lá, 2-bit xanh dương), thì điều cần thiết phải làm là chuyển đổi từ 8-bit sang 12-bit data, và khai báo RGBSet của PCF8833 sẽ là chế độ 8-bit và dùng 1 bảng màu mới để định nghĩa lại màu cho màn hình.


Khởi động LCD

Khi cấp nguồn cho Nokia 6100 LCD, thì nó sẽ không thể chạy ngay được, vì nó đang trong chế độ SLEEP IN, hiểm nôm na là ngủ

Để đánh thức LCD dậy hoạt động và hiển thị thì theo datasheet, chúng ta phải tạo 1 Hardware reset, sau đó truyền lệnh SLEEP OUT để đánh thức LCD, tiếp đến là xác định hướng hiển thị cho LCD và cuối cùng là xác định chế độ màu (8,12,16). Dưới đây là lệnh khởi động cho LCD
Code:
      
        SPIInit();   //thiếp lập giao tiếp
	
	//Tạo 1 hardware reset
	LCD_RESET = 0;
	delay_ms(30);
	LCD_RESET = 1;
	delay_ms(30);

	//gửi lệnh sleep out
	WriteCommandToLCD(SLEEPOUT);
	delay_ms(2);

       //Chọn hướng màn hình
	WriteCommandToLCD(MADCTL);	
	WriteDataByteToLCD(DIRECTION);

	// set độ tương phản
	WriteCommandToLCD(SETCON); 
	WriteDataByteToLCD(0x30);

	//Cho phép màn hình hiển thị 
	delay_ms(4); 
	WriteCommandToLCD(DISPON);		

	//Chọn chế độ màu, ở đây là 8-bit
	LCDSelectColorMode(ColorMode, 0);
Độ tương phản của màn hình này nằm trong khoảng 0-63, các bạn có thể set để phù hợp với mắt nhìn
Hướng màn hình: Cái này rất quan trọng trong việc hiển thị, các bạn có thể chọn để màn hình hiển thị ngang, dọc, hay lật ngược...đủ mọi kiểu bạn thích Cái này mình sẽ dành thời gian thảo luận sau.


Firmware

Firmware của mình là nằm trong 1 project hoàn chỉnh (cả firmware lẫn hardware)
Hardware thì mình cung cấp file DSN và MAX (các bạn nên dành time để vẽ mạch, đó là cách làm quen nhanh nhất) còn firmware thì từ bây giờ về sau trong các project mình post lên sẽ đều có chung 1 cấu trúc thế này:



Các bạn có thể tìm thấy thứ mình cần được sắp xếp như sau:

HardwareConfig.h: Định nghĩa chân cho MCU và Peripherals, các bạn có thể tìm thấy cách nối các chân với nhau hay những định nghĩa thuộc dạnh "global"
HardwareConfig.c: config phần cứng, thường là config chung cho MCU, còn peripheral sẽ dc config riêng trong nó
Driver: Chứa các file liên quan của project
Built: chứa file output
Object: chứa file .o k cần thiết
BMP: những file cần thiết cho project
Tên folder có thể thay đổi nhưng các file định nghĩa sẽ k thay đổi nhiều.

Firmware mình có viết sẵn các hàm để in chữ ra màn hình, in ký tự, vẽ hình tròn, hình chữ nhật, vẽ line, vẽ hình ảnh bitmap dc lưu trong bộ nhớ trương trình...
Và chương trình cũng dùng uart để bug những lỗi khi code nhé, các bạn nào cần hãy lấy để sử dụng!
Các bạn có thể tham khảo.

Ví dụ để in chữ ra màn hình, các bạn dùng lệnh:
Code:
LCDDrawStringRGB8((void*)"Insert SD Card!", ROM_STRING, 66 , 70, 
		JUSTIFY_CENTER, Font_MediumBold, RGB8_RED, RGB8_WHITE);
Trong đó theo thứ tự:
ROM_STRING: loại dữ liệu xuất ra dc lưu trong ROM
JUSTIFY_CENTER: canh giữa màn hình, vị trí 66
Font_MediumBold: Kiểu font mà medium bold
RBG8_RED: màu chữ là đỏ, chế độ 8-bit
RGB8_WHITE: nền của chữ màu trắng, chế độ 8-bit màu

Và dưới đây là thành quả nhé!


Chúc các bạn thành công!

p/s: project sau mình sẽ hướng dẫn đọc file hình ảnh từ sd card và hiển thị lên màn hình Nokia 6100, các project còn lại mình sẽ post sau

Link Download:
Kiểu Chân (socket)
PCF8833 Datasheet
Hardware
Firmware




thay đổi nội dung bởi: caddish12, 04-01-2014 lúc 01:54 PM.
caddish12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:47 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam