|
Tài trợ cho PIC Vietnam |
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 |
04-01-2014, 02:27 AM | #1 |
Đệ tử 1 túi
Tham gia ngày: Apr 2010
Bài gửi: 25
: |
Đ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); 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ớ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); 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); 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. |
|
|