📄 lcddriver.c
字号:
/*
;************************************************************************************************************
;* 北京精仪达盛科技有限公司
;* 研 发 部
;*
;* http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;*
;* 文件名称 : target.c
;* 文件功能 : 该文件为S3C44B0硬件平台配置具体函数的初始化。
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
//#include <stdarg.h>
////#include <stdio.h>
#include "LCDdriver.h"
/*
*************************************************************************************************************
- 配置参数
*************************************************************************************************************
*/
#define M5D(n) ((n) & 0x1fffff)
#define SCR_XSIZE (320)
#define SCR_YSIZE (240)
#define LCD_XSIZE (320)
#define LCD_YSIZE (240)
#define HOZVAL_COLOR (LCD_XSIZE*3/8-1)
#define LINEVAL (LCD_YSIZE-1)
#define MVAL (13)
#define CLKVAL_COLOR (5) //60Mhz
#define MVAL_USED (0)
#define BYTESPERLINE (LCD_XSIZE)
#define XY2OFF(x,y) (tOff)((tOff)y*(tOff)BYTESPERLINE + (x))
typedef unsigned long tOff;
#define READ_MEM(Off, Data) Data = LCD_READ_MEM(Off)
#define WRITE_MEM(Off, Data) LCD_WRITE_MEM(Off, Data)
#define SETPIXEL(x, y, c) SetPixel(x, y, c)
#define GETPIXEL(x, y) GetPixelIndex(x, y)
extern U16 LCD_COLOR;
/*
*************************************************************************************************************
- 函数名称 : U16 LCD_READ_MEM(U32 off)
- 函数说明 : 针对硬件的读点函数
- 输入参数 : x,y,c
- 输出参数 : 无
*************************************************************************************************************
*/
U16 LCD_READ_MEM(U32 off)
{
return (*((U8*)Video_StartBuffer + (off)));
}
/*
*************************************************************************************************************
- 函数名称 : void LCD_WRITE_MEM( U32 off,U8 Data)
- 函数说明 : 针对硬件的画点函数
- 输入参数 : x,y,c
- 输出参数 : 无
*************************************************************************************************************
*/
void LCD_WRITE_MEM( U32 off,U8 Data)
{
(* ((U8*)Video_StartBuffer + (off)) ) = Data;
}
/*
*************************************************************************************************************
- 函数名称 : static void SetPixel(U16 x,U16 y,int c)
- 函数说明 : 针对硬件的画点函数
- 输入参数 : x,y,c
- 输出参数 : 无
*************************************************************************************************************
*/
static void SetPixel(U16 x, U16 y, U32 c)
{
tOff Off = XY2OFF(x,y);
WRITE_MEM(Off, c);
}
/*
*************************************************************************************************************
- 函数名称 : U32 GetPixelIndex(U16 x, U16 y)
- 函数说明 : 针对硬件的得到点的颜色的函数
- 输入参数 : x,y
- 输出参数 : color
*************************************************************************************************************
*/
U32 GetPixelIndex(U16 x, U16 y)
{
U32 col;
U8 Data;
tOff Off = XY2OFF(x,y);
READ_MEM(Off,Data);
col = Data;
return col;
}
/*
*************************************************************************************************************
- 函数名称 : U16 LCD_Init(U8 Lcd_Bpp)
- 函数说明 : LCD硬件初始化函数
- 输入参数 :
- 输出参数 : 无
*************************************************************************************************************
*/
U16 LCD_Init(U8 Lcd_Bpp)
{
switch(Lcd_Bpp)
{
case 8:
// disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x1<<8)|(0x1<<10)|(CLKVAL_COLOR<<12);
//LINEBLANK=10 (without any calculation)
rLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(10<<21);
// 256-color, LCDBANK, LCDBASEU
rLCDSADDR1= (0x3<<27) | ( ((U32)Video_StartBuffer>>22)<<21 )| M5D((U32)Video_StartBuffer>>1);
rLCDSADDR2= M5D((((U32)Video_StartBuffer + (SCR_XSIZE*LCD_YSIZE))>>1)) | (MVAL<<21)|1<<29;
rLCDSADDR3= (LCD_XSIZE/2) | ( ((SCR_XSIZE-LCD_XSIZE)/2)<<9 );
rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
rDITHMODE=0x0;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
rDITHMODE=0x12210;
// enable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
rLCDCON1=(1)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);
break;
default:
return 1;
}
return 0;
}
/*
*************************************************************************************************************
- 函数名称 : void LCD_DrawPixel (U16 x, U16 y)
- 函数说明 : 画点函数
- 输入参数 : x,y
- 输出参数 : 无
*************************************************************************************************************
*/
void LCD_DrawPixel (U16 x, U16 y)
{
SETPIXEL(x, y, LCD_COLOR);
}
/*
*************************************************************************************************************
- 函数名称 : U32 LCD_GetPixel(U16 x, U16 y)
- 函数说明 : 得到点值的函数
- 输入参数 : x,y
- 输出参数 : colof
*************************************************************************************************************
*/
U32 LCD_GetPixel(U16 x, U16 y)
{
return GETPIXEL(x,y);
}
/*
*************************************************************************************************************
- 函数名称 : void LCD_DrawHLine (U16 x0, U16 y, U16 x1)
- 函数说明 : 画水平线函数
- 输入参数 : x,y,x1
- 输出参数 : 无
*************************************************************************************************************
*/
void LCD_DrawHLine (U16 x0, U16 y0, U16 x1)
{
while (x0 <= x1)
{
SETPIXEL(x0, y0, LCD_COLOR);
x0++;
}
}
/*
*************************************************************************************************************
- 函数名称 : void LCD_DrawVLine (U16 x, U16 y0, U16 y1)
- 函数说明 : 画竖直线函数
- 输入参数 : x,y,x1
- 输出参数 : 无
*************************************************************************************************************
*/
void LCD_DrawVLine(U16 x0, U16 y0, U16 y1)
{
while (y0 <= y1)
{
SETPIXEL(x0, y0, LCD_COLOR);
y0++;
}
}
/*
*************************************************************************************************************
- 函数名称 : void LCD_FillRect(U16 x0, U16 y0, U16 x1, U16 y1)
- 函数说明 : 填充矩形函数
- 输入参数 : x0,y0,x1,y1
- 输出参数 : 无
*************************************************************************************************************
*/
void LCD_FillRect(U16 x0, U16 y0, U16 x1, U16 y1)
{
for (; y0 <= y1; y0++)
{
LCD_DrawHLine(x0,y0, x1);
}
}
/*
*************************************************************************************************************
- 函数名称 : DrawBitLine1BPP
- 函数说明 : 绘制位图函数
- 输入参数 : x0,y0,x1,y1
- 输出参数 : 无
*************************************************************************************************************
*/
static void DrawBitLine1BPP(U16 x, U16 y, U8 const*p, U16 Diff, U16 xsize, const U16*pTrans)
{
U16 pixels;
U32 Index0 = *(pTrans + 0);
U32 Index1 = LCD_COLOR;
pixels = *p;
switch (Diff&7)
{
case 0:
goto WriteBit0;
case 1:
goto WriteBit1;
case 2:
goto WriteBit2;
case 3:
goto WriteBit3;
case 4:
goto WriteBit4;
case 5:
goto WriteBit5;
case 6:
goto WriteBit6;
case 7:
goto WriteBit7;
}
WriteBit0:
SETPIXEL(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit1:
SETPIXEL(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit2:
SETPIXEL(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit3:
SETPIXEL(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit4:
SETPIXEL(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit5:
SETPIXEL(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit6:
SETPIXEL(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
if (!--xsize)
return;
WriteBit7:
SETPIXEL(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
if (!--xsize)
return;
x+=8;
pixels = *(++p);
goto WriteBit0;
}
/*
*************************************************************************************************************
- 函数名称 : LCD_L0_DrawBitmap
- 函数说明 : 绘制位图函数
- 输入参数 :
- 输出参数 : 无
*************************************************************************************************************
*/
void LCD_L0_DrawBitmap(U16 x0, U16 y0,U16 xsize, U16 ysize,U16 BitsPerPixel,U16 BytesPerLine,
const U8* pData, U16 Diff,
const U16* pTrans)
{
U16 i;
switch (BitsPerPixel)
{
case 1:
for (i=0; i<ysize; i++)
{
DrawBitLine1BPP(x0, i+y0, pData, Diff, xsize, pTrans);
pData += BytesPerLine;
}
break;
}
}
/*
*****************************************************************************************************************
** 结束文件 **
*****************************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -