2016年6月28日 星期二

DIY - PIC24:PIC24FJ64GA008 ILI9341 LCD 液晶屏測試程式(二十三)

DIY - PIC24PIC24FJ64GA008 ILI9341 LCD 液晶屏測試程式二十三):

測試 ILI9341 LCD 液晶屏主要是測試 LCD 液晶屏的顏色、圖案和文字。需要顯示不同的東西,祇需要更改 LCD 屏內每個點Dot Pixel的顏色,因為點是可以構成不同的圖案和文字,所以控制點的顏色便可以做出不同的圖案顯示。顯示顏色點是將顏色數據直接寫入每個點Dot Pixel內,LCD 便會顯示出每點的顏色,不同顏色的點便會變成圖案或文字。

PIC24FJ64GA008 ILI9341 LCD 液晶屏測試程式
PIC24FJ64GA008 ILI9341 LCD 液晶屏測試程式
Microchip PIC24FJ64GA008 ILI9341 LCD 液晶屏 ClearDevice 程式:
void ClearDevice(void){
DWORD     counter;

    CS_LAT_BIT = 0;
   for(counter=0; counter<(DWORD)(GetMaxX()+1)*(GetMaxY()+1); counter++){
        WriteData(_color.v[1],_color.v[0]);
    }
    CS_LAT_BIT = 1;
    MoveTo(0,0);
}

Microchip PIC24FJ64GA008 ILI9341 LCD 液晶屏 LCD_ShowString 程式
void LCD_ShowString(short x, short y, short width, short height, char size, char *p,char mode)
{        
 static short xx, yy, zz;  // Keep Memory

if (mode == 0) { zz=0;}else
if (mode == 1) { zz=1;}else
if (mode == 2) { x=xx; y=yy;zz=1;}else  // Mode 1 = Follow Continue Mode
if (mode == 3) { zz=1;}

    while((*p<='~')&&(*p>=' '))
    {     
        if(x>(SCREEN_HOR_SIZE-1)){x=0;y+=size;}
                     if(y>=(SCREEN_VER_SIZE-1)) return;
        LCD_ShowChar(x,y,width,height,size,*p,mode);
            x+=size/2;
            p++;
    } 

if (zz==1){ xx=x; yy=y;}  // Mode 1 = Continue Mode

}


Microchip PIC24FJ64GA008 ILI9341 LCD 液晶屏 LCD_ShowChar 程式
void LCD_ShowChar(short x,short y,short width, short height,char size,unsigned char num,char mode)
{ 
    char temp;
    unsigned char pos,t;
    short y0=y;

    unsigned char csize=(size/8+((size%8) ?1:0)) * (size/2);

           num=num-32;

                     for(pos=0;pos
                     {
            if(size==12)temp=asc2_1206[num][pos];
                                else
            if(size==16)temp=asc2_1608[num][pos];
            else
            temp=asc2_2412[num][pos];

            for(t=0;t< width ;t++)
                         {                 
                             if(temp&0x80)Glcd_Pixel(x,y,BLACK);
                                           else Glcd_Pixel(x,y,WHITE);        
                                           temp<<=1;
                y++;
              if ((y-y0)==size)
                 { y=y0;
                   x++;
                  }
                         }
                     }        
}


2016年 6月 28日 天氣報告
氣溫:27.9@ 21:20
相對濕度:百分之 92%
天氣:微雨

2016年6月27日 星期一

DIY - PIC24:PIC24FJ64GA008 ILI9341 和 LCD1602 顯示(二十二)

DIY - PIC24PIC24FJ64GA008 ILI9341 LCD1602 顯示(二十二): 

由於在 2.8 TFT LCD 液晶屏上使用了很多 I/O 接口(8 條數據 + 6條控制 = 14 I/O),ILI9341 LCD 需要使用到 PMD0 ~ PMD7 RE0 ~ RE7)的 I/O 接口,原來的 LCD1602 便要更改 I/O 接口,更改後,LCD1602 可以作為偵測(Debug)之用。

PIC24FJ64GA008 ILI9341 LCD1602 LCD 顯示
原來的 LCD1602 4條資料引腳 D4D7 MSBMost Significant Bit)直接接到 MCU PortE (RE4 D4RE5 D5RE62 D6RE7 D7)LCD LSBLeast Significant Bit)的 4條資料引腳 D0D3 會空接,而控 LCD 制引腳接到 MCU PortE (RE0 - RSRE1 - RWRE2 - E)

LCD1602 會改成 4條資料引腳 D4D7 MSBMost Significant Bit)直接接到 MCU PortG (RG0 D4RG1 D5RG2 D6RG3 D7)LCD LSBLeast Significant Bit)的 4條資料引腳 D0D3 會空接,而控 LCD 制引腳接到 MCU PortD (RD0 - RSRD1 - RWRD2 - E)

Microchip PIC24FJ64GA008 LCD1602 xlcd.h 文件:
#define LOWER       // Lower 4bit Mode D0-D3 Connected to LCD D4-D7

     #define  DATA_PORT               LATG            // Port for LCD data
     #define  TRIS_DATA_PORT    TRISG

     #define  RS_PIN             LATDbits.LATD0    // LCD RS signal
     #define  RW_PIN           LATDbits.LATD1    // LCD R/W signal
     #define  E_PIN               LATDbits.LATD2    // LCD E signal

     #define  TRIS_RS               TRISDbits.TRISD0
     #define  TRIS_RW             TRISDbits.TRISD1
     #define  TRIS_E                 TRISDbits.TRISD2

2016年 6月 27日 天氣報告
氣溫:31.1@ 20:30
相對濕度:百分之 78%
天氣:微雨

2016年6月26日 星期日

DIY - PIC24:PIC24FJ64GA008 ILI9341 LCD 讀寫方式(二十一)

DIY - PIC24PIC24FJ64GA008 ILI9341 LCD 讀寫方式(二十一): 

LCD 液晶屏的驅動蕊片的讀寫方式各異,所以要特別注意,否則便無法將指令和資料讀寫到驅動蕊片。筆者在 ILITEK ILI9341 選擇了 8080-II 系列並行雙向接口(8080- Series Parallel Interface)的數據連接,所以也是要根據 ILI9341 的讀寫方式, 這接口方式是由 IM0 ~ IM3 的引腳作設定,但 LCD 的模塊已經簡化了設定,可以選擇 8080-II 系列並行雙向接口 8-bit 16-bit 數據通訊。
ILI9341 LCD 的數據通訊選擇
ILI9341 寫入時間序列(Write Cycle Sequence):
寫入時間序列是由 WRX 信號從高後低開始,當信號由低昇上高位時(Rising Edge)便會作寫入操作,在這時 MCU 處理器已提供穩定的指令 / 數據信息,在 WRX 的上升沿(Rising EdgeLCD 顯示模塊會捕捉信息。當 D / CX 信號是低電平(Low),信息是指令(Command), LCD 顯示模塊接收指令後D / CX 信號是高電平(High),MCU 會發出信息便是數據(Data),LCD 顯示模塊便會繼續接收數據。

ILI9341 寫入時間序列(Write Cycle Sequence
詳盡的 ILI9341 寫入時間序列(Write Cycle Sequence
Microchip PIC24FJ64GA008 2.8TFT LCD 液晶屏寫入時間序列(Write Cycle Sequence):
unsigned char ILI9341_RD_DATA()
{
unsigned char data;

        // Read Data Operation Ready RS=1
        RS_LAT_BIT = 1;         // Select Data On = 1
        CS_LAT_BIT = 0;         // Chip Set On = 0
        DAT_TRIS_BIT |= 0x00FF; // Data D0~D7 = Input = 1

        // Read Data = data
        RD_LAT_BIT = 0;         // Read Data from LCD
        Nop();Nop();            // Delay
        data = DAT_PORT_BIT;    // data = Data
        RD_LAT_BIT = 1;         // Read Data off = 1
       
return data;                    // Return data
}

ILI9341 讀入時間序列(Read Cycle Sequence):
讀入時間序列是由 RDX 信號從 MCU 從高後低開始,當信號由低昇上高時(Rising Edge)便會作讀入操作。首先當 D / CX 信號是低電平(Low)和 WRX 是低電平(Low),MCU 會發出信息是指令Command),等 LCD 顯示模塊接收指令後D / CX 信號是高電平(High)和 WRX 是高電平(High),但 RDX 會變成低電平(Low),LCD 顯示模塊會發出信息是數據(Data),MCU 便會讀入數據處理。

ILI9341 讀入時間序列(Read Cycle Sequence
詳盡的 ILI9341 讀入時間序列(Read Cycle Sequence
Microchip PIC24FJ64GA008 2.8 TFT LCD 液晶屏讀入時間序列(Read Cycle Sequence):
void ILI9341_WR_DATA(unsigned char data)
{
       
        // Write Data Operation Ready RS=1
        RS_LAT_BIT = 1;     // Select Data On = 1
        CS_LAT_BIT = 0;     // Chip Set On = 0
        RD_LAT_BIT = 1;     // Read Device Off = 1
        DAT_TRIS_BIT &= 0xFF00; // Data D0~D7 = Output = 0       
      
        // Write Data = data
        DAT_LAT_BIT = data; // Data D0~D7 = data
        WR_LAT_BIT = 0;     // Write data to LCD On = 0

        // Finished Write Data 8bits
        WR_LAT_BIT = 1;     // Write Command Off = 1
        CS_LAT_BIT = 1;     // Chip Selet Off = 1
}

20166 26日 天氣報告
氣溫:30.9@ 19:30
相對濕度:百分之 75%
天氣:天色大致良好
※ 酷熱天氣警告現正生效 

2016年6月19日 星期日

DIY - PIC24:PIC24FJ64GA008 ILI9341 LCD 液晶屏初始化(二十)

DIY - PIC24PIC24FJ64GA008 ILI9341 LCD 液晶屏初始化(二十):

LCD 液晶屏的驅動蕊片都需要初始化(Initialization),ILI9341 驅動蕊片都不會例外,初始化(Initization)主要是作驅動蕊片內部參數設定 / 配置(Parameter Setting),其實 LCD 液晶屏驅動蕊片的內部是非常複雜,祇是廠家已經簡化驅動蕊片的設定,看看 ILI9341 的規格書(Specification V1.05 版本)有 239頁,便知道驅動蕊片並不簡單!

Microchip PIC24 LCD 主程序初始化流程
Microchip PIC24FJ64GA008 2.8TFT LCD 液晶屏初始化(Initialization
// Initialize ILI9341 LCD Device
        ILI9341_WR_REG(0xCF);                  //Power Control B
                        ILI9341_WR_DATA(0x00); //Always 0x
                        ILI9341_WR_DATA(0xDB); //PCEQ Off
                        ILI9341_WR_DATA(0X30); //ESD protection

        ILI9341_WR_REG(0xB1);                  //Frame rate control
                        ILI9341_WR_DATA(0x00);
                        ILI9341_WR_DATA(0x18);

        ILI9341_WR_REG(0xED);                  //PowerOn sequence control
                        ILI9341_WR_DATA(0x64); //Soft start
                        ILI9341_WR_DATA(0x03); //Power on sequence
                        ILI9341_WR_DATA(0X12); //Power on sequence
                        ILI9341_WR_DATA(0x81); //DDVDH enhance on

        ILI9341_WR_REG(0xE8);                  //Driver timing control A
                        ILI9341_WR_DATA(0x85); //nonoverlap
                        ILI9341_WR_DATA(0x00); //EQ timing
                        ILI9341_WR_DATA(0x70); //Precharge timing

        ILI9341_WR_REG(0xCB);                  //Power Control A
                        ILI9341_WR_DATA(0x39); //Always 0x39
                        ILI9341_WR_DATA(0x2C); //Always 0x2C
                        ILI9341_WR_DATA(0x00); //Always 0x
                        ILI9341_WR_DATA(0x34); //Vcore = 1.6V
                        ILI9341_WR_DATA(0x02); //DDVDH = 5.6V
        ILI9341_WR_REG(0xF7);                  //Pump ratio control
                        ILI9341_WR_DATA(0x20); //DDVDH=2xVCI

        ILI9341_WR_REG(0xEA);                  //Driver timing control B
                        ILI9341_WR_DATA(0x00); //Gate driver timing
                        ILI9341_WR_DATA(0x00); //Always 0x

        ILI9341_WR_REG(0xC0);                  //Power control 1
                        ILI9341_WR_DATA(0x22); //VRH

        ILI9341_WR_REG(0xC1);                  //Power control 2
                        ILI9341_WR_DATA(0x12); //SAP[2:0];BT[3:0]

        ILI9341_WR_REG(0xC5);                  //VCOM control 1
                        ILI9341_WR_DATA(0x5C);
                        ILI9341_WR_DATA(0x4C);

        ILI9341_WR_REG(0xC7);                  //VCOM control 2
                        ILI9341_WR_DATA(0x8F);

        ILI9341_WR_REG(0x36);                  //Memory access control = BGR
                        ILI9341_WR_DATA(0x48);

        ILI9341_WR_REG(0x3A);                  //Pixel format = 16 bit per pixel
                       ILI9341_WR_DATA(0x55);

        ILI9341_WR_REG(0xF2);                  //3G Gamma control
                       ILI9341_WR_DATA(0x02);

        ILI9341_WR_REG(0x26);                  //Gamma Curve Select 3
                        ILI9341_WR_DATA(0x01);

        ILI9341_WR_REG(0xE0);                  //Set Gamma
                        ILI9341_WR_DATA(0x0F);
                        ILI9341_WR_DATA(0x20);
                        ILI9341_WR_DATA(0x19);
                        ILI9341_WR_DATA(0x0F);
                        ILI9341_WR_DATA(0x10);
                        ILI9341_WR_DATA(0x08);
                        ILI9341_WR_DATA(0x4A);
                        ILI9341_WR_DATA(0xF6);
                        ILI9341_WR_DATA(0x3A);
                        ILI9341_WR_DATA(0x0F);
                        ILI9341_WR_DATA(0x14);
                        ILI9341_WR_DATA(0x09);
                        ILI9341_WR_DATA(0x18);
                        ILI9341_WR_DATA(0x0B);
                        ILI9341_WR_DATA(0x08);

        ILI9341_WR_REG(0xE1);                  //Set Gamma
                        ILI9341_WR_DATA(0x00);
                        ILI9341_WR_DATA(0x1E);
                        ILI9341_WR_DATA(0x1E);
                        ILI9341_WR_DATA(0x05);
                        ILI9341_WR_DATA(0x0F);
                        ILI9341_WR_DATA(0x04);
                        ILI9341_WR_DATA(0x31);
                        ILI9341_WR_DATA(0x33);
                        ILI9341_WR_DATA(0x43);
                        ILI9341_WR_DATA(0x04);
                        ILI9341_WR_DATA(0x0B);
                        ILI9341_WR_DATA(0x06);
                        ILI9341_WR_DATA(0x27);
                        ILI9341_WR_DATA(0x34);
                        ILI9341_WR_DATA(0x0F);

        ILI9341_WR_REG(0x11);                  //Exit SLEEP mode
        DelayMs(120);

        ILI9341_WR_REG(0x29);                  //Display ON

2016年 6月 19日 天氣報告
氣溫:30.4@ 19:30
相對濕度:百分之 80%
天氣:天色大致良好

2016年6月9日 星期四

DIY - PIC24:PIC24FJ64GA008 連接 2.8吋TFT LCD 液晶屏電路連接(十九)

DIY - PIC24PIC24FJ64GA008 連接 2.8TFT LCD 液晶屏電路連接(十九): 

筆者會使用 PIC24FJ64GA008 連接 2.8TFT LCD 液晶屏,雖然 PIC24 蕊片的 I/O 接口已經是較 PIC18 增加,但感覺仍然要小心謹慎,不要浪費珍貴的 I/O 接口,2.8TFT LCD 液晶屏模塊接口是 2x17 34腳的排針插座,可以選擇 16位、8位或 SPI 連接,所以筆者會選用 8位的 8080-II 方式連接 LCD 液晶屏,直接減少 I/O 接口。

PIC24FJ64GA008 2.8TFT LCD 液晶屏電路圖Schematic
2.8TFT LCD 液晶屏模塊接口是 2x17 34腳的排針插座,由於設定了用 8位的 8080-II 方式連接,所以從 DB1 ~ DB8 LCD 數據線會接地,而 LCD DB10 ~ DB17 便會連接至 MCU PMD0 ~ PMD78bits),其他 LCD 控制線如 LCD_CSLCD_RSLCD_WRLCD_RDLCD_RST BL_CTR 都需要連接至 MCU I/O 接口,電源供應 VCC 是連接到 DC 3.3V

2.8 TFT LCD 液晶屏 2x17 34腳的接口
2.8 TFT LCD ILI9341電阻式觸摸液晶屏模組 2x17 34腳的定義:
Pin
Signal
Description
Pin
Signal
Description
1
LCD_CS
Chip Select
2
LCD_RS
Command/Data
3
LCD_WR
Wrire
4
LCD_RD
Read
5
LCD_RST
Reset
6
DB1
D1
7
DB2
D2
8
DB3
D3
9
DB4
D4
10
DB5
D5
11
DB6
D6
12
DB7
D7
13
DB8
D8
14
DB10
D10
15
DB11
D11
16
DB12
D12
17
DB13
D13
18
DB14
D14
19
DB15
D15
20
DB16
D16
21
DB17
D17
22
SD_CS
SD Chip Select
23
BL_CTR
Back Light Control
24
VCC
Power
25
VCC
Power
26
GND
Ground
27
GND
Ground
28
NC
NC
29
SPI_MISO
Touch Data Ouput
30
SPI_MOSI
Touch Data Input
31
T_PEN
Touch Interrupt
32
FLASH_CS
Flash Chip Select
33
T_CS
Touch Chip Select
34
SPI_CLK
Touch Clock

Microchip PIC24FJ64GA008 2.8 TFT LCD 液晶屏接腳程式定義:
//Definition for data BUS
#define DAT_TRIS_BIT        TRISE
#define DAT_LAT_BIT          LATE
#define DAT_PORT_BIT      PORTE

// Definitions for Backlight enable pin
#define LED_TRIS_BIT       TRISDbits.TRISD9 // Output
#define LED_LAT_BIT         LATDbits.LATD9

// Definitions for Reset pin
#define RST_TRIS_BIT       TRISDbits.TRISD13
#define RST_LAT_BIT         LATDbits.LATD13

// Definitions for CS pin
#define CS_TRIS_BIT        TRISDbits.TRISD11
#define CS_LAT_BIT          LATDbits.LATD11

// Definitions for RD pin
#define RD_TRIS_BIT        TRISDbits.TRISD5
#define RD_LAT_BIT          LATDbits.LATD5

// Definitions for WR pin
#define WR_TRIS_BIT        TRISDbits.TRISD4
#define WR_LAT_BIT          LATDbits.LATD4

// Definitions for RS pin
#define RS_TRIS_BIT        TRISFbits.TRISF4
#define RS_LAT_BIT          LATFbits.LATF4

Microchip PIC24FJ64GA0082.8 TFT LCD 液晶屏連接:
LCD
Signal
MCU
Signal
LCD
Signal
MCU
Signal
1
LCD_CS
57
RD11
2
LCD_RS
39
RF4
3
LCD_WR
66
PMWR
4
LCD_RD
67
RD5
5
LCD_RST
65
RF4
6
DB1

GND
7
DB2

GND
8
DB3

GND
9
DB4

GND
10
DB5

GND
11
DB6

GND
12
DB7

GND
13
DB8

GND
14
DB10
76
PMD0
15
DB11
77
PMD1
16
DB12
78
PMD2
17
DB13
79
PMD3
18
DB14
80
PMD4
19
DB15
1
PMD5
20
DB16
2
PMD6
21
DB17
3
PMD7
22
SD_CS


23
BL_CTR
55
RD9
24
VCC

3.3V
25
VCC

3.3V
26
GND

GND
27
GND

GND
28
NC


29
SPI_MISO


30
SPI_MOSI


31
T_PEN


32
FLASH_CS


33
T_CS


34
SPI_CLK



20166 9日 天氣報告
氣溫:29.2@ 16:40
相對濕度:百分之 82%
天氣:微雨
端午節快樂