📄 lcddrive.c
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:通过操作S1D13503,控制256色RGB伪彩液晶显示屏。
* 说明:使用LPC2200芯片控制,8位总线接口。
* S1D13503的寄存器地址为0x838000xx,显示存储器的地址为0x834xxxxx。
* 作者:黄绍斌
* 日期:2005.05.26
****************************************************************************************/
#include "lpc2294.h"
#include "lcddrive.h"
// 定义S1D13503控制地址
#define S1D13503_REG 0x83800000
#define S1D13503_DAT 0x83400000
// S1D13503配置设置值
uint8 const INIT_TAB[14] = { 0x00, // 寄存器0 -- 00000000B (正常工作模式,即非测试模式)
0xBD, // 寄存器1 -- 10111101B (模式控制:打开显示,单屏,屏蔽XSCL水平非显示周期输出,使能LCDENB,彩色8位LCD数据--无XCSL2,16位显示存储数据总线方式)
159, // 寄存器2 -- 159 (行字节控制)(每行显示占用的存储器字节数,即列参数)
0x0E, // 寄存器3 -- 00001110B (非节功模式,256彩色方式)
239, // 寄存器4 -- 239 (总行数)
0, // 寄存器5 -- 0 (WF翻转周期,为0时表示每一帧WF输出翻转一次)
0x00, // 寄存器6 -- 00H (第一屏显示RAM地址低8位)
0x00, // 寄存器7 -- 00H (第一屏显示RAM地址高8位)
0x00, // 寄存器8 -- 00H (第二屏显示RAM地址低8位)
0x00, // 寄存器9 -- 00H (第二屏显示RAM地址高8位)
239, // 寄存器A -- 239 (显示一区占用行数)
0, // 寄存器B -- 0 (显示一区占用行数,高2位)
10, // 寄存器C -- 10 (水平默认不显示周期)
0 // 寄存器D -- 0 (显示域冗余宽度,正常操作模式)
};
/****************************************************************************
* 名称:S1D13503_Init()
* 功能:初始化S1D13503。320x240 256色单屏彩屏。
* 入口参数:无
* 出口参数:无
* 说明:本子程序对S1D13503寄存器0--D进行初始化(使用查表方法)
****************************************************************************/
void S1D13503_Init(void)
{ volatile uint16 *REG_Point;
uint8 i;
REG_Point = (void *) S1D13503_REG;
for(i=0; i<14; i++) // 共初始化14个寄存器
{ *REG_Point = INIT_TAB[i]; // 查表取出数据,然后赋值给S1D13503相应的寄存器,实现初始化
REG_Point++; // 指向下一寄存器
}
}
// S1D13503调色板设置值
uint8 const LUT_RED_TAB[16] = { 0, 3, 5, 7, 9, 11, 13, 15,
0, 3, 5, 7, 9, 11, 13, 15
};
uint8 const LUT_GRN_TAB[16] = { 0, 3, 5, 7, 9, 11, 13, 15,
0, 3, 5, 7, 9, 11, 13, 15
};
uint8 const LUT_BLU_TAB[16] = { 0, 6, 10, 15,
0, 6, 10, 15,
0, 6, 10, 15,
0, 6, 10, 15
};
/****************************************************************************
* 名称:S1D13503_LutInit()
* 功能:初始化S1D13503的调色板,红、绿基色设置为0、3、5、7、9、11、13、15,
* 蓝基色设置为0、6、10、15。
* 入口参数:无
* 出口参数:无
* 说明:使用液晶屏之前要初始化S1D13503的调色板
****************************************************************************/
void S1D13503_LutInit(void)
{ volatile uint16 *REG_Point1;
volatile uint16 *REG_Point2;
uint8 i;
REG_Point1 = (void *) S1D13503_REG;
REG_Point1 += 0x0E;
REG_Point2 = (void *) S1D13503_REG;
REG_Point2 += 0x0F;
for(i=0; i<16; i++)
{ *REG_Point1 = i; // 设置为自动更换存取方式,设置地址
*REG_Point2 = LUT_RED_TAB[i]; // 设置红色调色板
*REG_Point2 = LUT_GRN_TAB[i]; // 设置绿色调色板
*REG_Point2 = LUT_BLU_TAB[i]; // 设置蓝色调色板
}
}
/****************************************************************************
* 名称:ScreenFill()
* 功能:屏幕填充。屏幕大小为320x240。
* 入口参数:dat 要填充的数据
* 出口参数:无
* 说明:直接对显存进行操作。使用前要初始化好驱动器及调色板。
****************************************************************************/
void ScreenFill(uint8 dat)
{ volatile uint16 *DAT_Point;
uint32 i;
DAT_Point = (void *) S1D13503_DAT;
for(i=0; i<GUI_LCM_XMAX*GUI_LCM_YMAX; i++) // 填充字节数为GUI_LCM_XMAX*GUI_LCM_YMAX
{ *DAT_Point = dat;
DAT_Point++;
}
}
// 定义总线速度控制字
#define BCFG_DEF 0x10000400
#define IDCY (0x07<<0)
#define WST1 (0x0f<<5)
#define WST2 (0x0f<<11)
#define BCFG3_SET (BCFG_DEF | IDCY | WST1 | WST2)
/*******************************************************
* 名称: LCM_Init
* 功能: 初始化液晶模块,然后清屏。
* 入口参数: 无
* 出口参数: 无
*******************************************************/
void LCM_Init(void)
{ BCFG3 = BCFG3_SET; // 总线速度控制
S1D13503_Init(); // 初始化S1D13503工作模式
S1D13503_LutInit(); // 初始化S1D13503的调色板
ScreenFill(0x00);
}
/*******************************************************
* 名称: LCM_UpdateRects
* 功能: 更新液晶显示区域。更新数据在Framebuffer中。
* 入口参数: x,y 更新区域的起始点
* w,y 区域宽度和高度
* buffer Framebuffer起始地址
* 出口参数: 无
*******************************************************/
void LCM_UpdateRects( int x, int y, int w, int h, uint8 *buffer )
{ int i, j;
uint8 *addr; // 显示数据指针
volatile uint16 *DAT_Point;
uint32 lcm_addr; // 液晶显示地址
// 需填充区域参数过滤
if(x<0)
{ w = w + x;
x = 0;
}
if(y<0)
{ h = h + y;
y = 0;
}
if( x > (GUI_LCM_XMAX-1) ||
y > (GUI_LCM_YMAX-1)
)
{ return;
}
if((x+w) > (GUI_LCM_XMAX-1))
{ w = GUI_LCM_XMAX - x;
}
if((y+h) > (GUI_LCM_YMAX-1))
{ h = GUI_LCM_YMAX - y;
}
if((w<=0) || (h<=0)) return;
// 更新显示数据
for(i=0; i<h; i++) // 输出h行数据
{ // 计算出更新区域的buffer地址
addr = buffer + (y*GUI_LCM_XMAX + x);
// 输出一行(w)数据
lcm_addr = y*GUI_LCM_XMAX + x;
DAT_Point = (void *) S1D13503_DAT;
DAT_Point += lcm_addr;
for(j=0; j<w; j++)
{ *DAT_Point = *addr; // 输出数据
addr++;
DAT_Point++;
}
// 指向下一行
y++;
} // end of for(i=0; i<h; i++)...
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -