- /****************************************************************************************
- * 文件名:LCDDRIVE.H
- * 功能:TFT4137液晶模块驱
动。(头文件)
* 驱动芯片为S6D0139 (片内172800字节GRAM,即240*320*18/8),
*
* 8位接口总线
*
* 操作说明(写IR + CR/WDR [ + WDR...] ):
* R/W RS 操作
* 0 0 写IR(索引,即选择CR)
* 1 0 读芯片状态
* 0 1 写命令(CR)/数据(WDR)
* 1 1 读数据(RDR)
****************************************************************************************/
#ifndef __LCDDRIVE_H_
#define __LCDDRIVE_H_
#include "app.h"
// 定义颜色数据类型(可以是数据结构)
#define TCOLOR uint16_t
// 定义LCM像素数宏
#define LCM_XMAX 240 /* 定义液晶x轴的点数 */
#define LCM_YMAX 320 /* 定义液晶y轴的点数 */
// 设置颜色宏定义
#define BLACK 0x0000 /* 黑色: 0, 0, 0 */
#define NAVY 0x000F /* 深蓝色: 0, 0, 128 */
#define DGREEN 0x03E0 /* 深绿色: 0, 128, 0 */
#define DCYAN 0x03EF /* 深青色: 0, 128, 128 */
#define MAROON 0x7800 /* 深红色:128, 0, 0 */
#define PURPLE 0x780F /* 紫色: 128, 0, 128 */
#define OLIVE 0x7BE0 /* 橄榄绿:128, 128, 0 */
#define LGRAY 0xC618 /* 灰白色:192, 192, 192 */
#define DGRAY 0x7BEF /* 深灰色:128, 128, 128 */
#define BLUE 0x001F /* 蓝色: 0, 0, 255 */
#define GREEN 0x07E0 /* 绿色: 0, 255, 0 */
#define CYAN 0x07FF /* 青色: 0, 255, 255 */
#define RED 0xF800 /* 红色: 255, 0, 0 */
#define MAGENTA 0xF81F /* 品红: 255, 0, 255 */
#define YELLOW 0xFFE0 /* 黄色: 255, 255, 0 */
#define WHITE 0xFFFF /* 白色: 255, 255, 255 */
// 定义清屏色
#define GUI_CCOLOR MAROON
// 定义S6D0139的部份寄存器
#define SET_ADDR_X 0x0020 /* GRAM地址设置(R21H,R20H) */
#define SET_ADDR_Y 0x0021
#define WR_RD_DATA 0x0022 /* 写/读GRAM数据 (R22H) */
#define SET_WINDOW_SX_EX 0x0046 /* window地址设置--x0,x1 (R46H) */
#define SET_WINDOW_SY 0x0048 /* window地址设置--y0 (R48H) */
#define SET_WINDOW_EY 0x0047 /* window地址设置--y1 (R47H) */
// 初始化数据结构定义
#define DATA_END 0xFF00
// 定义初始化数据的结构
typedef struct
{
uint16_t com; // 命令字
uint16_t dat; // 数据
uint16_t dly; // 命令延时控制(如50)
}STCOM_INI;
void TFTLCD_Init(void);
uint8_t TFTLCD_SetPixelIndex(uint16_t x, uint16_t y, TCOLOR color);
uint16_t TFTLCD_GetPixelIndex(uint16_t x, uint16_t y);
void TFTLCD_HLine(uint16_t x0, uint16_t y0, uint16_t x1, TCOLOR color) ;
void DelaymS(uint32_t no);
#endif
- /****************************************************************************************
- * 文件名:LCDDRIVE.C
- * 功能:TFT4137液晶模块驱动。驱动芯片为S6D0139 (片内172800字节GRAM,即240*320*18/8),
- *
- * RGB对应值(16位数据,分First,Second两次传输,Fd7--Fd0,Sd7--Sd0):
- * Fd7--Fd3 R色
- * Fd2--Fd0,Sd7--Sd5 G色
- * Sd4--Sd0 B色
- * 写操作时地址计数器会自动增长,而读操作则不会自动增长。读操作时,读第2个数
- * 据才是有效的数据
- ****************************************************************************************/
- #include "LCDDriver.h"
- #define LCD_CS_PIN GPIO_PIN_8
- #define LCD_WE_PIN GPIO_PIN_9
- #define LCD_A1_PIN GPIO_PIN_10
- #define LCD_OE_PIN GPIO_PIN_11
- /*******************************************************
- * 名称: TFTLCD_SendCmd
- * 功能: 向TFT液晶模块发送命令字。
- * 入口参数: com 命令字(uint16)
- * 出口参数: 无
- *******************************************************/
- void TFTLCD_SendCmd(uint16_t cmd)
- {
- uint8_t data;
- GPIOA->MODER |= 0x5555;
- data = (cmd >> 8);
- GPIOA->ODR = (GPIOA->ODR&0xF000)|data|0xA00;
- data = cmd & 0x00FF;
- GPIOA->ODR = (GPIOA->ODR&0xFD00)|data;
- GPIOA->ODR = (GPIOA->ODR|0x0F00);
- }
- /*******************************************************
- * 名称: TFTLCD_SendDat
- * 功能: 向TFT液晶模块发送数据。
- * 入口参数: dat 待发送的数据(uint16)
- * 出口参数: 无
- *******************************************************/
- void TFTLCD_SendDat(uint16_t dat)
- {
- uint8_t data;
- GPIOA->MODER |= 0x5555;
- data = (dat >> 8);
- GPIOA->ODR = (GPIOA->ODR&0xF000)|data|0xC00;
- GPIOA->BSRR = (uint32_t)LCD_WE_PIN;
- data = dat & 0x00FF;
- GPIOA->ODR = (GPIOA->ODR&0xFD00)|data;
- GPIOA->ODR = (GPIOA->ODR|0x0F00);
- }
- /*******************************************************
- * 名称: TFTLCD_RcvDat
- * 功能: 读取TFT液晶模块的数据。
- * 入口参数: 无
- * 出口参数: 返回值即是读出的数据
- *******************************************************/
- uint16_t TFTLCD_RcvDat(void)
- {
- uint16_t ret, bak;
- GPIOA->MODER &= 0xFFFF0000;
- GPIOA->ODR = (GPIOA->ODR&0xF000)|0x600;
- bak = (GPIOA->IDR&0xFF);
- ret = (bak << 8);
- GPIOA->ODR = (GPIOA->ODR&0xF000)|0x900;
- GPIOA->ODR = (GPIOA->ODR&0xF000)|0x600;
- bak = (GPIOA->IDR&0xFF);
- ret = ret | bak;
- GPIOA->ODR = (GPIOA->ODR|0x0F00);
- return(ret);
- }
- /*******************************************************
- * 名称: TFTLCD_SetAddr
- * 功能: 设置数据地址指针(坐标值)。
- * 入口参数: x 横坐标的值 (0-239)
- * y 纵坐标的值 (0-319)
- * 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE
- *******************************************************/
- uint8_t TFTLCD_SetAddr(uint16_t x, uint16_t y)
- {
- TFTLCD_SendCmd(SET_ADDR_X); // 设置地址低8位
- TFTLCD_SendDat(x);
-
- TFTLCD_SendCmd(SET_ADDR_Y); // 设置地址高9位
- TFTLCD_SendDat(y);
-
- if((x<240) && (y<320)) return(1);
- else return(0);
- }
- /*******************************************************
- * 名称: TFTLCD_SetWrite
- * 功能: 设置数据地址指针(坐标值),并发送写数据命令。
- * 接着不断的写入数据即可,GRAM地址会自动增加。
- * 入口参数: x 横坐标的值 (0-239)
- * y 纵坐标的值 (0-319)
- * 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE
- *******************************************************/
- uint8_t TFTLCD_SetWrite(uint16_t x, uint16_t y)
- {
- uint8_t ret;
- ret = TFTLCD_SetAddr(x, y);
- TFTLCD_SendCmd(WR_RD_DATA); // 写数据
- return(ret);
- }
- /*******************************************************
- * 名称: DelaymS
- * 功能: 软件延时(1mS,与系统时钟有关)。
- * 入口参数: no 延时控制(uint32_t),值越大延时越长
- * 出口参数: 无
- *******************************************************/
- void DelaymS(uint32_t no)
- {
- uint32_t i;
- for(; no>0; no--)
- {
- for(i=0; i<15000; i++);
- }
- }
- /*******************************************************
- * 名称: TFTLCD_Reset
- * 功能: 控制TFT液晶模块复位。
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************/
- void TFTLCD_Reset(void)
- {
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
- DelaymS(10);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
- DelaymS(10);
- }
- // 定义TFT_LCD初始化数据信息
- STCOM_INI TFT_LCD_INI[] =
- {
- {0x0000, 0x0001, 10}, // Start Oscillation
- {0x0007, 0x0000, 0}, // Display control1
- {0x0013, 0x0000, 0}, // Power control4 setting
- {0x0011, 0x2604, 0}, // Power control2 setting
- {0x0014, 0x0015, 0}, // Power control5 setting
- {0x0010, 0x3C00, 0}, // Power control1 setting
- {0x0013, 0x0040, 10}, // Power control4 setting
- {0x0013, 0x0060, 50}, // Power control4 setting
- {0x0013, 0x0070, 40}, // Power control4 setting
-
- {0x0001, 0x0127, 0}, // Driver output setting (240x320 mode, GS=0, SS=1)
- {0x0002, 0x0700, 0}, // LCD driving waveform setting
- {0x0003, 0x1030, 0}, // Entry mode setting (TRI=0, DFM=0, BGR=1, ID1:ID0 =11, AM = 0)
- {0x0007, 0x0000, 0}, // Display control1
- {0x0008, 0x0404, 0}, // Display control2
- {0x000B, 0x0200, 0}, // Frame cycle setting
- {0x000C, 0x0000, 0}, // External display interface setting
- {0x00015,0x0000, 0},
-
- {0x0030, 0x0000, 0}, // Gamma control1
- {0x0031, 0x0606, 0}, // Gamma control2
- {0x0032, 0x0006, 0}, // Gamma control3
- {0x0033, 0x0403, 0}, // Gamma control4
- {0x0034, 0x0107, 0}, // Gamma control5
- {0x0035, 0x0101, 0}, // Gamma control6
- {0x0036, 0x0707, 0}, // Gamma control7
- {0x0037, 0x0304, 0}, // Gamma control8
- {0x0038, 0x0A00, 0}, // Gamma control9
- {0x0039, 0x0706, 0}, // Gamma control10
-
- {0x0040, 0x0000, 0}, // Gate scan position (start G1 scan)
- {0x0041, 0x0000, 0}, // Vertical scroll setting
- {0x0042, 0x013F, 0}, // Screen end position (320-1)
- {0x0043, 0x0000, 0}, // Screen start position (0)
- {0x0044, 0x0000, 0}, // 2th Screen end position
- {0x0045, 0x0000, 0}, // 2th Screen start position
- {0x0046, 0xEF00, 0}, // window addr set for x0,x1 (0, 239)
- {0x0047, 0x013F, 0}, // window addr set for y0(319)
- {0x0048, 0x0000, 0}, // window addr set for y1(0)
- {0x0007, 0x0011, 40}, // Display control1
- {0x0007, 0x0017, 0}, // Display control1
-
- {DATA_END, 0, 0}
- };
- /*******************************************************
- * 名称: TFTLCD_Init()
- * 功能: 初始化TFT液晶模块。
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************/
- void TFTLCD_Init(void)
- {
- int i;
- STCOM_INI init_dat;
- GPIO_InitTypeDef GPIO_InitStructure;
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStructure.Pull = GPIO_NOPULL;
- GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
- GPIO_InitStructure.Pin = 0xFF|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_15;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
-
- TFTLCD_Reset();
- for(i=0; i<100; i++)
- {
- init_dat = TFT_LCD_INI[i];
- if(init_dat.com==DATA_END) break;
- TFTLCD_SendCmd(init_dat.com);
- TFTLCD_SendDat(init_dat.dat);
- DelaymS(init_dat.dly);
- }
- }
- /****************************************************************************
- * 名称:TFTLCD_SetPixelIndex()
- * 功能:在指定位置上画点。
- * 入口参数:x 指定点所在列的位置
- * y 指定点所在行的位置
- * color 显示颜色
- * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
- ****************************************************************************/
- uint8_t TFTLCD_SetPixelIndex(uint16_t x, uint16_t y, TCOLOR color)
- {
- /* 参数过滤 */
- if(x>=LCM_XMAX) return(0);
- if(y>=LCM_YMAX) return(0);
-
- /* 刷新显示 */
- TFTLCD_SetWrite(x, y);
- TFTLCD_SendDat(color);
-
- return(1);
- }
- /****************************************************************************
- * 名称:TFTLCD_GetPixelIndex()
- * 功能:读取指定位置点的颜色数据。
- * 入口参数:x 指定点所在列的位置
- * y 指定点所在行的位置
- * 出口参数:返回值即是读出值(RRRRRGGGGGGBBBBB)。
- ****************************************************************************/
- uint16_t TFTLCD_GetPixelIndex(uint16_t x, uint16_t y)
- {
- uint16_t bak;
- /* 读取数据 */
- TFTLCD_SetAddr(x, y); // 设置地址
- TFTLCD_SendCmd(WR_RD_DATA);
- bak = TFTLCD_RcvDat();
- bak = TFTLCD_RcvDat();
- return bak;
- }