十分钟搞定SSD1963液晶屏驱动

SSD1963简介

• Display feature
− Built-in 1215K bytes frame buffer. Support up to 864 x 480 at 24bpp display
− Support TFT 18/24-bit generic RGB interface panel
− Support 8-bit serial RGB interface
− Hardware rotation of 0, 90, 180, 270 degree
− Hardware display mirroring
− Hardware windowing
− Programmable brightness, contrast and saturation control
− Dynamic Backlight Control (DBC) via PWM signal
• MCU connectivity
− 8/9/16/18/24-bit MCU interface
− Tearing effect signal
• I/O Connectivity
− 4 GPIO pins
• Built-in clock generator
• Deep sleep mode for power saving
• Core supply power (VDDPLL and VDDD): 1.2V±0.1V
• I/O supply power(VDDIO): 1.65V to 3.6V
• LCD interface supply power (VDDLCD): 1.65V to 3.6V
规格书:连接: http://pan.baidu.com/s/1eR8dHUM 密码: 7jihweb

硬件

此程序所对应的硬件信息以下:
1. MCU :LPC1768
2. 液晶屏:4.3寸TFT液晶
3. 驱动方式:8线驱动svg

SSD1963驱动代码

SSD1963.hui

#ifndef _SSD1963_H_
#define _SSD1963_H_

#include "lpc17xx.h"
#include "Common.h"

#define LCD_XSIZE (480) //设置液晶屏的分辨率 长
#define LCD_YSIZE (272) //设置液晶屏的分辨率 宽
#define LCD_CONTROLLER (1963) //设置液晶屏的驱动芯片型号

#define SSD1963_RESET_LOW() LPC_GPIO0->FIOCLR = _BV(6)
#define SSD1963_RESET_HIGH() LPC_GPIO0->FIOSET = _BV(6)

#define SSD1963_WR_LOW() LPC_GPIO1->FIOCLR = _BV(27)
#define SSD1963_WR_HIGH() LPC_GPIO1->FIOSET = _BV(27)

#define SSD1963_RD_LOW() LPC_GPIO1->FIOCLR = _BV(28)
#define SSD1963_RD_HIGH() LPC_GPIO1->FIOSET = _BV(28)

#define SSD1963_CS_LOW() LPC_GPIO0->FIOCLR = _BV(5)
#define SSD1963_CS_HIGH() LPC_GPIO0->FIOSET = _BV(5)

#define SSD1963_DC_LOW() LPC_GPIO0->FIOCLR = _BV(4)
#define SSD1963_DC_HIGH() LPC_GPIO0->FIOSET = _BV(4)

#define SSD1963_DATA_IN() LPC_GPIO2->FIODIR0 = 0x00
#define SSD1963_DATA_OUT() LPC_GPIO2->FIODIR0 = 0xff

#define SSD1963_Write8BitData(d) SSD1963_CS_LOW(); SSD1963_DC_HIGH(); SSD1963_WR_LOW(); LPC_GPIO2->FIOPIN0 = (d); NOP(); SSD1963_WR_HIGH(); SSD1963_CS_HIGH()
#define SSD1963_Read8BitData(d) SSD1963_DATA_IN(); SSD1963_CS_LOW(); SSD1963_DC_HIGH(); SSD1963_RD_LOW(); NOP(); (d) = LPC_GPIO2->FIOPIN0; SSD1963_RD_HIGH(); SSD1963_CS_HIGH(); SSD1963_DATA_OUT()
#define SSD1963_WriteCMD(d) SSD1963_CS_LOW(); SSD1963_DC_LOW(); SSD1963_WR_LOW(); LPC_GPIO2->FIOPIN0 = (d); NOP(); SSD1963_WR_HIGH(); SSD1963_CS_HIGH()

#define SSD1963_CMD_Nop 0x00
#define SSD1963_CMD_Reset 0x01
#define SSD1963_CMD_GPM 0x0A
#define SSD1963_CMD_GAM 0x0B
#define SSD1963_CMD_GDM 0x0D
#define SSD1963_CMD_EnSM 0x10
#define SSD1963_CMD_ExSM 0x11
#define SSD1963_CMD_EnPM 0x12
#define SSD1963_CMD_EnNM 0x13
#define SSD1963_CMD_ExIM 0x20
#define SSD1963_CMD_EnIM 0x21
#define SSD1963_CMD_SGaC 0x26
#define SSD1963_CMD_SDOff 0x28
#define SSD1963_CMD_SDOn 0x29
#define SSD1963_CMD_SCAdd 0x2A
#define SSD1963_CMD_SPAdd 0x2B
#define SSD1963_CMD_WMS 0x2C
#define SSD1963_CMD_RMS 0x2E
#define SSD1963_CMD_SPArea 0x30
#define SSD1963_CMD_SSArea 0x33
#define SSD1963_CMD_STOff 0x34
#define SSD1963_CMD_STOn 0x35
#define SSD1963_CMD_SAM 0x36
#define SSD1963_CMD_SSS 0x37
#define SSD1963_CMD_ExIdM 0x38
#define SSD1963_CMD_EnIdM 0x39
#define SSD1963_CMD_WMC 0x3C
#define SSD1963_CMD_RMC 0x3E
#define SSD1963_CMD_STS 0x44
#define SSD1963_CMD_GS 0x45
#define SSD1963_CMD_RDDB 0xA1
#define SSD1963_CMD_SLM 0xB0
#define SSD1963_CMD_GLM 0xB1
#define SSD1963_CMD_SHP 0xB4
#define SSD1963_CMD_GHP 0xB5
#define SSD1963_CMD_SVP 0xB6
#define SSD1963_CMD_GVP 0xB7
#define SSD1963_CMD_SGC 0xB8
#define SSD1963_CMD_GGC 0xB9
#define SSD1963_CMD_SGV 0xBA
#define SSD1963_CMD_GGS 0xBB
#define SSD1963_CMD_SPP 0xBC
#define SSD1963_CMD_GPP 0xBD
#define SSD1963_CMD_SPC 0xBE
#define SSD1963_CMD_GPC 0xBF
#define SSD1963_CMD_SLG0 0xC0
#define SSD1963_CMD_GLG0 0xC1
#define SSD1963_CMD_SLG1 0xC2
#define SSD1963_CMD_GLG1 0xC3
#define SSD1963_CMD_SLG2 0xC4
#define SSD1963_CMD_GLG2 0xC5
#define SSD1963_CMD_SLG3 0xC6
#define SSD1963_CMD_GLG3 0xC7
#define SSD1963_CMD_SG0R 0xC8
#define SSD1963_CMD_GG0R 0xC9
#define SSD1963_CMD_SG1R 0xCA
#define SSD1963_CMD_GG1R 0xCB
#define SSD1963_CMD_SG2R 0xCC
#define SSD1963_CMD_GG2R 0xCD
#define SSD1963_CMD_SG3R 0xCE
#define SSD1963_CMD_GG3R 0xCF
#define SSD1963_CMD_SDC 0xD0
#define SSD1963_CMD_GDC 0xD1
#define SSD1963_CMD_SDT 0xD4
#define SSD1963_CMD_GDT 0xD5
#define SSD1963_CMD_StPll 0xE0
#define SSD1963_CMD_SPll 0xE2
#define SSD1963_CMD_GPll 0xE3
#define SSD1963_CMD_GPllS 0xE4
#define SSD1963_CMD_SDS 0xE5
#define SSD1963_CMD_SLF 0xE6
#define SSD1963_CMD_GLF 0xE7
#define SSD1963_CMD_SPDI 0xF0
#define SSD1963_CMD_GPDI 0xF1

void SSD1963_GPIO_Init(void);
void SSD1963_Init(void);
void SSD1963_SetCursor(uint16_t x, uint16_t y);
void SSD1963_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t EndX, uint16_t EndY);
uint16_t SSD1963_GetPoint(uint16_t x, uint16_t y);
void SSD1963_SetPoint(uint16_t x, uint16_t y, uint32_t color);
void SSD1963_WriteColor(uint32 data);
void SSD1963_ON(void);
void SSD1963_OFF(void);

#endif

SSD1963.cspa

#include "Delay.h"
#include "SSD1963.h"

#define LCD_HDP (LCD_XSIZE - 1)
#define LCD_HT 531
#define LCD_HPS 43
#define LCD_LPS 8
#define LCD_HPW 1

#define LCD_VDP (LCD_YSIZE - 1)
#define LCD_VT 288
#define LCD_VPS 12
#define LCD_FPS 4
#define LCD_VPW 10


#define BKCOLOR LCD_BKCOLORINDEX
#define COLOR LCD_COLORINDEX

#define SdCmd(d) SSD1963_WriteCMD(d)
#define SdData(d) SSD1963_Write8BitData(d)

uint16 SSD1963_ReadColor(void)
{
    uint8 d;
    uint16 temp;

    SSD1963_Read8BitData(d);
    temp = d >> 3;
    temp <<= 6;
    SSD1963_Read8BitData(d);
    temp |= (d & 0x3f) >> 2;
    temp <<= 5;
    SSD1963_Read8BitData(d);
    temp |= (d & 0x1f) >> 3;

    return temp;
}

void SSD1963_WriteColor(uint32 data)
{
    SSD1963_Write8BitData((uint8)(data ));
    SSD1963_Write8BitData((uint8)(data >> 8));
    SSD1963_Write8BitData((uint8)(data >> 16));
}

void SSD1963_ON(void)
{
    SSD1963_WriteCMD(SSD1963_CMD_SPC);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(0x60);
    SSD1963_Write8BitData(0x01);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(0x00);

    SSD1963_WriteCMD(SSD1963_CMD_SDOn);
}

void SSD1963_OFF(void)
{
    SSD1963_WriteCMD(SSD1963_CMD_SPC);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(0xff);
    SSD1963_Write8BitData(0x01);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(0x00);

    SSD1963_WriteCMD(SSD1963_CMD_SDOff);
}

void SSD1963_GPIO_Init(void)
{
    LPC_GPIO0->FIODIR |= _BV(4) | _BV(5) | _BV(6) ;
    LPC_GPIO1->FIODIR |= _BV(27) | _BV(28) ;
    LPC_GPIO2->FIODIR0 = 0xff;
}

void SSD1963_Init(void)
{
    SSD1963_GPIO_Init();
    SSD1963_RESET_LOW();
    SSD1963_DATA_OUT();
    SSD1963_CS_HIGH();
    SSD1963_WR_HIGH();
    SSD1963_RD_HIGH();
    DelayUS(500);
    SSD1963_RESET_HIGH();
    DelayMS(5);

    SdCmd(0xe2); SdData(0x3B); SdData(0x02); SdData(0x04); DelayUS(500);
    SdCmd(0xe0); SdData(0x01); DelayUS(500);
    SdCmd(0xe0); SdData(0x03); DelayUS(500);

    SSD1963_WriteCMD(SSD1963_CMD_Reset);
    DelayUS(500);

    SdCmd(0xe6); SdData(0x00); SdData(0xb8); SdData(0x50);


    SSD1963_WriteCMD(SSD1963_CMD_SLM);
    SSD1963_Write8BitData(0x20);
    SSD1963_Write8BitData(0x00);
    SSD1963_Write8BitData(LCD_HDP >> 8);
    SSD1963_Write8BitData(LCD_HDP & 0xFF);
    SSD1963_Write8BitData(LCD_VDP >> 8);
    SSD1963_Write8BitData(LCD_VDP & 0xFF);
    SSD1963_Write8BitData(0x00);

    SSD1963_WriteCMD(SSD1963_CMD_SHP);
    SSD1963_Write8BitData(LCD_HT >> 8);
    SSD1963_Write8BitData(LCD_HT & 0xFF);
    SSD1963_Write8BitData(LCD_HPS >> 8);
    SSD1963_Write8BitData(LCD_HPS & 0xFF);
    SSD1963_Write8BitData(LCD_HPW);
    SSD1963_Write8BitData(LCD_LPS >> 8);
    SSD1963_Write8BitData(LCD_LPS & 0xFF);
    SSD1963_Write8BitData(0x00);

    SSD1963_WriteCMD(SSD1963_CMD_SVP);
    SSD1963_Write8BitData(LCD_VT >> 8);
    SSD1963_Write8BitData(LCD_VT & 0xFF);
    SSD1963_Write8BitData(LCD_VPS >> 8);
    SSD1963_Write8BitData(LCD_VPS & 0xFF);
    SSD1963_Write8BitData(LCD_VPW);
    SSD1963_Write8BitData(LCD_FPS >> 8);
    SSD1963_Write8BitData(LCD_FPS & 0xFF);

    SdCmd(0xf0); SdData(0x00);

    SdCmd(0x11);
    SdCmd(0x13);
    SdCmd(0x20);
    SdCmd(0x38);

    SdCmd(0xB8); SdData(0x0f); SdData(0x01);
    SdCmd(0xba); SdData(0x01); DelayUS(500);
    SdCmd(0xba); SdData(0x03); DelayUS(500);

    SdCmd(0x36); SdData(0x00);

    DelayUS(500);

    SSD1963_ON();
}

void SSD1963_SetCursor(uint16_t x, uint16_t y)
{
    SSD1963_WriteCMD(SSD1963_CMD_SCAdd);
    SSD1963_Write8BitData(x >> 8);
    SSD1963_Write8BitData(x & 0xFF);
    SSD1963_Write8BitData(LCD_HDP >> 8);
    SSD1963_Write8BitData(LCD_HDP & 0xFF);

    SSD1963_WriteCMD(SSD1963_CMD_SPAdd);
    SSD1963_Write8BitData(y >> 8);
    SSD1963_Write8BitData(y & 0xFF);
    SSD1963_Write8BitData(LCD_VDP >> 8);
    SSD1963_Write8BitData(LCD_VDP & 0xFF);
}


void SSD1963_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t EndX, uint16_t EndY)
{
    SSD1963_WriteCMD(SSD1963_CMD_SCAdd);
    SSD1963_Write8BitData(StartX >> 8);
    SSD1963_Write8BitData(StartX & 0xFF);
    SSD1963_Write8BitData(EndX >> 8);
    SSD1963_Write8BitData(EndX & 0xFF);

    SSD1963_WriteCMD(SSD1963_CMD_SPAdd);
    SSD1963_Write8BitData(StartY >> 8);
    SSD1963_Write8BitData(StartY & 0xFF);
    SSD1963_Write8BitData(EndY >> 8);
    SSD1963_Write8BitData(EndY & 0xFF);
}

void SSD1963_SetPoint(uint16_t x, uint16_t y, uint32_t color)
{
    SSD1963_SetCursor(x, y);

    SSD1963_WriteCMD(SSD1963_CMD_WMS);
    SSD1963_WriteColor(color);
}


uint16_t SSD1963_GetPoint(uint16_t x, uint16_t y)
{
    SSD1963_SetCursor(x, y);
    SSD1963_WriteCMD(SSD1963_CMD_RMS);
    return (SSD1963_ReadColor());
}