本帖最后由 cornrn 于 2017-12-29 11:24 编辑
TFT4137液晶模块 驱动芯片为S6D0139 (片内172800字节GRAM,即240*320*18/8),/****************************************************************************************
* 文件名: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;
}
|