?? lcddriver.c
字號:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:通過操作S1D13503,控制256色RGB偽彩液晶顯示屏。
* 說明:使用LPC2200芯片控制,8位總線接口。
* S1D13503的寄存器地址為0x838000xx,顯示存儲器的地址為0x834xxxxx。
* 作者:黃紹斌
* 日期:2005.05.26
****************************************************************************************/
#include "config.h"
/* 定義顯示緩沖區(可根據情況定義或直接使用LCM顯示存儲空間) */
TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX];
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。320*240 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++; // 指向下一寄存器
}
}
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。
* 入口參數:無
* 出口參數:無
* 說明:使用
****************************************************************************/
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]; // 設置藍色調色板
}
}
/***********************************************************************
* 名稱:LCD_Initialize()
* 功能:LCM初始化。將LCM初始化為純圖形模式,顯示起始地址為0x0000。
* 入口參數:無
* 出口參數:無
* 說明:
***********************************************************************/
void LCD_Initialize(void)
{ S1D13503_Init(); // 初始化LCM工作模式
S1D13503_LutInit(); // 初始化調色板
}
/***********************************************************************
* 名稱:LCD_FillAll()
* 功能:LCD填充。以圖形方式進行填充,起始地址為0x0000。
* 入口參數:dat 要填充的顏色數據
* 出口參數:無
***********************************************************************/
void LCD_FillAll(TCOLOR dat)
{ volatile uint16 *DAT_Point;
uint32 i, j;
/* 開始復制填充數據 */
DAT_Point = (void *) S1D13503_DAT; // 置地址指針
for(i=0; i<GUI_LCM_YMAX; i++) // 歷遍所有行
{ for(j=0; j<GUI_LCM_XMAX; j++) // 歷遍所有行
{ *DAT_Point++ = dat;
}
}
}
/****************************************************************************
* 名稱:LCD_UpdatePoint()
* 功能:在指定位置上畫點,刷新某一點。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* 出口參數:無
* 說明:操作失敗原因是指定地址超出有效范圍。
****************************************************************************/
void LCD_UpdatePoint(uint32 x, uint32 y)
{ volatile uint16 *DAT_Point;
uint32 addr;
uint32 x1, y1;
x1 = GUI_LCM_XMAX - x - 1; // 對于9111屏有效
y1 = GUI_LCM_YMAX - y - 1; // 對于9111屏有效
/* 找出目標地址 */
addr = y1*GUI_LCM_XMAX + x1;
DAT_Point = (void *) S1D13503_DAT;
DAT_Point += addr;
*DAT_Point = gui_disp_buf[y][x]; // 輸出數據
}
/****************************************************************************
* 與LCM相關的GUI接口函數
****************************************************************************/
/****************************************************************************
* 名稱:GUI_FillSCR()
* 功能:全屏填充。直接使用數據填充顯示緩沖區。
* 入口參數:dat 填充的數據
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_FillSCR(TCOLOR dat)
{ uint32 i, j;
/* 填充緩沖區 */
for(i=0; i<GUI_LCM_YMAX; i++) // 歷遍所有行
{ for(j=0; j<GUI_LCM_XMAX; j++) // 歷遍所有行
{ gui_disp_buf[i][j] = dat;
}
}
/* 填充LCM */
LCD_FillAll(dat);
}
/****************************************************************************
* 名稱:GUI_Initialize()
* 功能:初始化GUI,包括初始化顯示緩沖區,初始化LCM并清屏。
* 入口參數:無
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_Initialize(void)
{ LCD_Initialize(); // 初始化LCM模塊工作模式,純圖形模式
GUI_FillSCR(0x00); // 初始化緩沖區為0x00,并輸出屏幕(清屏)
}
/****************************************************************************
* 名稱:GUI_ClearSCR()
* 功能:清屏。
* 入口參數:無
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_ClearSCR(void)
{ GUI_FillSCR(0x00);
}
/****************************************************************************
* 名稱:GUI_Point()
* 功能:在指定位置上畫點。
* 入口參數: x 指定點所在列的位置
* y 指定點所在行的位置
* color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
* 出口參數:返回值為1時表示操作成功,為0時表示操作失敗。(操作失敗原因是指定地址超出有
* 效范圍)
* 說明:用戶根據LCM的實際情況編寫此函數。對于單色,只有一個位有效,則要使用左移的方法
* 實現point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位數的一樣
* 處理。
****************************************************************************/
uint8 GUI_Point(uint32 x, uint32 y, TCOLOR color)
{ /* 參數過濾 */
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
/* 設置緩沖區相應的點 */
gui_disp_buf[y][x] = color;
/* 刷新顯示 */
LCD_UpdatePoint(x, y);
return(1);
}
/****************************************************************************
* 名稱:GUI_ReadPoint()
* 功能:讀取指定點的顏色。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* ret 保存顏色值的指針
* 出口參數:返回0時表示指定地址超出有效范圍。
* 說明:對于單色,設置ret的d0位為1或0,4級灰度則為d0、d1有效,8位RGB則d0--d7有效,
* RGB結構則R、G、B變量有效。
****************************************************************************/
int GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret)
{ /* 參數過濾 */
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
/* 取得該點顏色(用戶自行更改) */
*ret = gui_disp_buf[y][x];
return(1);
}
/****************************************************************************
* 名稱:GUI_HLine()
* 功能:畫水平線。
* 入口參數: x0 水平線起點所在列的位置
* y0 水平線起點所在行的位置
* x1 水平線終點所在列的位置
* color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
* 出口參數:無
* 說明:對于單色、4級灰度的液晶,可通過修改此函數作圖提高速度,如單色LCM,可以一次更
* 新8個點,而不需要一個點一個點的寫到LCM中。
****************************************************************************/
void GUI_HLine(uint32 x0, uint32 y0, uint32 x1, TCOLOR color)
{ uint32 bak;
if(x0>x1) // 對x0、x1大小進行排列,以便畫圖
{ bak = x1;
x1 = x0;
x0 = bak;
}
do
{ GUI_Point(x0, y0, color); // 逐點顯示,描出垂直線
x0++;
}while(x1>=x0);
}
/****************************************************************************
* 名稱:GUI_RLine()
* 功能:畫垂直線。
* 入口參數: x0 垂直線起點所在列的位置
* y0 垂直線起點所在行的位置
* y1 垂直線終點所在行的位置
* color 顯示顏色
* 出口參數:無
* 說明:對于單色、4級灰度的液晶,可通過修改此函數作圖提高速度,如單色LCM,可以一次更
* 新8個點,而不需要一個點一個點的寫到LCM中。
****************************************************************************/
void GUI_RLine(uint32 x0, uint32 y0, uint32 y1, TCOLOR color)
{ uint32 bak;
if(y0>y1) // 對y0、y1大小進行排列,以便畫圖
{ bak = y1;
y1 = y0;
y0 = bak;
}
do
{ GUI_Point(x0, y0, color); // 逐點顯示,描出垂直線
y0++;
}while(y1>=y0);
}
/****************************************************************************
* 名稱:GUI_CmpColor()
* 功能:判斷顏色值是否一致。
* 入口參數:color1 顏色值1
* color2 顏色值2
* 出口參數:返回1表示相同,返回0表示不相同。
* 說明:由于顏色類型TCOLOR可以是結構類型,所以需要用戶編寫比較函數。
****************************************************************************/
//int GUI_CmpColor(TCOLOR color1, TCOLOR color2)
//{ if(color1==color2) return(1);
// else return(0);
//}
/****************************************************************************
* 名稱:GUI_CopyColor()
* 功能:顏色值復制。
* 入口參數:color1 目標顏色變量
* color2 源顏色變量
* 出口參數:無
* 說明:由于顏色類型TCOLOR可以是結構類型,所以需要用戶編寫復制函數。
****************************************************************************/
//void GUI_CopyColor(TCOLOR *color1, TCOLOR color2)
//{ *color1 = color2;
//}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -