📄 lcddrive.c
字号:
/****************************************************************************************
* 文件名: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 "config.h"
#define USE_GPIO_BUS 0
#if USE_GPIO_BUS == 1
// 总线控制口定义
#define GP_nCS0 (1<<30)
#define GP_nCS1 (0x80000000)
#define GP_nWE (1<<25)
#define GP_nOE (1<<24)
#define GP_A1 (1<<1)
#define GP_A14 (1<<14)
#define GP_A15 (1<<15)
// 总线控制信号函数
//#define SET_nCS() FIO4SET = GP_nCS0
//#define CLR_nCS() FIO4CLR = GP_nCS0
#define SET_nCS() FIO4SET = GP_nCS1
#define CLR_nCS() FIO4CLR = GP_nCS1
#define SET_nWE() FIO4SET = GP_nWE
#define CLR_nWE() FIO4CLR = GP_nWE
#define SET_nOE() FIO4SET = GP_nOE
#define CLR_nOE() FIO4CLR = GP_nOE
#define OP_DR() FIO4SET = GP_A1
#define OP_IR() FIO4CLR = GP_A1
#define WR_DATA8(dat) FIO3MASK = 0xFFFFFF00; FIO3PIN = dat
/*
void GPIO_test(void)
{
SET_nCS();
CLR_nCS();
SET_nWE();
CLR_nWE();
SET_nOE();
CLR_nOE();
OP_DR();
OP_IR();
SET_nCS();
SET_nWE();
SET_nOE();
OP_DR();
WR_DATA8(0x05);
WR_DATA8(0xA0);
}
*/
/*******************************************************
* 名称: DelayuS
* 功能: 软件延时(uS级,与系统时钟有关)。
* 入口参数: no 延时控制(uint32),值越大延时越长
* 出口参数: 无
*******************************************************/
//void DelayuS(uint32 no)
//{// uint32 i;
// for(; no>0; no--)
// {
// for(i=0; i<1; i++);
// }
//}
#define DelayuS(s)
/*******************************************************
* 名称: TftSendCom
* 功能: 向TFT液晶模块发送命令字。
* 入口参数: com 命令字(uint16)
* 出口参数: 无
*******************************************************/
void TftSendCom(uint16 com)
{ uint8 data;
OP_IR(); // 发命令
SET_nOE();
CLR_nCS();
data = (com >> 8);
WR_DATA8(data);
CLR_nWE();
DelayuS(2);
SET_nWE();
DelayuS(1);
SET_nCS();
DelayuS(1);
CLR_nCS();
data = com & 0x00FF;
WR_DATA8(data);
CLR_nWE();
DelayuS(2);
SET_nWE();
DelayuS(1);
SET_nCS();
DelayuS(1);
}
/*******************************************************
* 名称: TftSendDat
* 功能: 向TFT液晶模块发送数据。
* 入口参数: dat 待发送的数据(uint16)
* 出口参数: 无
*******************************************************/
void TftSendDat(uint16 dat)
{ uint8 data;
OP_DR(); // 发数据
SET_nOE();
CLR_nCS();
data = (dat >> 8);
WR_DATA8(data);
CLR_nWE();
DelayuS(2);
SET_nWE();
DelayuS(1);
SET_nCS();
DelayuS(1);
CLR_nCS();
data = (dat & 0x00FF);
WR_DATA8(data);
CLR_nWE();
DelayuS(2);
SET_nWE();
DelayuS(1);
SET_nCS();
DelayuS(1);
}
/*******************************************************
* 名称: TftRcvDat
* 功能: 读取TFT液晶模块的数据。
* 入口参数: 无
* 出口参数: 返回值即是读出的数据
*******************************************************/
uint16 TftRcvDat(void)
{ uint16 ret, bak;
FIO3DIR = 0x00000000;
OP_DR(); // 读数据
SET_nWE();
CLR_nCS();
CLR_nOE();
DelayuS(2);
bak = FIO3PIN & 0x000000FF;
ret = (bak << 8);
SET_nOE();
SET_nCS();
DelayuS(1);
CLR_nCS();
CLR_nOE();
DelayuS(2);
bak = FIO3PIN & 0x000000FF;
ret = ret | bak;
SET_nOE();
SET_nCS();
FIO3DIR = 0x000000FF;
DelayuS(1);
return(ret);
}
#else
/*******************************************************
* 名称: TftSendCom
* 功能: 向TFT液晶模块发送命令字。
* 入口参数: com 命令字(uint16)
* 出口参数: 无
*******************************************************/
void TftSendCom(uint16 com)
{ uint8 data;
data = (com >> 8);
S6D0139_IR = data;
data = com & 0x00FF;
S6D0139_IR = data;
}
/*******************************************************
* 名称: TftSendDat
* 功能: 向TFT液晶模块发送数据。
* 入口参数: dat 待发送的数据(uint16)
* 出口参数: 无
*******************************************************/
void TftSendDat(uint16 dat)
{ uint8 data;
data = (dat >> 8);
S6D0139_DR = data;
data = (dat & 0x00FF);
S6D0139_DR = data;
}
/*******************************************************
* 名称: TftRcvDat
* 功能: 读取TFT液晶模块的数据。
* 入口参数: 无
* 出口参数: 返回值即是读出的数据
*******************************************************/
uint16 TftRcvDat(void)
{ uint16 ret, bak;
bak = S6D0139_DR;
ret = (bak << 8);
bak = S6D0139_DR;
ret = ret | bak;
return(ret);
}
#endif // USE_GPIO_BUS
/*******************************************************
* 名称: TftSetAddr
* 功能: 设置数据地址指针(坐标值)。
* 入口参数: x 横坐标的值 (0-239)
* y 纵坐标的值 (0-319)
* 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE
*******************************************************/
uint8 TftSetAddr(uint16 x, uint16 y)
{ TftSendCom(SET_ADDR_X); // 设置地址低8位
TftSendDat(x);
TftSendCom(SET_ADDR_Y); // 设置地址高9位
TftSendDat(y);
if((x<240) && (y<320)) return(TRUE);
else return(FALSE);
}
/*******************************************************
* 名称: TftSetWrite
* 功能: 设置数据地址指针(坐标值),并发送写数据命令。
* 接着不断的写入数据即可,GRAM地址会自动增加。
* 入口参数: x 横坐标的值 (0-239)
* y 纵坐标的值 (0-319)
* 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE
*******************************************************/
uint8 TftSetWrite(uint16 x, uint16 y)
{ uint8 ret;
ret = TftSetAddr(x, y);
TftSendCom(WR_RD_DATA); // 写数据
return(ret);
}
/*******************************************************
* 名称: TftSetWindow
* 功能: 设置数据填充窗口大小。
* 入口参数: x0,y0 窗口左上角从标
* x1,y1 窗口右上角从标
* 出口参数: 设置正确返回TRUE,参数错误返回FALSE
*******************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -