Điều Khiển Màn Hình Nokia 6100 với PIC18F4620

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • caddish12
    Đệ tử 1 túi
    • Apr 2010
    • 25

    #1

    Đ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



    
    Last edited by caddish12; 04-01-2014, 12:54 PM.
    Thanh Nguyen,
    International University, VNU
  • motu
    Đệ tử 4 túi
    • Oct 2007
    • 79

    #2
    Bác cho e hỏi cái socket để gắn màn hình N6100 mua ở đâu vậy??? Thk bác.
    Dao nao cung la dao, dao cao dai cung la dao.

    Comment

    • autochip
      Nhập môn đệ tử
      • Dec 2011
      • 2

      #3
      ra tiệm bán linh kiện điện thoại nói "bán cho cía jack màn hình Nokia 6100 là coa ngay !

      Comment

      • caddish12
        Đệ tử 1 túi
        • Apr 2010
        • 25

        #4
        socket 6100

        Bạn ra cửa hàng linh kiện điện thoại, mình mua ở đường 3/2 giao sư vạn hạnh.
        Nhớ nói là "socket màn hình nokia 6100" nếu không ngta k hiểu đâu ^^
        giá của nó là 5k, mà hôm trước thằng bạn mua thì nghe nói là 10k gòi :3
        màn hình giá từ 45-55k nhé
        Thanh Nguyen,
        International University, VNU

        Comment

        • shaolinkhoa
          Nhập môn đệ tử
          • Jul 2014
          • 1

          #5
          socket 6100

          mình tìm các tiệm linh kiện khắp đường 3/2 không còn ai còn bán cái đế socket 6100. caddish12 còn biết chỗ nào khác ko @@
          file schematic là orcad phiên bản mấy vậy bạn, mình ko mở dc do ver thấp hơn ( 10.5 @@ ). hình bạn up là đủ hết trong schematic rồi phải ko.
          mình cảm ơn

          Comment

          Working...