📄 kitronix320x240x16_ssd2119_8bit.c
字号:
//*****************************************************************************
//
// kitronix320x240x16_ssd2119_8bit.c - Display driver for the Kitronix
// K350QVG-V1-F TFT display with an SSD2119
// controller. This version assumes an
// 8080-8bit interface between the micro
// and display (PS3-0 = 0011b).
//
// This is part of revision 5228 of the DK-LM3S9B92.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup display_api
//! @{
//
//*****************************************************************************
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/epi.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "grlib/grlib.h"
#include "drivers/kitronix320x240x16_ssd2119_8bit.h"
#include "drivers/set_pinout.h"
//*****************************************************************************
//
// This driver operates in four different screen orientations. They are:
//
// * Portrait - The screen is taller than it is wide, and the flex connector is
// on the left of the display. This is selected by defining
// PORTRAIT.
//
// * Landscape - The screen is wider than it is tall, and the flex connector is
// on the bottom of the display. This is selected by defining
// LANDSCAPE.
//
// * Portrait flip - The screen is taller than it is wide, and the flex
// connector is on the right of the display. This is
// selected by defining PORTRAIT_FLIP.
//
// * Landscape flip - The screen is wider than it is tall, and the flex
// connector is on the top of the display. This is
// selected by defining LANDSCAPE_FLIP.
//
// These can also be imagined in terms of screen rotation; if portrait mode is
// 0 degrees of screen rotation, landscape is 90 degrees of counter-clockwise
// rotation, portrait flip is 180 degrees of rotation, and landscape flip is
// 270 degress of counter-clockwise rotation.
//
// If no screen orientation is selected, "landscape flip" mode will be used.没有选择屏幕方向,一种模式被选择
//
//*****************************************************************************
#if ! defined(PORTRAIT) && ! defined(PORTRAIT_FLIP) && \
! defined(LANDSCAPE) && ! defined(LANDSCAPE_FLIP)
#define PORTRAIT
#endif
//*****************************************************************************
//
// Various definitions controlling coordinate space mapping and drawing
// direction in the four supported orientations.
//坐标原点及坐标位置选择。
//*****************************************************************************
#ifdef PORTRAIT//模式A
#define HORIZ_DIRECTION 0x28
#define VERT_DIRECTION 0x20
#define MAPPED_X(x, y) (239 - (y))
#define MAPPED_Y(x, y) (x)
#endif
#ifdef LANDSCAPE//模式B
#define HORIZ_DIRECTION 0x00
#define VERT_DIRECTION 0x08
#define MAPPED_X(x, y) (239 - (x))
#define MAPPED_Y(x, y) (319 - (y))
#endif
#ifdef PORTRAIT_FLIP//模式C
#define HORIZ_DIRECTION 0x18
#define VERT_DIRECTION 0x10
#define MAPPED_X(x, y) (y)
#define MAPPED_Y(x, y) (319 - (x))
#endif
#ifdef LANDSCAPE_FLIP//模式D
#define HORIZ_DIRECTION 0x30
#define VERT_DIRECTION 0x38
#define MAPPED_X(x, y) (x)
#define MAPPED_Y(x, y) (y)
#endif
//*****************************************************************************
//
// Defines for the pins that are used to communicate with the SSD2119.
//对PORT口的宏定义
//*****************************************************************************
#define LCD_DATAH_PINS 0xFF
#define LCD_DATAH_PERIPH SYSCTL_PERIPH_GPIOD
#define LCD_DATAH_BASE GPIO_PORTD_BASE
//
// LCD control line GPIO definitions.
//LCD的复位/ 读/ 不知道控制
#define LCD_RST_PERIPH SYSCTL_PERIPH_GPIOB
#define LCD_RST_BASE GPIO_PORTB_BASE
#define LCD_RST_PIN GPIO_PIN_7
#define LCD_RD_PERIPH SYSCTL_PERIPH_GPIOB
#define LCD_RD_BASE GPIO_PORTB_BASE
#define LCD_RD_PIN GPIO_PIN_5
#define LCD_WR_PERIPH SYSCTL_PERIPH_GPIOH
#define LCD_WR_BASE GPIO_PORTH_BASE
#define LCD_WR_PIN GPIO_PIN_6
#define LCD_DC_PERIPH SYSCTL_PERIPH_GPIOH
#define LCD_DC_BASE GPIO_PORTH_BASE
#define LCD_DC_PIN GPIO_PIN_7
//*****************************************************************************
//
// Backlight control GPIO used with the Flash/SRAM/LCD daughter board.
//背光控制
//*****************************************************************************
#define LCD_BACKLIGHT_BASE GPIO_PORTE_BASE
#define LCD_BACKLIGHT_PIN GPIO_PIN_2
//*****************************************************************************
//
// Macro used to set the LCD data bus in preparation for writing a byte to the
// device.
//置位LCD数据总线,为写数据做准备
//*****************************************************************************
#define SET_LCD_DATA(ucByte) \
{ \
HWREG(LCD_DATAH_BASE + GPIO_O_DATA + (LCD_DATAH_PINS << 2)) = (ucByte); \
}
//*****************************************************************************
//
// Various internal SD2119 registers name labels
//SD2119内部寄存器
//*****************************************************************************
#define S6D0154_DRIVER_OPT_CTRL_REG 0x01
#define S6D0154_DRV_WAVEFORM_CTRL_REG 0x02
#define S6D0154_ENTRY_MODE_REG 0x03
#define S6D0154_DISPLAY_CTRL_REG 0x07
#define S6D0154_BLANK_PERIOD_CTRL_REG 0X08
#define S6D0154_FRAME_CYCLE_CTRL_REG 0x0B
#define S6D0154_EXTERNAL_IF_CTRL_REG 0x0C
#define S6D0154_MODE_REG 0x0E
#define S6D0154_START_OSC_REG 0x0F
#define S6D0154_PWR_CTRL_1_REG 0x10
#define S6D0154_PWR_CTRL_2_REG 0x11
#define S6D0154_PWR_CTRL_3_REG 0x12
#define S6D0154_PWR_CTRL_4_REG 0x13
#define S6D0154_PWR_CTRL_5_REG 0x14
#define S6D0154_VCI_RECYCLING_REG 0x15
#define S6D0154_H_WINDOW_START_REG 0x37
#define S6D0154_H_WINDOW_END_REG 0x36
#define S6D0154_V_WINDOW_START_REG 0x39
#define S6D0154_V_WINDOW_END_REG 0x38
#define S6D0154_H_RAM_ADDR_REG 0x20
#define S6D0154_V_RAM_ADDR_REG 0x21
#define S6D0154_RAM_DATA_REG 0x22
#define S6D0154_GAMMA_CTRL_1_REG 0x50
#define S6D0154_GAMMA_CTRL_2_REG 0x51
#define S6D0154_GAMMA_CTRL_3_REG 0x52
#define S6D0154_GAMMA_CTRL_4_REG 0x53
#define S6D0154_GAMMA_CTRL_5_REG 0x54
#define S6D0154_GAMMA_CTRL_6_REG 0x55
#define S6D0154_GAMMA_CTRL_7_REG 0x56
#define S6D0154_GAMMA_CTRL_8_REG 0x57
#define S6D0154_GAMMA_CTRL_9_REG 0x58
#define S6D0154_GAMMA_CTRL_10_REG 0x59
#define ENTRY_MODE_DEFAULT 0x1028
#define MAKE_ENTRY_MODE(x) ((ENTRY_MODE_DEFAULT & 0xFF00) | (x))
//*****************************************************************************
//
// The dimensions of the LCD panel.
//定义LCD的大小
//*****************************************************************************
#define LCD_VERTICAL_MAX 240
#define LCD_HORIZONTAL_MAX 320
//*****************************************************************************
//
// Translates a 24-bit RGB color to a display driver-specific color.
//
// \param c is the 24-bit RGB color. The least-significant byte is the blue
// channel, the next byte is the green channel, and the third byte is the red
// channel.
//
// This macro translates a 24-bit RGB color into a value that can be written
// into the display's frame buffer in order to reproduce that color, or the
// closest possible approximation of that color.
//
// \return Returns the display-driver specific color.
//获取色素RGB值
//*****************************************************************************
#define DPYCOLORTRANSLATE(c) ((((c) & 0x00f80000) >> 8) | \
(((c) & 0x0000fc00) >> 5) | \
(((c) & 0x000000f8) >> 3))
//*****************************************************************************
//
// Function pointer types for low level LCD controller access functions.
//定义函数指针类型
//*****************************************************************************
typedef void (*pfnWriteData)(unsigned short usData);
typedef void (*pfnWriteCommand)(unsigned char ucData);
//*****************************************************************************
//
// Function pointers for low level LCD controller access functions.
//函数指针的指向
//*****************************************************************************
static void WriteDataGPIO(unsigned short usData);
static void WriteCommandGPIO(unsigned char ucData);
pfnWriteData WriteData = WriteDataGPIO;
pfnWriteCommand WriteCommand = WriteCommandGPIO;
//*****************************************************************************
//
// Writes a data word to the SSD2119. This function implements the basic GPIO
// interface to the LCD display.
//
//*****************************************************************************
static void
WriteDataGPIO(unsigned short usData)
{
//
// Write the most significant byte of the data to the bus.
//置位总线,准备写数据
SET_LCD_DATA(usData >> 8);
//
// Assert the write enable signal. We need to do this 3 times to ensure
// that we don't violate the timing requirements for the display (when
// running with a 50MHz system clock).
//使能写信号【写三次】写信号写0使能,写1除能
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
//
// Deassert the write enable signal.
//撤销写使能信号
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
//
// Write the least significant byte of the data to the bus.
//
SET_LCD_DATA(usData);
//
// Assert the write enable signal.
//再次使能写信号
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
//
// Deassert the write enable signal. WR needs to be high for at least
// 50nS and back-to-back inlined calls to this function could just,
// conceivably violate this so add one access to pad the time a bit.
//撤销写使能信号
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
}
//*****************************************************************************
//
// Writes a data word to the SSD2119 via the EPI interface as wired when using
// the lm3s9b96 development kit SRAM/flash daughter board.
//通过EPI接口写一个数据
//*****************************************************************************
static void
WriteDataEPI(unsigned short usData)
{
HWREGB(LCD_DATA_PORT) = usData >> 8;
HWREGB(LCD_DATA_PORT) = usData;
}
//*****************************************************************************
//
// Writes a command word to the SSD2119 via the EPI interface as wired when
// using the lm3s9b96 development kit SRAM/flash daughter board.
//通过EPI接口写一个命令
//*****************************************************************************
static void
WriteCommandEPI(unsigned char ucData)
{
HWREGB(LCD_COMMAND_PORT) = 0;
HWREGB(LCD_COMMAND_PORT) = ucData;
}
//*****************************************************************************
//
// Writes a command to the SSD2119. This function implements the basic GPIO
// interface to the LCD display.
//写命令,实现最基本的GPIO液晶显示
//*****************************************************************************
static void
WriteCommandGPIO(unsigned char ucData)
{
//
// Write the most significant byte of the data to the bus. This is always
// 0 since commands are no more than 8 bits currently.
//置位总线,为写数据做准备
SET_LCD_DATA(0);
//
// Assert DC
//声明不知道
HWREG(LCD_DC_BASE + GPIO_O_DATA + (LCD_DC_PIN << 2)) = 0;
//
// Assert the write enable signal. Do this twice to 3 times to slow things
// down a bit.
//使能写
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
//
// Deassert the write enable signal. We need to leave WR high for at least
// 50nS so, again, stick in a dummy write to pad the timing.
//除能写
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
//
// Write the least significant byte of the data to the bus.
//
SET_LCD_DATA(ucData);
//
// Assert the write enable signal. Again, do this twice to ensure
// we meet the timing spec.
//
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0;
//
// Deassert the write enable signal.
//
HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN;
//
// Set the DC signal high, indicating that following writes are data. There
// is no need to pad the timing here since we won't violate the 50nS rule
// even if this function is inlined and it or WriteData are called
// immediately after we exit.
//
HWREG(LCD_DC_BASE + GPIO_O_DATA + (LCD_DC_PIN << 2)) = LCD_DC_PIN;
}
//*****************************************************************************
//
// Initializes the pins required for the GPIO-based LCD interface.
//
// This function configures the GPIO pins used to control the LCD display
// when the basic GPIO interface is in use. On exit, the LCD controller
// has been reset and is ready to receive command and data writes.
//
// \return None.
//
//*****************************************************************************
static void
InitGPIOLCDInterface(unsigned long ulClockMS)
{
//
// Convert the PB7/NMI pin into a GPIO pin. This requires the use of the
// GPIO lock since changing the state of the pin is otherwise disabled.
//
HWREG(GPIO_PORTB_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;
HWREG(GPIO_PORTB_BASE + GPIO_O_CR) = 0x80;
//
// Make PB7 an output.
//
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_7);
//
// Clear the commit register, effectively locking access to registers
// controlling the PB7 configuration.
//
HWREG(GPIO_PORTB_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;
HWREG(GPIO_PORTB_BASE + GPIO_O_CR) = 0x00;
//
// Configure the pins that connect to the LCD as GPIO outputs.
//
GPIOPinTypeGPIOOutput(LCD_DATAH_BASE, LCD_DATAH_PINS);
GPIOPinTypeGPIOOutput(LCD_DC_BASE, LCD_DC_PIN);
GPIOPinTypeGPIOOutput(LCD_RD_BASE, LCD_RD_PIN);
GPIOPinTypeGPIOOutput(LCD_WR_BASE, LCD_WR_PIN);
GPIOPinTypeGPIOOutput(LCD_RST_BASE, LCD_RST_PIN);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -