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

📄 ks0108.c

📁 本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC上的测试移植代码。 ------------------------------ Menu_Src目录为Menu的源
💻 C
📖 第 1 页 / 共 3 页
字号:
        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++;
        }
    }
}

/*
----------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------
*/
#if 0
/*
----------------------------------------------------------------------------------------------
//移动当前Y坐标
----------------------------------------------------------------------------------------------
*/
void MenuGUI_GotoY(U8 y)
{
    if (y > 7) {
        PosY = 7;
    } else {
        PosY = y;
    }
}
/*
----------------------------------------------------------------------------------------------
//移动当前Y坐标
----------------------------------------------------------------------------------------------
*/
void MenuGUI_GotoX(U8 x)
{
    if (x > 127) {
        PosX = 127;
    } else {
        PosX = x;
    }
}
/*
*****************************************************************************
* MenuGUI_GotoXY - 系统光标移动到指定位置
* DESCRIPTION: -
*
* @Param y:Y轴坐标
* @Param x:X轴坐标
* @Return :
* ----
*****************************************************************************
*/
void MenuGUI_GotoXY(U8 x,U8 y)
{
    MenuGUI_GotoX(x);
    MenuGUI_GotoY(y);
}

#endif
/*
*****************************************************************************
* MenuGUI_SetTextMode - 设置文字显示模式
* DESCRIPTION: -
*
* @Param TextMode:模式代码
* @Return :模式代码
* ----
*****************************************************************************
*/

U8 MenuGUI_SetTextMode(U8 TextMode)
{
    GUITextMode = TextMode;
    return GUITextMode;
}

/*
*****************************************************************************
* MenuGUI_SetEnFont - 设置显示的英文字体
* DESCRIPTION: -
* 目前支持两种字体8x16 5x8
* @Param EnFont:字体代码
* @Return :
* ----
*****************************************************************************
*/
void MenuGUI_SetEnFont(U8 EnFont)
{
  if (EnFont == En_5x8){
    GUIEnFont = En_5x8;
    Char_XSIZE = En_5x8_XSIZE;
    Char_YSIZE = En_5x8_YSIZE;
  } else {
    GUIEnFont = En_8x16;
    Char_XSIZE = En_8x16_XSIZE;
    Char_YSIZE = En_8x16_YSIZE;

  }

}
/*
----------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------
*/
void MenuGUI_Delay(U16 Period)
{
    U8 j;
    for (;  Period>0 ; Period--) {
        for (j = 0; j < 200; j++) {
        }
    }
}
/*
*****************************************************************************
* MenuGUI_DispCharAt - 指定位置显示一个ASCII码
* DESCRIPTION: - 字体使用是系统设定的字体
*
* @Param x:X轴坐标
* @Param y:Y轴坐标
* @Param c:ASCII码
* @Return :
* ----
*****************************************************************************
*/
void MenuGUI_DispCharAt(U8 c, U8 x, U8 y)
{
    switch (GUITextMode) {
        case MenuGUI_TEXTMODE_NORMAL :
             Display_ASCII(c, x, y);
             break;
        case MenuGUI_TEXTMODE_REVERSE :
             Display_InvASCII(c, x, y);
             break;
        case MenuGUI_TEXTMODE_UNDERLINE :
             Display_ASCII_UnderLine(c, x, y);
             break;
        default :
             break;
    }
}
/*
----------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------
*/
#if 0
void MenuGUI_DispChar(U8 c)
{
    MenuGUI_DispCharAt(c, PosX, PosY);
    PosX += 8;
}
#endif
/*
*****************************************************************************
* MenuGUI_Init - 初始化GUI显示
* DESCRIPTION: -
*
* @Param void:
* @Return :
* ----
*****************************************************************************
*/
void MenuGUI_Init(void)
{
    Display_Init();
    GUIEnFont = En_8x16;
    GUITextMode = MenuGUI_TEXTMODE_NORMAL;
    Char_XSIZE = En_8x16_XSIZE;
    Char_YSIZE = En_8x16_YSIZE;
    PosX = 0;
    PosY = 0;
    NoXY = true;


}
void MenuGUI_Clear(void)
{
    Display_Clear();
}
#if 0
void MenuGUI_DispCEOL(void)
{
    U8 i;
    for(i = PosX; i <= LCD_XSIZE-8; i += 8) {
        MenuGUI_DispCharAt(' ', i, PosY);

    }
}
#endif
/*
*****************************************************************************
* MenuGUI_DispStringAt - 指定位置显示一个字符串
* DESCRIPTION: -
* 支持中英混合 当中英混合时英文字体强制为8x16 如果单单英文 按照设定字体
* @Param x0:X轴坐标
* @Param y0:Y轴坐标
* @Param s:字符串
* @Return :
* ----
*****************************************************************************
*/
//void MenuGUI_DispStringAt(U8 _CONST_ *s,U8 x0,U8 y0)
void MenuGUI_DispStringAt(U8 *s,U8 x0,U8 y0)
{
    U8 i;
    if (NoXY == false){//没有提供坐标,则使用系统坐标
        x0 = PosX;
        y0 = PosY;
    }
    i = 0;
    while(s[i]!='\0'){
        if (s[i] < 0x80) {//是ASCII
             if(s[i] == '\n'){
                    x0 = 0;
                    y0 += Char_YSIZE;
             } else {
                if (x0 > (LCD_XSIZE-1)) {//换行
                    x0 = 0;
                    y0 += Char_YSIZE;
                }
                switch (GUITextMode) {
                    case MenuGUI_TEXTMODE_NORMAL :
                         Display_ASCII(s[i], x0, y0);
                         break;
                    case MenuGUI_TEXTMODE_REVERSE :
                         Display_InvASCII(s[i], x0, y0);
                         break;
                    case MenuGUI_TEXTMODE_UNDERLINE :
                         Display_ASCII_UnderLine(s[i], x0, y0);
                         break;
                    default :
                         break;
                }
                x0 += Char_XSIZE;
             }
        } else {//是中文
            if (x0 > LCD_XSIZE-16){
                x0 = 0;
                y0 += Chinese_YSIZE;
            }
            Display_Chinese(s[i]*256+s[i+1],x0,y0);//中文
            i++;
            x0 += Chinese_XSIZE;
       }
       s++;
    }
    if (NoXY == false){
        PosX = x0;
        PosY = y0;
    }

}
#if 0
/*
*****************************************************************************
* MenuGUI_DispString - 在当前系统坐标下显示字符串
* DESCRIPTION: -
* 除了坐标不能指定外 功能跟MenuGUI_DispStringAt一致
* @Param s:字符串
* @Return :
* ----
*****************************************************************************
*/
void MenuGUI_DispString(U8 _CONST_ *s)
{
    NoXY = false;
    MenuGUI_DispStringAt(s,PosX,PosY);
    NoXY = true;
}

void MenuGUI_DispStringLen(U8 _CONST_ *s, U16 Len)
{
    U8 i;
    i = 0;
    while(s[i]!='\0'){
        if (i >= Len ){
            return;
        }
        if (s[i] < 0x80) {//是ASCII
             if(s[i] == '\n'){
//                    PosX = 0;
//                    PosY += 2;
             } else {
               if (PosX > (LCD_XSIZE-1)) {//换行
                    PosX = 0;
//                    PosY += 2;
                }
                switch (GUITextMode) {
                    case MenuGUI_TEXTMODE_NORMAL :
                         Display_ASCII(s[i], PosX, PosY);
                         break;
                    case MenuGUI_TEXTMODE_REVERSE :
                         Display_InvASCII(s[i], PosX, PosY);
                         break;
                    case MenuGUI_TEXTMODE_UNDERLINE :
                         Display_ASCII_UnderLine(s[i], PosX, PosY);
                         break;
                    default :
                         break;
                }
                PosX += 8;
             }
        } else {//是中文
            if (PosX > LCD_XSIZE-16){
//                PosX = 0;
//                PosY += 2;
                return;
            }
            Display_Chinese(s[i]*256+s[i+1],PosX,PosY);//中文
            i++;
            PosX += 16;
       }
       i++;
    }

}

void MenuGUI_DrawCursor(U8 x, U8 y)
{
    if(GUITextMode == MenuGUI_TEXTMODE_NORMAL){
        Display_Locate(0xFF,x,y);
        Display_Locate(0xFF,x,y+1);
    } else if (GUITextMode == MenuGUI_TEXTMODE_REVERSE){
        Display_Locate(0x00,x,y);
        Display_Locate(0x00,x,y+1);
    } else {
        Display_Locate(0xFF,x,y);
        Display_Locate(0xFF,x,y+1);
    }
}

void MenuGUI_CursorOn(U8 x, U8 y)
{
    Display_Locate(0xFF,x,y);
    Display_Locate(0xFF,x,y+1);
}

void MenuGUI_CursorOFF(U8 x, U8 y)
{
    Display_Locate(0x00,x,y);
    Display_Locate(0x00,x,y+1);
}
#endif

/*
*****************************************************************************
* MenuGUI_DispStringAtBar - 显示一个字符串在一个BAR中
* DESCRIPTION: -
* 可以设定对齐方式
* @Param s:字符串
* @Param x0:BAR起始X轴坐标
* @Param x1:BAR结束点的X轴坐标
* @Param y0:BAR的Y轴坐标
* @Param Mode:对齐方式 居中于BAR 左对齐BAR 右对齐BAR
* @Return :
* ----
*****************************************************************************
*/
//void MenuGUI_DispStringAtBar(U8 _CONST_ *s,U8 x0, U8 y0, U8 x1,U8 Mode)
void MenuGUI_DispStringAtBar(U8 *s,U8 x0, U8 y0, U8 x1,U8 Mode)
{
    U8 ENCount;//英文统计
    U8 CNCount;//中文统计
    U8 XLen;
    U8 X;
    U8 Y;
    U8 i;
    CNCount = 0;
    ENCount = 0;
    XLen = 0;
    i = 0;
    while(s[i]!='\0'){//统计中英文个数
        if (s[i] > 0x80) {
            CNCount ++;
            i++;
        } else {
           ENCount++;
        }
        i++;
    }
        MenuGUI_SetEnFont(En_8x16);
/*
    if(CNCount){
        MenuGUI_SetEnFont(En_8x16);
    } else {
        MenuGUI_SetEnFont(En_5x8);
    }
*/
    XLen = ENCount*8 + CNCount*16;

    if (XLen > 127) {//我们只能显示一行
        XLen = 127;
    }
//识别对其方式属性
    switch (Mode&0x30) {//只有这两个Bit是这个属性
        case MenuGUI_TA_LEFT: //左对齐
            XLen = 0;
            break;
        case MenuGUI_TA_HCENTER:  //居中
            XLen  = ((x1-x0)-XLen)/2;
            break;
        case MenuGUI_TA_RIGHT:   //右对齐
            XLen  = (x1-x0)-XLen;
            break;
        default:
            break;
    }
//--------------------------------------
//得到喀什显示的起点坐标
    X = x0+XLen;
    Y = y0;

//---------------------
//清除字符前面的空白部分
    if(Mode&MenuGUI_JUST_TEXT){
    } else {
        x0 = X;
        if (GUITextMode == MenuGUI_TEXTMODE_REVERSE){
            for(i = 0; i <x0; i++){
                Display_Locate(0xFF, i,y0);
                Display_Locate(0xFF, i,y0+1);
            }
        }else{
            for(i = 0; i <x0; i++){
                Display_Locate(0x00, i,y0);
                Display_Locate(0x00, i,y0+1);
            }
        }
    }

//-----------------------
    i = 0;
    while(s[i]!='\0'){
        if (s[i] < 0x80) {//是ASCII
            switch (GUITextMode) {
                case MenuGUI_TEXTMODE_NORMAL :
                     Display_ASCII(s[i], X, Y);
                     break;
                case MenuGUI_TEXTMODE_REVERSE :
                     Display_InvASCII(s[i], X, Y);
                     break;
                case MenuGUI_TEXTMODE_UNDERLINE :
                     Display_ASCII_UnderLine(s[i], X, Y);
                     break;
                default :
                     break;
            }
            X += 8;
        } else {//是中文
            Display_Chinese(s[i]*256+s[i+1],X,Y);//中文
            i++;
            X += 16;
       }
//       s++;
        i++;
    }
//清除字符后面的空白部分
    if(Mode&MenuGUI_JUST_TEXT){
        MenuGUI_SetEnFont(En_5x8);
        return;
    } else {
        x0 = X;
        if (GUITextMode == MenuGUI_TEXTMODE_REVERSE){
            for(i = 0; i <x1-x0; i++){
                Display_Locate(0xFF, x0+i,y0);
                Display_Locate(0xFF, x0+i,y0+1);
            }
        }else{
            for(i = 0; i <x1-x0; i++){
                Display_Locate(0x00, x0+i,y0);
                Display_Locate(0x00, x0+i,y0+1);
            }
        }
        MenuGUI_SetEnFont(En_5x8);
        return;
    }
//---------------------------------------
}

#if 0
//--------------------------
//显示ASCII(16X32)
//Char 字符
//X 0--6
//Y 0--(128-8)

U16 _CONST_ Changedot[] =
{
0x0000, 0x0003, 0x000c, 0x000f, 0x0030, 0x0033, 0x003c, 0x003f, 0x00c0, 0x00c3,
0x00cc, 0x00cf, 0x00f0, 0x00f3, 0x00fc, 0x00ff, 0x0300, 0x0303, 0x030c, 0x030f,
0x0330, 0x0333, 0x033c, 0x033f, 0x03c0, 0x03c3, 0x03cc, 0x03cf, 0x03f0, 0x03f3,
0x03fc, 0x03ff, 0x0c00, 0x0c03, 0x0c0c, 0x0c0f, 0x0c30, 0x0c33, 0x0c3c, 0x0c3f,
0x0cc0, 0x0cc3, 0x0ccc, 0x0ccf, 0x0cf0, 0x0cf3, 0x0cfc, 0x0cff, 0x0f00, 0x0f03,

⌨️ 快捷键说明

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