⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ks0108.c

📁 本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC上的测试移植代码。 ------------------------------ Menu_Src目录为Menu的源
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
 * Ks0108.C - Ks0108 液晶控制器驱动程序
 *
 *
 * DESCRIPTION: -
 *
 * modification history
 * --------------------
 * 01a, 04/sep/2007, 梁炎昌 written
 * --------------------
 ******************************************************************************/

#include "CPU.H"
#include "Ks0108.H"
#include "Chinese.C"
#include "ASCII.c"

extern void LCD_DrawPixel(int x, int y);

#define GUI_BLACK         0x000000
#define GUI_BLUE          0xFF0000
#define GUI_GREEN         0x00ff00
#define GUI_CYAN          0xffff00
#define GUI_RED           0x0000FF
#define GUI_MAGENTA       0x8b008b
#define GUI_BROWN         0x2a2aa5
#define GUI_DARKGRAY      0x404040
#define GUI_GRAY          0x808080
#define GUI_LIGHTGRAY     0xd3d3d3
#define GUI_LIGHTBLUE     0xff8080
#define GUI_LIGHTGREEN    0x80ff80
#define GUI_LIGHTCYAN     0x80ffff
#define GUI_LIGHTRED      0x8080ff
#define GUI_LIGHTMAGENTA  0xff80ff
#define GUI_YELLOW        0x00ffff
#define GUI_WHITE         0xffffff
#define GUI_INVALID_COLOR 0xfffffff      /* Invalid color - more than 24 bits */





//------------------------------------------------------------------------------------------

/*
-------------------------------------------------------------------------
GUI相关全局变量
-------------------------------------------------------------------------
*/
U8  GUIEnFont = En_8x16;                //英文字体
U8  GUITextMode = MenuGUI_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 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();
}
#endif
extern void  LCDSIM_SetPixelIndex(int x, int y, int Index);
void Display_Locate(unsigned char DisplayData, unsigned char X, unsigned char Y)
{
    unsigned char i;  
    Y = Y*8*2;
    for(i = 0; i < 8; i++){
        if (DisplayData&(1<<i)){
//            GUI_SetColor(GUI_LIGHTRED);
//            LCD_DrawPixel(X*2, Y);
//            LCD_DrawPixel(X*2, Y+1);
//            LCD_DrawPixel(X*2+1, Y);
//            LCD_DrawPixel(X*2+1, Y+1);
	    GUI_X_Lock();   
//	    LCDSIM_SetPixelIndex(X,Y,GUI_LIGHTRED);
        LCDSIM_SetPixelIndex(X*2, Y,GUI_LIGHTRED);
        LCDSIM_SetPixelIndex(X*2, Y+1,GUI_LIGHTRED);
        LCDSIM_SetPixelIndex(X*2+1, Y,GUI_LIGHTRED);
        LCDSIM_SetPixelIndex(X*2+1, Y+1,GUI_LIGHTRED);
        
	    GUI_X_Unlock();

            Y = Y+2;
        }else {
//            GUI_SetColor(GUI_LIGHTGREEN);
//            LCD_DrawPixel(X*2, Y);
//            LCD_DrawPixel(X*2, Y+1);
//            LCD_DrawPixel(X*2+1, Y);
//            LCD_DrawPixel(X*2+1, Y+1);
//	    LCDSIM_SetPixelIndex(X,Y,GUI_LIGHTGREEN);
	    GUI_X_Lock();   
            LCDSIM_SetPixelIndex(X*2, Y,GUI_LIGHTGREEN);
            LCDSIM_SetPixelIndex(X*2, Y+1,GUI_LIGHTGREEN);
            LCDSIM_SetPixelIndex(X*2+1, Y,GUI_LIGHTGREEN);
            LCDSIM_SetPixelIndex(X*2+1, Y+1,GUI_LIGHTGREEN);
        GUI_X_Unlock();    
            Y = Y+2;
        }            
    }
}
void Display_Clear(void)
{
unsigned char i;
unsigned char j;
//GUI_SetColor(GUI_BLUE);
for(j = 0; j < 8; j++){
    for(i = 0; i < 128; i++){
        Display_Locate(0, i,j);
    }
}
}

/*
*****************************************************************************
* 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)){//未检索到的汉字,显示个"##"提示吧
            MenuGUI_DispCharAt('#',x0,y0);
            MenuGUI_DispCharAt('#',x0+Char_XSIZE,y0);
            return;
        }
    }
//----------------------------------
    switch (GUITextMode) {
        case MenuGUI_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 MenuGUI_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 MenuGUI_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++;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -