PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC Việt Nam - Chuyên nghiệp (http://www.picvietnam.com/forum/forumdisplay.php?f=35)
-   -   Help lập trình pic16f877a giao tiếp màn hình LCD nokia3310 (http://www.picvietnam.com/forum/showthread.php?t=29730)

sontvak42 24-07-2012 05:27 PM

Help lập trình pic16f877a giao tiếp màn hình LCD nokia3310
 
Hi.
Em đang nghịch cái màn hình nokia3310 kết nối với vi điều khiển để hiển thị một số hình ảnh mà em chưa biết cách xử lý như thế nào cả.
Em có sử dụng phần mềm fastLCD để truy xuất file ảnh ra mã hex nhưng từ mã đó em không biết thao tác như nào để vi điều khiển có thể nhận nó và xuất ra để hiển thị trên màn hình cả.
Mong các vị tiền bối chỉ giáo giúp em, em viết code trên CCS!
Em cám ơn nhiều!

hatuan296 24-07-2012 07:52 PM

Bạn tham khảo luồng này nhé , nhưng code viết bằng Picbasic pro . Ngôn ngữ này rất dễ hiểu và tiếp cận .

http://www.picvietnam.com/forum/showthread.php?t=11336

sontvak42 25-07-2012 04:41 PM

Trích:

Nguyên văn bởi hatuan296 (Post 76300)
Bạn tham khảo luồng này nhé , nhưng code viết bằng Picbasic pro . Ngôn ngữ này rất dễ hiểu và tiếp cận .

http://www.picvietnam.com/forum/showthread.php?t=11336

Em có thảm khảo bài viết đó rồi nhưng thực sự viết bằng ngôn ngữ đó em đọc khó hiểu quá, em chỉ chưa biết cách làm thế nào để LCD3310 có thể hiển thị được hình ảnh thôi. Mong mọi người giúp đỡ!

hatuan296 25-07-2012 10:30 PM

Trích:

Nguyên văn bởi sontvak42 (Post 76319)
Em có thảm khảo bài viết đó rồi nhưng thực sự viết bằng ngôn ngữ đó em đọc khó hiểu quá, em chỉ chưa biết cách làm thế nào để LCD3310 có thể hiển thị được hình ảnh thôi. Mong mọi người giúp đỡ!

Các bước để điều khiển lcd3310 này đều có trong code mình đã gửi lên , có lẽ bạn đọc không kĩ .

Đầu tiên của chương trình , ta phải set lcd , bằng các dòng sau đây :
Code:

LOW DC                              ' TRUYEN LENH LCD 3310
  LcdData= $21: GOSUB LCD_ByteOut    ' CODE %00100001 -> PD=0:CHIP ACTIVE ;  V=0:HORIZONTAL ; H=1:LENH LCD MO RONG
 
  LcdData= $C8: GOSUB LCD_ByteOut    ' CODE %11001000 SET LCD Vop (CONTRAST)
  LcdData= $06: GOSUB LCD_ByteOut    ' CODE %00000110 SET TEMP COEFFICENT = 2
  LcdData= $13: GOSUB LCD_ByteOut    ' CODE %00010011 LCD BIAS MODE
  LcdData= $20: GOSUB LCD_ByteOut    ' CODE %00100000 -> PD=0:CHIP ACTIVE ; V=0:HORIZONTAL ; H=0:LENH LCD CO BAN
  LcdData= $0c: GOSUB LCD_ByteOut    ' CODE %00001100 LCD IN NORMAL MODE - NEN TRANG CHU DEN .

chương trình con LCD_ByteOut là như thế này :
Ta truyền dữ liệu chứa trong biến LcdData ra màn hình .
2 chân DTA và CLK là 2 chân giao tiếp với lcd . Bạn chú ý lúc này chân DC = 0 tức là ta đang truyền lệnh nhé .

Code:

LCD_ByteOut:
SHIFTOUT DTA,CLK,1,[LcdData]
RETURN

Sau bước setup này rồi thì ta có thể truyền dữ liệu ra lcd . Cụ thể trong chương trình , bạn thấy mình gọi chương trình "XOA_GLCD" . Xoá lcd ở đây mình làm là truyền dữ liệu $00 cho từng cột - từng hàng của lcd .
chương trình con như sau : chân DC được kéo lên mức 1 tức là truyền dữ liệu .

Code:

XOA_GLCD :
  PosX=0:PosY=0:GOSUB LCD_GotoXY        ' DEN VI TRI HANG = 0 - COT BANG 0
  HIGH DC                                                ' TRUYEN DU LIEU
  FOR Chr=1 TO 252
  LcdData=0:GOSUB LCD_ByteOut
  LcdData=0:GOSUB LCD_ByteOut 
  NEXT Chr 
 RETURN

Trong chương trình con phía trên , bạn thấy có dòng gọi chương trình "LCD_GotoXY" . Đây là đoạn code để đến địa chỉ trên màn hình ta cần truyền dữ liệu , cụ thể ở đây địa chỉ được chứa trong 2 biến PosX , PosY . 2 biến này ta đang gán giá trị = 0 >> bắt đầu truyền dữ liệu tại địa chỉ 0:0 .

code cho chương trình LCD_GotoXY như sau :
DC = 0 là để truyền lệnh .
PosY được "or" với %01000000 , truyền lệnh ra lcd
PosX được "or" với %10000000 , truyền lệnh ra lcd
tại sao y cần "or" với %01000000 và x cần "or" %10000000 thì bạn xem lại datasheet của lcd nhé .

Code:

LCD_GotoXY:
  LOW DC
  LcdData=%01000000 | PosY :GOSUB LCD_ByteOut
  LcdData=%10000000 | PosX :GOSUB LCD_ByteOut
RETURN

Cũng tương tự như chương trình xoá lcd , nhưng mở rộng hơn về dữ liệu , ta có chương trình hiển thị khung màn hình như sau :

+Sau khi vẽ xong màn hình bằng chương trình fastLCD , dịch ra ta sẽ được 1 tập các giá trị .
+Ta dùng 1 vòng lặp for để lấy từng giá trị và cho hiển thị ra lcd . Câu lệnh LOOKUP2 I là để lấy giá trị theo vị trí I . Vì I là biến chạy từ 0 cho đến 504 cho nên ta sẽ lấy được tuần tự các giá trị có trong tập để hiển trị ra lcd .

Code:

MAIN_CLOCK_TEMP_SCREEN :
PosX=0:PosY=0:GOSUB LCD_GotoXY    ' DEN VI TRI HANG  - COT BANG
  FOR I = 0 TO 504                  ' VE MAN HINH       
    LOOKUP2 I,[$FF,_$0F,_$47,_$43,_$C1,_$41,_$41,_$01,_$C1,_$01,_$01,_$01,_$C1,_$01,_$A1,_$51,_
$51,_$51,_$A1,_$09,_$C5,_$03,_$01,_$01,_$C1,_$01,_$C1,_$21,_$11,_$11,_$11,_$21,_
$41,_$41,_$21,_$11,_$11,_$11,_$21,_$C1,_$01,_$C1,_$01,_$03,_$05,_$C9,_$01,_$89,_
$51,_$51,_$51,_$89,_$01,_$C1,_$01,_$01,_$01,_$C1,_$01,_$81,_$41,_$41,_$41,_$81,_
$01,_$01,_$01,_$01,_$01,_$01,_$39,_$6D,_$45,_$45,_$45,_$45,_$45,_$45,_$45,_$45,_
$7D,_$03,_$07,_$FF,_$FF,_$00,_$00,_$00,_$1F,_$80,_$80,_$80,_$8F,_$90,_$90,_$90,_
$8F,_$80,_$9F,_$82,_$82,_$82,_$9F,_$80,_$9F,_$81,_$82,_$04,_$1F,_$00,_$01,_$02,_
$04,_$08,_$10,_$20,_$40,_$40,_$60,_$70,_$38,_$1C,_$0E,_$07,_$00,_$1F,_$02,_$02,_
$02,_$1F,_$00,_$1F,_$02,_$02,_$02,_$1F,_$00,_$1F,_$01,_$02,_$04,_$1F,_$00,_$0F,_
$10,_$12,_$12,_$1E,_$00,_$F8,_$88,_$F8,_$00,_$F8,_$88,_$F8,_$00,_$FC,_$02,_$01,_
$01,_$01,_$02,_$FC,_$20,_$20,_$00,_$FF,_$FF,_$00,_$FC,_$02,_$01,_$F8,_$F8,_$18,_
$18,_$18,_$F8,_$F8,_$00,_$00,_$F8,_$F8,_$18,_$18,_$18,_$F8,_$F8,_$00,_$00,_$61,_
$62,_$02,_$02,_$FA,_$FA,_$1A,_$1A,_$1A,_$FA,_$FA,_$02,_$02,_$FA,_$FA,_$1A,_$1A,_
$1A,_$FA,_$FA,_$02,_$02,_$62,_$62,_$02,_$02,_$C2,_$C2,_$C2,_$C2,_$C2,_$02,_$02,_
$C2,_$C2,_$C2,_$C2,_$C2,_$02,_$04,_$F8,_$00,_$E4,_$24,_$E4,_$04,_$E4,_$24,_$E4,_
$04,_$FF,_$00,_$00,_$00,_$00,_$00,_$FF,_$80,_$80,_$00,_$FF,_$FF,_$00,_$1F,_$20,_
$40,_$9F,_$9F,_$98,_$98,_$98,_$9F,_$9F,_$80,_$80,_$9F,_$9F,_$98,_$98,_$98,_$9F,_
$9F,_$80,_$80,_$86,_$86,_$80,_$80,_$9F,_$9F,_$98,_$98,_$98,_$9F,_$9F,_$80,_$80,_
$9F,_$9F,_$98,_$98,_$98,_$9F,_$9F,_$80,_$80,_$86,_$86,_$80,_$80,_$9F,_$9F,_$98,_
$9F,_$9F,_$80,_$80,_$9F,_$9F,_$98,_$9F,_$9F,_$80,_$40,_$3F,_$00,_$13,_$12,_$13,_
$10,_$13,_$12,_$13,_$10,_$FF,_$00,_$00,_$00,_$00,_$00,_$FF,_$00,_$00,_$00,_$FF,_
$FF,_$00,_$00,_$00,_$FF,_$00,_$00,_$00,_$FC,_$FC,_$0C,_$0C,_$0C,_$0C,_$FC,_$FC,_
$00,_$00,_$FC,_$FC,_$0C,_$0C,_$0C,_$0C,_$FC,_$FC,_$00,_$00,_$00,_$00,_$00,_$00,_
$00,_$FC,_$FC,_$0C,_$0C,_$0C,_$0C,_$FC,_$FC,_$00,_$00,_$00,_$30,_$48,_$48,_$30,_
$00,_$00,_$F0,_$F8,_$1C,_$0C,_$0C,_$0C,_$1C,_$18,_$00,_$00,_$00,_$FF,_$FF,_$00,_
$00,_$5F,_$51,_$5F,_$40,_$5F,_$51,_$5F,_$C0,_$7F,_$80,_$80,_$80,_$80,_$80,_$7F,_
$82,_$02,_$00,_$FF,_$FF,_$F0,_$E0,_$C0,_$9F,_$A0,_$C0,_$80,_$9F,_$9F,_$98,_$98,_
$98,_$98,_$9F,_$9F,_$80,_$80,_$9F,_$9F,_$98,_$98,_$98,_$98,_$9F,_$9F,_$80,_$80,_
$9C,_$9C,_$9C,_$80,_$80,_$9F,_$9F,_$98,_$98,_$98,_$98,_$9F,_$9F,_$80,_$80,_$80,_
$80,_$80,_$80,_$80,_$80,_$80,_$87,_$8F,_$9C,_$98,_$98,_$98,_$9C,_$8C,_$80,_$C0,_
$E0,_$BF,_$9F,_$80,_$80,_$80,_$80,_$80,_$80,_$80,_$80,_$8F,_$90,_$A7,_$AF,_$AF,_
$AF,_$AF,_$AF,_$A7,_$D0,_$EF,_$F0,_$FF],LCDDATA :
    HIGH DC : GOSUB LCD_ByteOut   
  NEXT I     
  RETURN

Những chương trình con trên đều có trong file mình gửi , bạn xem kĩ lại có gì không hiểu thì mình giải thích thêm nhé .

sontvak42 26-07-2012 12:25 PM

Các phần thiết lập LCD và hiển thị ký tự hoặc giá trị lên LCD thì em đã làm được rồi, chỉ có phần lúc em tạo file ảnh từ phần mềm fastLCD xong em ra được mảng mã hex đó rồi nhưng khi em sử dụng vòng lặp for cho nó chạy nhưng nó lại báo lỗi, vì em viết trên CCS nên cấu trúc phần ctrinh trên này các lệnh em ko hiểu cho lắm. Anh đã từng viết qua chương trình CCS chưa,nếu viết rồi có thể giúp em phần hiển thị khung màn hình ở đoạn cuối được không anh.
Em cám ơn anh nhiều!

hatuan296 26-07-2012 02:51 PM

Trích:

Nguyên văn bởi sontvak42 (Post 76329)
Các phần thiết lập LCD và hiển thị ký tự hoặc giá trị lên LCD thì em đã làm được rồi, chỉ có phần lúc em tạo file ảnh từ phần mềm fastLCD xong em ra được mảng mã hex đó rồi nhưng khi em sử dụng vòng lặp for cho nó chạy nhưng nó lại báo lỗi, vì em viết trên CCS nên cấu trúc phần ctrinh trên này các lệnh em ko hiểu cho lắm. Anh đã từng viết qua chương trình CCS chưa,nếu viết rồi có thể giúp em phần hiển thị khung màn hình ở đoạn cuối được không anh.
Em cám ơn anh nhiều!

Tiếc là mình không dùng CCS bạn ơi . Bạn thử search trong forum hoặc google xem nhé .

tdm 27-07-2012 12:20 PM

1 Attachment(s)
Trích:

Nguyên văn bởi sontvak42 (Post 76329)
Các phần thiết lập LCD và hiển thị ký tự hoặc giá trị lên LCD thì em đã làm được rồi, chỉ có phần lúc em tạo file ảnh từ phần mềm fastLCD xong em ra được mảng mã hex đó rồi nhưng khi em sử dụng vòng lặp for cho nó chạy nhưng nó lại báo lỗi, vì em viết trên CCS nên cấu trúc phần ctrinh trên này các lệnh em ko hiểu cho lắm. Anh đã từng viết qua chương trình CCS chưa,nếu viết rồi có thể giúp em phần hiển thị khung màn hình ở đoạn cuối được không anh.
Em cám ơn anh nhiều!

code tham khảo:
Code:

#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
//#use rs232(baud=9600,parity=n,xmit=PIN_C6,rcv=PIN_C7)
// ------------------------------------------------------ 
// Picture name: mikro_bmp           
// GLCD Model: Nokia3310 Like           
// ------------------------------------------------------ 

unsigned char const mikro_bmp[504] = {
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255,  0, 255, 255, 255,  7,  71,  99,  99,  99,
 99,  99,  99,  99, 103,  7, 143, 255, 255,  63,  63,  31,
 15,  15,  7,  7,  7,  3,  3,  3,  3,  3,  3,  3,
  3,  3,  7,  7,  7,  15,  15,  31,  31,  63, 255, 255,
255, 255, 255, 255, 255,  0, 255, 255,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255,  0, 255, 255, 255,  14,  12,  12,  28,  60,
 60,  60,  60,  60, 252, 254, 255,  3,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0, 248, 254, 254, 254, 252,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
 15, 255, 255, 255, 255,  0, 255, 255,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255,  0, 255, 255, 255,  34, 102,  6,  6,  30,
 14,  6,  6,  34, 255, 255, 255,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  1,  3,  3,  3,  3,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255, 255, 255,  0, 255, 255,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255,  0, 255, 255, 255, 196, 254, 222, 198, 198,
198, 198, 198, 198, 255, 255, 255,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0, 254, 255, 255, 255, 255,
255,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
  7, 255, 255, 255, 255,  0, 255, 255,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255,  0, 255, 255, 255,  16,  24,  24,  24,  24,
 24,  24,  24,  24,  27,  63, 255, 224, 128,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  15,  63, 127,  63,  63,
 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 128,
240, 255, 255, 255, 255,  0, 255, 255,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0, 255, 255,  0, 255, 255, 255, 224, 227, 227, 227, 227,
227, 227, 227, 227, 227, 227, 227, 227, 231, 238, 252, 248,
248, 240, 240, 224, 224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 240, 240, 248, 252, 254, 255, 255,
255, 255, 255, 255, 127, 128, 255, 255,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
};

#include <lcd_3310.c>
void main()
{
 nokia_init();
 nokia_gotoxy(0,0); //cot,hang
 int16 bien;
 for(bien=0;bien<=504;bien++)
 {
 nokia_write_data(mikro_bmp[bien]);}
// printf(nokia_printchar,"test???");
 while(1)
 {};
}

<lcd_3310.c>
Code:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /*

        Graphic LCD Nokia 3310 (LPH7779) routines v3
        CCS compiler


        by Michel Bavin 2004 --- bavin@skynet.be --- http://users.skynet.be/bk317494/ ---
        august 29, 2004

        */

        // ex:
        //
        // ...
        // nokia_init();
        // ...
        // nokia_gotoxy(0,0);
        // printf(nokia_printchar,"test???");
        // ...
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        #define nok_sclk  PIN_D4
        #define nok_sda  PIN_D3
        #define nok_dc    PIN_D2
        #define nok_cs    PIN_D1
        #define nok_res  PIN_D0

        char char_row,charsel,charpos,chardata;      // for nokia_3310 lcd
        int16 ddram;
        char plot_value;
        int32 plot_value32;
        int32 plot_umsb,plot_lmsb,plot_ulsb,plot_llsb;

        BYTE const TABLE5[240]=            {0x00,0x00,0x00,0x00,0x00,  // 20 space          ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
          0x00,0x00,0x5f,0x00,0x00,  // 21 !
          0x00,0x07,0x00,0x07,0x00,  // 22 "
          0x14,0x7f,0x14,0x7f,0x14,  // 23 #
          0x24,0x2a,0x7f,0x2a,0x12,  // 24 $
          0x23,0x13,0x08,0x64,0x62,  // 25 %
          0x36,0x49,0x55,0x22,0x50,  // 26 &
          0x00,0x05,0x03,0x00,0x00,  // 27 '
          0x00,0x1c,0x22,0x41,0x00,  // 28 (
          0x00,0x41,0x22,0x1c,0x00,  // 29 )
          0x14,0x08,0x3e,0x08,0x14,  // 2a *
          0x08,0x08,0x3e,0x08,0x08,  // 2b +
          0x00,0x50,0x30,0x00,0x00,  // 2c ,
          0x08,0x08,0x08,0x08,0x08,  // 2d -
          0x00,0x60,0x60,0x00,0x00,  // 2e .
          0x20,0x10,0x08,0x04,0x02,  // 2f /
          0x3e,0x51,0x49,0x45,0x3e,  // 30 0
          0x00,0x42,0x7f,0x40,0x00,  // 31 1
          0x42,0x61,0x51,0x49,0x46,  // 32 2
          0x21,0x41,0x45,0x4b,0x31,  // 33 3
          0x18,0x14,0x12,0x7f,0x10,  // 34 4
          0x27,0x45,0x45,0x45,0x39,  // 35 5
          0x3c,0x4a,0x49,0x49,0x30,  // 36 6
          0x01,0x71,0x09,0x05,0x03,  // 37 7
          0x36,0x49,0x49,0x49,0x36,  // 38 8
          0x06,0x49,0x49,0x29,0x1e,  // 39 9
          0x00,0x36,0x36,0x00,0x00,  // 3a :
          0x00,0x56,0x36,0x00,0x00,  // 3b ;
          0x08,0x14,0x22,0x41,0x00,  // 3c <
          0x14,0x14,0x14,0x14,0x14,  // 3d =
          0x00,0x41,0x22,0x14,0x08,  // 3e >
          0x02,0x01,0x51,0x09,0x06,  // 3f ?
          0x32,0x49,0x79,0x41,0x3e,  // 40 @
          0x7e,0x11,0x11,0x11,0x7e,  // 41 A
          0x7f,0x49,0x49,0x49,0x36,  // 42 B
          0x3e,0x41,0x41,0x41,0x22,  // 43 C
          0x7f,0x41,0x41,0x22,0x1c,  // 44 D
          0x7f,0x49,0x49,0x49,0x41,  // 45 E
          0x7f,0x09,0x09,0x09,0x01,  // 46 F
          0x3e,0x41,0x49,0x49,0x7a,  // 47 G
          0x7f,0x08,0x08,0x08,0x7f,  // 48 H
          0x00,0x41,0x7f,0x41,0x00,  // 49 I
          0x20,0x40,0x41,0x3f,0x01,  // 4a J
          0x7f,0x08,0x14,0x22,0x41,  // 4b K
          0x7f,0x40,0x40,0x40,0x40,  // 4c L
          0x7f,0x02,0x0c,0x02,0x7f,  // 4d M
          0x7f,0x04,0x08,0x10,0x7f,  // 4e N
          0x3e,0x41,0x41,0x41,0x3e    // 4f O
        };   


        BYTE const TABLE6[240]=            {0x7f,0x09,0x09,0x09,0x06,  // 50 P
          0x3e,0x41,0x51,0x21,0x5e,  // 51 Q
          0x7f,0x09,0x19,0x29,0x46,  // 52 R
          0x46,0x49,0x49,0x49,0x31,  // 53 S
          0x01,0x01,0x7f,0x01,0x01,  // 54 T
          0x3f,0x40,0x40,0x40,0x3f,  // 55 U
          0x1f,0x20,0x40,0x20,0x1f,  // 56 V
          0x3f,0x40,0x38,0x40,0x3f,  // 57 W
          0x63,0x14,0x08,0x14,0x63,  // 58 X
          0x07,0x08,0x70,0x08,0x07,  // 59 Y
          0x61,0x51,0x49,0x45,0x43,  // 5a Z
          0x00,0x7f,0x41,0x41,0x00,  // 5b [
          0x02,0x04,0x08,0x10,0x20,  // 5c
          0x00,0x41,0x41,0x7f,0x00,  // 5d
          0x04,0x02,0x01,0x02,0x04,  // 5e
          0x40,0x40,0x40,0x40,0x40,  // 5f
          0x00,0x01,0x02,0x04,0x00,  // 60
          0x20,0x54,0x54,0x54,0x78,  // 61 a
          0x7f,0x48,0x44,0x44,0x38,  // 62 b
          0x38,0x44,0x44,0x44,0x20,  // 63 c
          0x38,0x44,0x44,0x48,0x7f,  // 64 d
          0x38,0x54,0x54,0x54,0x18,  // 65 e
          0x08,0x7e,0x09,0x01,0x02,  // 66 f
          0x0c,0x52,0x52,0x52,0x3e,  // 67 g
          0x7f,0x08,0x04,0x04,0x78,  // 68 h
          0x00,0x44,0x7d,0x40,0x00,  // 69 i
          0x20,0x40,0x44,0x3d,0x00,  // 6a j
          0x7f,0x10,0x28,0x44,0x00,  // 6b k
          0x00,0x41,0x7f,0x40,0x00,  // 6c l
          0x7c,0x04,0x18,0x04,0x78,  // 6d m
          0x7c,0x08,0x04,0x04,0x78,  // 6e n
          0x38,0x44,0x44,0x44,0x38,  // 6f o
          0x7c,0x14,0x14,0x14,0x08,  // 70 p
          0x08,0x14,0x14,0x18,0x7c,  // 71 q
          0x7c,0x08,0x04,0x04,0x08,  // 72 r
          0x48,0x54,0x54,0x54,0x20,  // 73 s
          0x04,0x3f,0x44,0x40,0x20,  // 74 t
          0x3c,0x40,0x40,0x20,0x7c,  // 75 u
          0x1c,0x20,0x40,0x20,0x1c,  // 76 v
          0x3c,0x40,0x30,0x40,0x3c,  // 77 w
          0x44,0x28,0x10,0x28,0x44,  // 78 x
          0x0c,0x50,0x50,0x50,0x3c,  // 79 y
          0x44,0x64,0x54,0x4c,0x44,  // 7a z
          0x00,0x08,0x36,0x41,0x00,  // 7b
          0x00,0x00,0x7f,0x00,0x00,  // 7c
          0x00,0x41,0x36,0x08,0x00,  // 7d
          0x10,0x08,0x08,0x10,0x08,  // 7e
          0x78,0x46,0x41,0x46,0x78    // 7f
        }; 


        //

        void    nokia_init(void);
        void    nokia_write_command(char bytefornokia_command);
        void    nokia_write_data(char bytefornokia_data);
        void    nokia_write_dorc(char bytefornokia);
        void    nokia_gotoxy(int8 xnokia, int8 ynokia);
        void    nokia_erase_y(int8 ynokia);
        void    nokia_erase_x(int8 xnokia);
        void    nokia_printchar(int8 cvar);
        void    nokia_clean_ddram(void);
        void    table_to_nokialcd(void);
        void    nokia_plot(int8 xnokia,int8 plot_value8);
        void    nokia_write_data_inv(char bytefornokia_data_inv);
        void    nokia_clear_screen(void);
        void    nokia_clear_xy(int8 xnokia, int8 ynokia);
        void    nokia_print_uparrow(void);
        void    nokia_print_downarrow(void);
        void    nokia_print_leftarrow(void);
        void    nokia_print_rightarrow(void);
        void    nokia_print_degree(void);
        void    nokia_print_lowbatdegree(void);
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        void nokia_init(void)
        {
          output_high(nok_dc);            // bytes are stored in the display data ram, address counter, incremented automatically
          output_high(nok_cs);            // chip disabled

          output_low(nok_res);            // reset chip during 250ms
          delay_ms(10);        // works with less.....
          output_high(nok_res);

          nokia_write_command(0x21);  // set extins extended instruction set
          nokia_write_command(0xc2);  // Vop  v1: 0xc8 (for 3V)// v2: 0xa0 (for 3V) // v3: 0xc2 (2v6-5v)  ********************************************************************************************************************
          nokia_write_command(0x13);  // bias
          nokia_write_command(0x20);  // horizontal mode from left to right, X axe are incremented automatically , 0x22 for vertical addressing ,back on normal instruction set too
          nokia_write_command(0x09);  // all on

          nokia_clean_ddram();      // reset DDRAM, otherwise the lcd is blurred with random pixels

          nokia_write_command(0x08);  // mod control blank change (all off)

          nokia_write_command(0x0c);  // mod control normal change

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        void nokia_clean_ddram(void)
        {
          nokia_gotoxy(0,0);        // 84*6=504      clear LCD
          for (ddram=504;ddram>0;ddram--){nokia_write_data(0x00);}

        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        void nokia_write_command(char bytefornokia_command)
        {

          output_low(nok_dc);  // byte is a command it is read with the eight SCLK pulse
          output_low(nok_cs);  // chip enabled
          nokia_write_dorc(bytefornokia_command);
          output_high(nok_cs);  // chip disabled

        }
        /////////////////////////////////////////////////////////////////////////////////
        void nokia_write_data(char bytefornokia_data)
        {

          output_high(nok_dc);
          output_low(nok_cs);  // chip enabled
          nokia_write_dorc(bytefornokia_data);
          output_high(nok_cs);  // chip disabled

        }
        //////////////////////////////////////////////////////////////////////////////////
        void nokia_write_dorc(char bytefornokia)        // serial write data or command subroutine
        {
          char caa;
          for (caa=8;caa>0;caa--) {
            output_low(nok_sclk);
            // delay_us(2);
            if ((bytefornokia&0x80)==0){output_low(nok_sda);}
            else {output_high(nok_sda);}
            output_high(nok_sclk);
            bytefornokia=bytefornokia<<1;
          }
        }
        //////////////////////////////////////////////////////////////////////////////////
        void nokia_gotoxy(int8 xnokia, int8 ynokia)      // Nokia LCD 3310 Position cursor
        {
          nokia_write_command(0x40|(ynokia&0x07));  // Y axe initialisation: 0100 0yyy

          nokia_write_command(0x80|(xnokia&0x7f));  // X axe initialisation: 1xxx xxxx
        }
        //////////////////////////////////////////////////////////////////////////////////
        void nokia_erase_y(int8 ynokia)
        {
          nokia_gotoxy(0,ynokia);
          printf(nokia_printchar,"              ");
        }
        //////////////////////////////////////////////////////////////////////////////////
        void nokia_erase_x(int8 xnokia)
        {
          char column;

          for (column=0;column!=6;column++){
            nokia_gotoxy(xnokia,column);
            nokia_write_data(0x00);
            nokia_write_data(0x00);
            nokia_write_data(0x00);
            nokia_write_data(0x00);
            nokia_write_data(0x00);
            nokia_write_data(0x00);

          }
        }
        //////////////////////////////////////////////////////////////////////////////////

        void nokia_printchar(int8 cvar)              // Write 1 character to LCD
        {
          charsel=cvar;
          table_to_nokialcd();
        }
        //////////////////////////////////////////////////////////////////////////////////
        void table_to_nokialcd(void)  // extract ascii from tables & write to LCD
        {
          if (charsel<0x20)return;
          if (charsel>0x7f)return;

          for (char_row=0;char_row<5;char_row++) {      // 5 bytes

            if (charsel<0x50){charpos=(((charsel&0xff)-0x20)*5);chardata=TABLE5[(charpos+char_row)];}            // use TABLE5
            else if (charsel>0x4f){charpos=(((charsel&0xff)-0x50)*5);chardata=TABLE6[(charpos+char_row)];}            // use TABLE6


            nokia_write_data(chardata);      // send data to nokia
          }

          nokia_write_data(0x00);      //    1 byte (always blank)

        }
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        void nokia_plot(int8 xnokia,int8 plot_value8)
        {
          char i;

          plot_value32=0;
          // plot_value32|=1;        // unremark this if you want dotgraph instead of bargraph

          for (i=0;i!=plot_value8;i++){

            plot_value32|=1;        // remark this if you want dotgraph instead of bargraph
            plot_value32<<=1;
          }

          plot_value32|=2;            // bottom line is always filled

          plot_llsb=(plot_value32&0xff);
          plot_ulsb=((plot_value32>>8)&0xff);
          plot_lmsb=((plot_value32>>16)&0xff);
          plot_umsb=((plot_value32>>24)&0xff);

          nokia_gotoxy(xnokia,1);
          nokia_write_data_inv(plot_umsb);

          nokia_gotoxy(xnokia,2);
          nokia_write_data_inv(plot_lmsb);

          nokia_gotoxy(xnokia,3);
          nokia_write_data_inv(plot_ulsb);

          nokia_gotoxy(xnokia,4);
          nokia_write_data_inv(plot_llsb);

        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


        void nokia_write_data_inv(char bytefornokia_data_inv)
        {
          char caa;

          output_high(nok_dc);
          output_low(nok_cs);  // chip enabled

          for (caa=8;caa>0;caa--) {
            output_low(nok_sclk);
            delay_us(2);
            if ((bytefornokia_data_inv&0x01)==0){output_low(nok_sda);}
            else {output_high(nok_sda);}
            output_high(nok_sclk);
            bytefornokia_data_inv=bytefornokia_data_inv>>1;
          }

          output_high(nok_cs);  // chip disabled
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        void nokia_clear_screen(void)
        {
          nokia_erase_y(0);
          nokia_erase_y(1);
          nokia_erase_y(2);
          nokia_erase_y(3);
          nokia_erase_y(4);
          nokia_erase_y(5);

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


        void nokia_clear_xy(int8 xnokia, int8 ynokia)
        {

          nokia_gotoxy(xnokia,ynokia);
          nokia_printchar(" ");


        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        void nokia_print_uparrow(void)
        {
          nokia_write_data(0x04);
          nokia_write_data(0x02);
          nokia_write_data(0x7f);
          nokia_write_data(0x02);
          nokia_write_data(0x04);
          nokia_write_data(0x00);
        }
        //
        void nokia_print_downarrow(void)
        {
          nokia_write_data(0x10);
          nokia_write_data(0x20);
          nokia_write_data(0x7f);
          nokia_write_data(0x20);
          nokia_write_data(0x10);
          nokia_write_data(0x00);
        }
        //
        void nokia_print_leftarrow(void)
        {
          nokia_write_data(0x08);
          nokia_write_data(0x1c);
          nokia_write_data(0x2a);
          nokia_write_data(0x08);
          nokia_write_data(0x08);
          nokia_write_data(0xf8);
        }
        //
        void nokia_print_rightarrow(void)
        {
          nokia_write_data(0x08);
          nokia_write_data(0x08);
          nokia_write_data(0x2a);
          nokia_write_data(0x1c);
          nokia_write_data(0x08);
          nokia_write_data(0x00);
        }
        //
        void nokia_print_degree(void)
        {
          nokia_write_data(0x00);
          nokia_write_data(0x06);
          nokia_write_data(0x09);
          nokia_write_data(0x09);
          nokia_write_data(0x06);
          nokia_write_data(0x00);

          // nokia_printchar("  ");
        }
        //
        void nokia_print_lowbatdegree(void)
        {
          nokia_write_data(0x00);
          nokia_write_data(0x06);
          nokia_write_data(0x0f);
          nokia_write_data(0x0f);
          nokia_write_data(0x06);
          nokia_write_data(0x00);

          // nokia_printchar("  ");
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


sontvak42 01-08-2012 10:05 AM

Em cám ơn các anh nhiều nhé!


Múi giờ GMT. Hiện tại là 06:19 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam