?? ks0108.c
字號:
/******************************************************************************
* Ks0108.C - Ks0108 液晶控制器驅動程序
*
*
* DESCRIPTION: -
*
* modification history
* --------------------
* 01a, 04/sep/2007, 梁炎昌 written
* --------------------
******************************************************************************/
#include "CPU.H"
#include "Ks0108.H"
#include "Chinese.C"
#include "ASCII.c"
//------------------------------------------------------------------------------------------
/*
-------------------------------------------------------------------------
GUI相關全局變量
-------------------------------------------------------------------------
*/
U8 GUIEnFont = En_8x16; //英文字體
U8 GUITextMode = GUI_TEXTMODE_NORMAL; //顯示模式
U8 Char_XSIZE; //英文字體X寬度
U8 Char_YSIZE; //英文字體Y寬度
U8 PosX = 0; //當前系統X坐標
U8 PosY = 0; //當前系統Y坐標
U8 NoXY = true;//是否使用PosX PosY的標志 1-->不使用 0-->使用
// ---- 延遲程序 ----------------------------------------------------
#if OSC_48MHZ == true
#define SomeNop(); { \
_nop_(); _nop_(); _nop_(); _nop_(); \
_nop_(); _nop_(); _nop_(); _nop_(); \
}
#elif OSC_24MHZ == true
#define SomeNop(); { \
_nop_(); _nop_(); _nop_(); _nop_(); \
}
#endif
/*
*****************************************************************************
* WriteCommand_0108 - 寫命令到KS0108
* DESCRIPTION: -
* 本函數不接管片選信號
* @Param CmdData:命令碼
* @Return :
* ----
*****************************************************************************
*/
void WriteCommand_0108(U8 CmdData)
{
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 0;
LCD_Bus = CmdData;
SomeNop();
LCD_E = 1;
SomeNop();
LCD_E = 0;
}
/*
*****************************************************************************
* WriteData_0108 - 寫數據到KS0108
* DESCRIPTION: -
* 本函數不接管片選信號
* @Param Data:寫入的數據
* @Return :
* ----
*****************************************************************************
*/
void WriteData_0108(U8 Data)
{
LCD_E = 0;
LCD_RS = 1;
LCD_RW = 0;
LCD_Bus = Data;
SomeNop();
LCD_E = 1;
SomeNop();
LCD_E = 0;
}
/*-------------------讀LCD數據----------------------------*/
#if 0
U8 ReadData_0108(void)
{ U8 Temp;
LCD_Bus = 0xFF;//切換成輸入
LCD_RS = 1;
LCD_RW = 1;
SomeNop();
LCD_E = 1;
SomeNop();
Temp = LCD_Bus;
return(Temp);
/*
U8 Temp;
PIN_KS0108_Di_HIGH;
PIN_KS0108_RW_HIGH;
DelayS(0);
PIN_KS0108_Enable_HIGH;
DelayS(0);
PIN_KS0108_Enable_LOW;
Temp = PIN_KS0108_Lcd_InBus;
return (Temp);
*/
}
U8 ReadState_0108(void)
{
U8 Temp;
LCD_Bus = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
SomeNop();
LCD_E = 1;
SomeNop();
LCD_E = 0;
Temp = LCD_Bus;
return (Temp);
}
U8 Busy(void)
{
U16 TimeOut;
U8 Flag;
TimeOut = 200;
do{
Flag = ReadState_0108();
LED1 ^= 0x01;
if (TimeOut-- == 0){
return 0;
}
}while(Flag &0x80);
return 1;
}
#endif
//Option = 1 --->Disp On
//Option = 0 --->Disp Off
void KS0108_DisplayOn(U8 Option)
{
if (Option == 1) {
WriteCommand_0108(Ks0108_CMD_Disp_ON);
}else{
WriteCommand_0108(Ks0108_CMD_Disp_OFF);
}
}
void KS0108_SetStartRow(U8 Row)
{
WriteCommand_0108(Ks0108_CMD_Disp_Start_Line + Row);
}
/*
*****************************************************************************
* Display_Locate - LCD上指定位置 顯示指定數據
* DESCRIPTION: -
*
* @Param x0:0--191橫向坐標
* @Param y0:0--7 縱向坐標
* @Param DisplayData:寫入的數據
* @Return :
* ----
*****************************************************************************
*/
void Display_Locate(U8 DisplayData, U8 x0, U8 y0)
{
if ((x0 <= (LCD_XSIZE-1))&(y0 <= (LCD_YSIZE-1))){
if (x0 <= 63){ //0--191
LCD_CSA();
// Busy();//判忙
WriteCommand_0108(Ks0108_CMD_Set_Addr + x0);
} else if (x0 <= 127){
LCD_CSB();
// Busy();//判忙
WriteCommand_0108(Ks0108_CMD_Set_Addr + x0 - 64);
} else if (x0 <= 191){
LCD_CSC();
// Busy();//判忙
WriteCommand_0108(Ks0108_CMD_Set_Addr + x0 -128);
}
// Busy();//判忙
WriteCommand_0108(y0 + Ks0108_CMD_Set_Page); //0--7
// Busy();//判忙
WriteData_0108(DisplayData);
LCD_CS_None();//不再片選任何一個Ks0108
}
}
/*
*****************************************************************************
* Display_Clear - 清空LCD顯示
* DESCRIPTION: -
*
* @Param void:
* @Return :
* ----
*****************************************************************************
*/
void Display_Clear(void)
{
U8 j,k;
//--------------------------------------
LCD_CSA();
for(k = 0; k < 8; k++){
WriteCommand_0108(0 + Ks0108_CMD_Set_Addr); //0--7
WriteCommand_0108(k + Ks0108_CMD_Set_Page); //0--63
for(j = 0;j < 64;j++){
WriteData_0108(0x00);
}
}
KS0108_SetStartRow(0);
//--------------------------------------
LCD_CSB();
for(k = 0; k < 8; k++){
WriteCommand_0108(0 + Ks0108_CMD_Set_Addr); //0--7
WriteCommand_0108(k + Ks0108_CMD_Set_Page); //0--63
for(j = 0;j < 64;j++){
WriteData_0108(0x00);
}
}
KS0108_SetStartRow(0);
//-------------------------------------
LCD_CSC();
for(k = 0; k < 8; k++){
WriteCommand_0108(0 + Ks0108_CMD_Set_Addr);//0--7
WriteCommand_0108(k + Ks0108_CMD_Set_Page);//0-63
for(j = 0;j < 64;j++){
WriteData_0108(0x00);
}
}
KS0108_SetStartRow(0);
//-------------------------------------
LCD_CS_None();
}
/*
*****************************************************************************
* Display_Init - 初始化LCD
* DESCRIPTION: -
*
* @Param void:
* @Return :
* ----
*****************************************************************************
*/
void Display_Init(void)
{
//---------------------------
LCD_CSA();
KS0108_DisplayOn(0);
KS0108_SetStartRow(0);
KS0108_DisplayOn(1);
//---------------------------
LCD_CSB();
KS0108_DisplayOn(0);
KS0108_SetStartRow(0);
KS0108_DisplayOn(1);
//---------------------------
LCD_CSC();
KS0108_DisplayOn(0);
KS0108_SetStartRow(0);
KS0108_DisplayOn(1);
//---------------------------
LCD_CS_None();
}
/*
*****************************************************************************
* Display_Chinese - 指定位置顯示一個16x16的漢字
* DESCRIPTION: -
*
* @Param x0:X軸坐標0--(192-16)
* @Param y0:Y軸坐標0--(8-2)
* @Param UniCode:漢字內碼
* @Return :
* ----
*****************************************************************************
*/
void Display_Chinese(U16 UniCode, U8 x0, U8 y0)
{
U16 CodeID;
U8 i, ImgData;
U8 HZ_X = x0;
// 在字庫里搜索漢字
for(CodeID=0; CodeID < hzNum; CodeID++){
// 找到 指定漢字的 Index 后, 跳出循環
if ( (hzIndex[2*CodeID] == UniCode/256) && (hzIndex[2*CodeID+1] == UniCode%256) ){
break;
}else if(CodeID == (hzNum-1)){//未檢索到的漢字,顯示個"##"提示吧
GUI_DispCharAt('#',x0,y0);
GUI_DispCharAt('#',x0+Char_XSIZE,y0);
return;
}
}
//----------------------------------
switch (GUITextMode) {
case GUI_TEXTMODE_NORMAL :
//-------------------------------------------------------------------------
// 寫漢字的上半部分 (一個漢字 32 個字節, 顯示為2行 * 16列)
for(i=0; i<16; i++){
ImgData = hzdot[i+CodeID*32];
Display_Locate(ImgData, HZ_X, y0);
HZ_X++;
}
// 寫漢字的下半部分
HZ_X = x0;
for(i=16; i<32; i++){
ImgData = hzdot[i+CodeID*32];
Display_Locate(ImgData, HZ_X, y0 + 1);
HZ_X++;
}
//-------------------------------------------------------------------------
break;
case GUI_TEXTMODE_REVERSE :
//-------------------------------------------------------------------------
// 寫漢字的上半部分 (一個漢字 32 個字節, 顯示為2行 * 16列)
for(i=0; i<16; i++){
ImgData = hzdot[i+CodeID*32]^0xFF;
Display_Locate(ImgData, HZ_X, y0);
HZ_X++;
}
// 寫漢字的下半部分
HZ_X = x0;
for(i=16; i<32; i++){
ImgData = hzdot[i+CodeID*32]^0xFF;
Display_Locate(ImgData, HZ_X, y0 + 1);
HZ_X++;
}
//-------------------------------------------------------------------------
break;
case GUI_TEXTMODE_UNDERLINE :
//-------------------------------------------------------------------------
// 寫漢字的上半部分 (一個漢字 32 個字節, 顯示為2行 * 16列)
for(i=0; i<16; i++){
ImgData = hzdot[i+CodeID*32];
Display_Locate(ImgData, HZ_X, y0);
HZ_X++;
}
// 寫漢字的下半部分
HZ_X = x0;
for(i=16; i<32; i++){
ImgData = hzdot[i+CodeID*32]|0x80;
Display_Locate(ImgData, HZ_X, y0 + 1);
HZ_X++;
}
//-------------------------------------------------------------------------
break;
default :
break;
}
}
/*
*****************************************************************************
* Display_ASCII - 顯示一個ASCII
* DESCRIPTION: -
*
* @Param X:X軸坐標 0--192 (注意邊界)
* @Param Y:Y軸坐標 0-- 7 (注意邊界)
* @Param Char:ASCII碼
* @Return :
* ----
*****************************************************************************
*/
void Display_ASCII(U8 Char, U8 X, U8 Y)
{
U8 i, ImgData;
U8 HZ_X = X;
if(GUIEnFont == En_5x8){
Display_Locate(0x00, HZ_X, Y);
HZ_X++;
for(i = 0; i < 5; i++){
ImgData = chardot_5x8[i+(Char-0x20)*5];
Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
Display_Locate(0x00, HZ_X, Y);
HZ_X++;
Display_Locate(0x00, HZ_X, Y);
} else {
for(i=0;i<8;i++){
ImgData = chardot_8x16[i+(Char-0x20)*16];
Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
HZ_X=X;
for(i=8;i<16;i++){
ImgData = chardot_8x16[i+(Char-0x20)*16];
Display_Locate(ImgData, HZ_X, Y + 1);
HZ_X++;
}
}
}
/*
*****************************************************************************
* Display_InvASCII - 反顯示ASCII
* DESCRIPTION: -
*
* @Param X:X軸坐標 0--191
* @Param Y:Y軸坐標 0--7
* @Param Char:ASCII碼
* @Return :
* ----
*****************************************************************************
*/
void Display_InvASCII(U8 Char, U8 X, U8 Y)
{
U8 i, ImgData;
U8 HZ_X = X;
if(GUIEnFont == En_5x8){
Display_Locate(0xFF, HZ_X, Y);
HZ_X++;
for(i = 0; i < 5; i++){
ImgData = chardot_5x8[i+(Char-0x20)*5]^0xFF;
Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
Display_Locate(0xFF, HZ_X, Y);
HZ_X++;
Display_Locate(0xFF, HZ_X, Y);
} else {
for(i=0;i<8;i++){
ImgData = chardot_8x16[i+(Char-0x20)*16] ^ 0xFF;
Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
HZ_X=X;
for(i=8;i<16;i++){
ImgData = chardot_8x16[i+(Char-0x20)*16] ^ 0xFF;
Display_Locate(ImgData, HZ_X, Y + 1);
HZ_X++;
}
}
}
/*
*****************************************************************************
* Display_ASCII_UnderLine - 顯示一個帶有下劃線的ASCII
* DESCRIPTION: -
*
* @Param X:X軸坐標
* @Param Y:Y軸坐標
* @Param Char:ASCII碼
* @Return :
* ----
*****************************************************************************
*/
void Display_ASCII_UnderLine(U8 Char, U8 X, U8 Y)
{
//U16 Position;
U8 i, ImgData;
U8 HZ_X = X;
if(GUIEnFont == En_5x8){
Display_Locate(0x80, HZ_X, Y);
HZ_X++;
for(i = 0; i < 5; i++){
ImgData = chardot_5x8[i+(Char-0x20)*5] | 0x80;
Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
Display_Locate(0x80, HZ_X, Y);
HZ_X++;
Display_Locate(0x80, HZ_X, Y);
} else {
for(i=0;i<8;i++){
ImgData = chardot_8x16[i+(Char-0x20)*16];
Display_Locate(ImgData, HZ_X, Y);
HZ_X++;
}
HZ_X=X;
for(i=8;i<16;i++){
ImgData = chardot_8x16[i+(Char-0x20)*16] | 0x80;
Display_Locate(ImgData, HZ_X, Y + 1);
HZ_X++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -