ks0108.c

来自「本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC」· C语言 代码 · 共 1,610 行 · 第 1/3 页

C
1,610
字号
0x0f0c, 0x0f0f, 0x0f30, 0x0f33, 0x0f3c, 0x0f3f, 0x0fc0, 0x0fc3, 0x0fcc, 0x0fcf,
0x0ff0, 0x0ff3, 0x0ffc, 0x0fff, 0x3000, 0x3003, 0x300c, 0x300f, 0x3030, 0x3033,
0x303c, 0x303f, 0x30c0, 0x30c3, 0x30cc, 0x30cf, 0x30f0, 0x30f3, 0x30fc, 0x30ff,
0x3300, 0x3303, 0x330c, 0x330f, 0x3330, 0x3333, 0x333c, 0x333f, 0x33c0, 0x33c3,
0x33cc, 0x33cf, 0x33f0, 0x33f3, 0x33fc, 0x33ff, 0x3c00, 0x3c03, 0x3c0c, 0x3c0f,
0x3c30, 0x3c33, 0x3c3c, 0x3c3f, 0x3cc0, 0x3cc3, 0x3ccc, 0x3ccf, 0x3cf0, 0x3cf3,
0x3cfc, 0x3cff, 0x3f00, 0x3f03, 0x3f0c, 0x3f0f, 0x3f30, 0x3f33, 0x3f3c, 0x3f3f,
0x3fc0, 0x3fc3, 0x3fcc, 0x3fcf, 0x3ff0, 0x3ff3, 0x3ffc, 0x3fff, 0xc000, 0xc003,
0xc00c, 0xc00f, 0xc030, 0xc033, 0xc03c, 0xc03f, 0xc0c0, 0xc0c3, 0xc0cc, 0xc0cf,
0xc0f0, 0xc0f3, 0xc0fc, 0xc0ff, 0xc300, 0xc303, 0xc30c, 0xc30f, 0xc330, 0xc333,
0xc33c, 0xc33f, 0xc3c0, 0xc3c3, 0xc3cc, 0xc3cf, 0xc3f0, 0xc3f3, 0xc3fc, 0xc3ff,
0xcc00, 0xcc03, 0xcc0c, 0xcc0f, 0xcc30, 0xcc33, 0xcc3c, 0xcc3f, 0xccc0, 0xccc3,
0xcccc, 0xcccf, 0xccf0, 0xccf3, 0xccfc, 0xccff, 0xcf00, 0xcf03, 0xcf0c, 0xcf0f,
0xcf30, 0xcf33, 0xcf3c, 0xcf3f, 0xcfc0, 0xcfc3, 0xcfcc, 0xcfcf, 0xcff0, 0xcff3,
0xcffc, 0xcfff, 0xf000, 0xf003, 0xf00c, 0xf00f, 0xf030, 0xf033, 0xf03c, 0xf03f,
0xf0c0, 0xf0c3, 0xf0cc, 0xf0cf, 0xf0f0, 0xf0f3, 0xf0fc, 0xf0ff, 0xf300, 0xf303,
0xf30c, 0xf30f, 0xf330, 0xf333, 0xf33c, 0xf33f, 0xf3c0, 0xf3c3, 0xf3cc, 0xf3cf,
0xf3f0, 0xf3f3, 0xf3fc, 0xf3ff, 0xfc00, 0xfc03, 0xfc0c, 0xfc0f, 0xfc30, 0xfc33,
0xfc3c, 0xfc3f, 0xfcc0, 0xfcc3, 0xfccc, 0xfccf, 0xfcf0, 0xfcf3, 0xfcfc, 0xfcff,
0xff00, 0xff03, 0xff0c, 0xff0f, 0xff30, 0xff33, 0xff3c, 0xff3f, 0xffc0, 0xffc3,
0xffcc, 0xffcf, 0xfff0, 0xfff3, 0xfffc, 0xffff,
};
bit EnFont = 0;
void MenuGUI_DispChar(U8 Char,U8 X,U8 Y,bit Nor)
{
    U8 i;
    U8 dot;

    U16 temp;

    if(Y>(128-8)){//换行
        X += 2;
        Y  = 0;
    }
    if(!Nor){
        for(i=0;i<8;i++){
            if(EnFont == 0){
                WriteByte(X,(Y+i),chardot[i+(Char-0x20)*16]);
            }else{
                dot = chardot[i+(Char-0x20)*16];
                temp = Changedot[dot];
//这段代码把字体纵向放大2倍,外部调用时换行需要加倍
                WriteByte(X,(Y+i),(U8)(temp&0x00FF));
                WriteByte(X+1,(Y+i),(U8)((temp&0xFF00)>>8));

/*
//这段代码把字体放大4倍,但由于横向轴被放大,因此外部调用函数时也需要加倍
                WriteByte(X,(Y+i*2),(U8)(temp&0x00FF));
                WriteByte(X,(Y+i*2+1),(U8)(temp&0x00FF));
                WriteByte(X+1,(Y+i*2),(U8)((temp&0xFF00)>>8));
                WriteByte(X+1,(Y+i*2+1),(U8)((temp&0xFF00)>>8));
*/
            }

        }
        for(i=8;i<16;i++){
            if(EnFont == 0){
                WriteByte(X+1,(Y+i-8),chardot[i+(Char-0x20)*16]);
            }else{
                dot = chardot[i+(Char-0x20)*16];
                temp = Changedot[dot];

                WriteByte(X+2,(Y+i-8),(U8)(temp&0x00FF));
                WriteByte(X+3,(Y+i-8),(U8)((temp&0xFF00)>>8));

/*
                WriteByte(X+2,(Y+(i-8)*2),(U8)(temp&0x00FF));
                WriteByte(X+2,(Y+(i-8)*2+1),(U8)(temp&0x00FF));
                WriteByte(X+3,(Y+(i-8)*2),(U8)((temp&0xFF00)>>8));
                WriteByte(X+3,(Y+(i-8)*2+1),(U8)((temp&0xFF00)>>8));
*/
            }
        }
    }else{
        for(i=0;i<8;i++){
            if(EnFont == 0){
                WriteByte(X,(Y+i),0xFF-chardot[i+(Char-0x20)*16]);
            }else{
                dot = 0xFF-chardot[i+(Char-0x20)*16];
                temp = Changedot[dot];
                WriteByte(X*2,(Y+i),(U8)(temp&0x00FF));
                WriteByte(X*2,(Y+i+1),(U8)(temp&0x00FF));
                WriteByte(X*2+1,(Y+i),(U8)((temp&0xFF00)>>8));
                WriteByte(X*2+1,(Y+i+1),(U8)((temp&0xFF00)>>8));

            }
        }
        for(i=8;i<16;i++){
            if(EnFont == 0){
                WriteByte(X+1,(Y+i-8),0xFF-chardot[i+(Char-0x20)*16]);
            }else{
                dot = 0xFF-chardot[i+(Char-0x20)*16];
                temp = Changedot[dot];
                WriteByte((X+1)*2,(Y+i-8+1),(U8)(temp&0x00FF));
                WriteByte((X+1)*2,(Y+i-8),(U8)(temp&0x00FF));
                WriteByte((X+1)*2+1,(Y+i-8+1),(U8)((temp&0xFF00)>>8));
                WriteByte((X+1)*2+1,(Y+i-8),(U8)((temp&0xFF00)>>8));
            }
        }
    }
}
#endif
//--------------------------

#if 0
//-------------显示普通图片
//------(图像 长度 起始位置)
void Display_Image(U8 _CONST_ *IMG)
{
    U8 XAddr;
    U8 YAddr;
    U16 Count;
    Count = 0;
    for(XAddr=0;XAddr<8;XAddr++){//0--7
        for(YAddr=0;YAddr<128;YAddr++){//0--127
            WriteByte(XAddr,YAddr,IMG[Count++]);
        }
    }
}
#endif

/*
*****************************************************************************
* MenuGUI_DrawIcon - 制定位置显示一个32x32的图标
* DESCRIPTION: -
*
* @Param x0:X轴坐标
* @Param y0:Y轴坐标 注意边界!
* @Param Ico:图标数据
* @Return :
* ----
*****************************************************************************
*/
void MenuGUI_DrawIcon(U8 _CONST_ *Ico,U8 x0,U8 y0)
{
    U8 i;
    U16 Count;
    Count = 0;
    if( y0 > 4){//边界保护
        y0 = 4;
    }
    if(x0 >(LCD_XSIZE-32)){
        x0 = LCD_XSIZE-32;
    }
    for(i=0;i<32;i++){//第一行
        Display_Locate(Ico[Count++],x0+i,y0);
    }
    for(i=0;i<32;i++){//第二行
        Display_Locate(Ico[Count++],x0+i,y0+1);
    }
    for(i=0;i<32;i++){//第三行
        Display_Locate(Ico[Count++],x0+i,y0+2);
    }
    for(i=0;i<32;i++){//第四行
        Display_Locate(Ico[Count++],x0+i,y0+3);
    }
}
#if 0

/*
*****************************************************************************
* MenuGUI_DispDecAt - 显示十进制数值
* DESCRIPTION: -
* 处理长度最多5个数字(因为U16--->65536)
* @Param v:显示的数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY 均是起点位置坐标 也就是数值最高位的坐标
* @Param Len:指定的显示长度1--5内
* @Return :
*
*****************************************************************************
*/
void MenuGUI_DispDecAt(U16 v, U16 x, U16 y, U8 Len)
{
    U8 i;
    U8 CharBuf[5];
    U8 HighByte;

    HighByte = 0;
    for(i = 0; i < 5; i++){
        CharBuf[i] = (U8)(v%10);
        v = v/10;
        if(CharBuf[i]){
            HighByte = i;
        }
    }
    //第0位无论如何也显示
    i = 0;
    MenuGUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
    for(i = 1; i < Len; i++){
        if(CharBuf[i]){
            MenuGUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
        }else if(i > HighByte){
            MenuGUI_DispCharAt(' ',x+((Len-1)-i)*Char_XSIZE,y);
        }
    }

}

/*
*****************************************************************************
* MenuGUI_DispHexAt - 显示一个数据的十六进制值
* DESCRIPTION: -
* 最大长度4个
* @Param v:数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY均是起点坐标 也就是数据最高字节坐标
* @Param Len:长度1--4
* @Return :
*
*****************************************************************************
*/
void MenuGUI_DispHexAt(U32 v, U8 x, U8 y, U8 Len)
{
    U8 i;
    U8 HexData;
    if(Len > 8){//限制范围
        Len = 8;
    }
    for(i = 0; i < Len; i++){
        HexData = v&0x0F;
        v = v >>4;
        if(HexData < 0x0A){
            MenuGUI_DispCharAt(HexData+'0',x+Char_XSIZE*(Len-1-i),y);
        }else{
            MenuGUI_DispCharAt(HexData-0x0A+'A',x+Char_XSIZE*(Len-1-i),y);
        }
    }
}
/*
*****************************************************************************
* HBar - 显示一个水平的进度条
* DESCRIPTION: -
* 附加有百分比显示
* @Param x0:进度条起点X轴坐标   0-->127
* @Param x1:进度条结束点X坐标   0-->127  必须大于x0  百分比显示于该坐标之后
* @Param y:进度条Y轴坐标        0--7
* @Param percent:当前百分值     0-->100
* @Return :
*
*****************************************************************************
*/
void HBar(U8 y, U8 x0, U8 x1,U8 percent)
{
    U8 U8Temp;
    U8 i;
    float Center;
    Center = (x1-x0);
    Center *= percent;
    Center /= 100;
//    U8Temp = (x1-x0)*percent/100;//这个计算做法在430上能用,但C51下似乎必须用浮点算
    U8Temp = (U8)Center;
    Display_Locate(0xFF, x0, y);
    Display_Locate(0xFF, x1, y);
    for(i = 1; i < U8Temp; i++){
        Display_Locate(0xBD, x0+i, y);
    }
    for(i = x0+U8Temp+1; i < x1; i++){
        Display_Locate(0x81, i, y);
    }
}
/*                  x1 +3
|-------------------|
|                   ||
|                   |||
|                   ||||
|                   ||||
--------------------
 -------------------
  ------------------
x0--->x1+3
y0--->y1


*/

void TipDisp( U8 x0, U8 y0, U8 x1, U8 y1)
{
    U8 i;
    for(i = 0; i < x1-x0+4; i++){
        Display_Locate(0x01, x0+i, y0);
        Display_Locate(0x0F, x0+i, y1);
    }
    Display_Locate(0x01, x0+0, y1);
    Display_Locate(0x01, x0+1, y1);
    Display_Locate(0x03, x0+2, y1);
    Display_Locate(0x03, x0+3, y1);
    Display_Locate(0x07, x0+4, y1);
    Display_Locate(0x07, x0+5, y1);

    for(i = 0; i < y1-y0; i++){
        Display_Locate(0xFF, x0, y0+i);
        Display_Locate(0xFF, x1, y0+i);
        Display_Locate(0xFF, x1+1, y0+i);
        Display_Locate(0xFF, x1+2, y0+i);
        Display_Locate(0xFF, x1+3, y0+i);
    }
    Display_Locate(0xFC, x1+1, y0);
    Display_Locate(0xF0, x1+2, y0);
    Display_Locate(0xC0, x1+3, y0);
}

/*
清空Tip
坐标应该跟TipDisp一样
*/
void TipClr( U8 x0, U8 y0, U8 x1, U8 y1)
{
    U8 i;
    U8 j;
    for(i = 0; i <= x1+3-x0; i++){
        for(j = 0; j <= y1-y0; j++){
            Display_Locate(0x00, x0+i, y0+j);
        }
    }

}
#endif
/*
// ---- 显示不带符号的整数  (数字 起始位置XY,显示长度) -----------------------------
void Display_Number(U16 Number, U8 X, U8 Y, U8 Lenth)
{
  U8 DispNum;

  X = ( X + Lenth * 8 - 8 );
  for(; Lenth>0; Lenth--)
  {
    DispNum = Number%10 + 0x30;
    Display_ASCII(DispNum, X, Y);
    X -= 8;
    Number = Number / 10;
  }
}

// ---- 显示带符号的整数  (数字 起始位置XY,显示长度) ---------------------------------
void Display_SignedNumber(int Number,U8 X,U16 Y,U8 Lenth)
{
  if(Number < 0)
  {
    Display_ASCII('-', X, Y);
    Display_Number(-Number, X+8, Y, Lenth);
  }
  else
  {
    Display_ASCII(' ', X, Y);
    Display_Number(Number, X+8, Y, Lenth);
  }
}

// ---- 显示不带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
void Display_Decimal(unsigned long int Number, char X, U16 Y, U8 INT, U8 DEC)
{
  U8 DispNum, Lenth;
  //Y = Y +(( X + INT * 8 + DEC * 8 ) / 84) * 2;
  X = ( X + ( INT + DEC ) *8);
  // 显示小数部分
  for(Lenth=DEC; Lenth>0; Lenth--)
  {
    DispNum = Number%10 + 0x30;
    Display_ASCII(DispNum, X, Y);
    //if (X < 8) {Y -= 2; X += 84;}
    X -= 8;
    Number = Number / 10;
  }
  // 显示小数点
  Display_ASCII('.', X, Y);
  //if (X < 8) {Y -= 2; X += 84;}
    X -= 8;
  // 显示整数部分
  for(Lenth=INT; Lenth>0; Lenth--)
  {
    DispNum = Number%10 + 0x30;
    Display_ASCII(DispNum, X, Y);
    //if (X < 8) {Y -= 2; X += 84;}
    X -= 8;
    Number = Number / 10;
  }
}

// ---- 显示带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
void Display_SignedDecimal(long int Number, char X, U16 Y, U8 INT, U8 DEC)
{
  if(Number < 0)
  {
    Display_ASCII('-', X, Y);
    Display_Decimal(-Number, X+8, Y, INT, DEC);
  }
  else
  {
  Display_ASCII(' ',X,Y);
  Display_Decimal(Number, X+8, Y, INT, DEC);
  }
}
*/


//--------------
/*
Bar的算法
    ___
 |   |
 |   |
| |<-|-----BarLen
 |   L
 |   |
 |   |
 |  _|_
Bar的滑动距离是L-BarLen
为了美观,可以在开始和结尾部分多流出来一些点,那么滑动距离要扣除这些点的长度,并在计算结果
得到0的时候,添加上上端要留出来的点BarRemainDot
2种显示方式:
一种是BarLen是定长的,
一种BarLen是根据显示总共的项数定下来的
*/


//--------------
//Bar的长度
//预留出来的点
#define BarRemainDot  3
//数字显示位置
//#define BarNumPosX (128-8+2)
#define BarNumPosY (7)
//Bar的显示开始/结束位置
//#define BarBeginPosX (126)
#define BarBeginPosY (0*8)
#define BarEndPosX (126)
#define BarEndPosY (6*8)

U8 _CONST_ BarCode0[]={0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00};
U8 _CONST_ BarCode1[]={0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
extern U8 ItemBackup_i;
extern U8 ItemBackup[];

void Bar(U8 Item_,U8 ItemNum_,U8 BarPosX,U8 BarNumPosX)
{
    U8 U8_temp;
    U8 DispFlag;
    U8 YOffset;
    U16 Temp;
    U8 BarLen;
    U8 Y;
    U8 i;
//    U8 CharBuf[5];
//    Bool HighBit;

    BarLen = (BarEndPosY-BarBeginPosY-BarRemainDot)/(ItemNum_);//BarLen根据ItemNum_得到
    if (BarLen == 0) {
        BarLen = 5;
    }
    BarLen = 8;
    Temp = Item_*(BarEndPosY-BarBeginPosY-BarLen-BarRemainDot);//BarRemainDot是被扣除的部分
    Temp = Temp/(ItemNum_-1);
    YOffset = (U8)Temp;
    if(!Temp){//顶端,把预留的加上
        YOffset = BarRemainDot;
    }

    for(Y = 0;Y < BarEndPosY/8;Y++){
        if((Y != (YOffset/8))&&(Y != (YOffset/8+1))){
            Display_Locate(0x00,BarPosX,Y);//清除 X=125 列
            Display_Locate(0xFF,BarPosX+1,Y);//X=126列画线
            Display_Locate(0x00,BarPosX+2,Y);//清除 X=127 列
        }else{//Y = YOffset/8 Y = YOffset/8+1
            Display_Locate(BarCode0[YOffset%8],BarPosX,(YOffset/8));
            Display_Locate(0xFF-BarCode0[YOffset%8],BarPosX+1,(YOffset/8));
            Display_Locate(BarCode0[YOffset%8],BarPosX+2,(YOffset/8));
            if((YOffset/8)+1 < (BarEndPosY/8)){//防止下越界
                Display_Locate(BarCode1[YOffset%8],BarPosX,(YOffset/8+1));
                Display_Locate(0xFF-BarCode1[YOffset%8],BarPosX+1,(YOffset/8+1));
                Display_Locate(BarCode1[YOffset%8],BarPosX+2,(YOffset/8+1));
            }
        }
    }

    MenuGUI_SetEnFont(En_5x8);
    Item_ += 1;
    //显示Bar数字
/*
    for(i = 0; i < 5; i++){
        CharBuf[i] = (U8)(Item%10);
        Item = Item/10;
    }
    HighBit = false;
    for(i = 0; i < 5; i++){
        if(CharBuf[4-i]){//从最高位开始显示
            MenuGUI_DispCharAt(CharBuf[4-i]+'0',x+8*i,y);
            HighBit = true;
        }else{
            if(HighBit == true){
                MenuGUI_DispCharAt('0',x+Char_XSIZE*i,y);//如果高位不为0,当前值为0 ,显示0
            }
        }
    }
*/
    DispFlag = false;
    U8_temp = (U8)(Item_/100);//  百位
    if(U8_temp){
        MenuGUI_DispCharAt(U8_temp+'0',BarNumPosX-12,BarNumPosY);
        DispFlag = true;//通知低位显示
    }else{
        MenuGUI_DispCharAt(' ',BarNumPosX-12,BarNumPosY);
    }

    Item_ = (Item_-U8_temp*100);//剔除百位
    U8_temp = (U8)(Item_/10);//  十位
    if(U8_temp||(DispFlag == true)){//本位不为0,或者高位已经显示,那么必须显示
        MenuGUI_DispCharAt(U8_temp+'0',BarNumPosX-6,BarNumPosY);
        DispFlag = 1;
    }else{
        MenuGUI_DispCharAt(' ',BarNumPosX-6,BarNumPosY);
    }

    U8_temp = (U8)(Item_%10);//  个位
    MenuGUI_DispCharAt(U8_temp+'0',BarNumPosX,BarNumPosY);

//----------------------------------
//显示历史索引号
    if(ItemBackup_i > 1){//大于1才是
        for(i = 0; i <ItemBackup_i-1;i++){//最后一个位于1的位置
            Item_ = ItemBackup[ItemBackup_i-1-i]+1;  //从备份数据中得到标号,然后加1显示
            U8_temp = (U8)(Item_%10);//
            MenuGUI_DispCharAt(U8_temp+'0',BarNumPosX-8*(i+1),BarNumPosY);
            Display_Locate(0x10, BarNumPosX-8*(i+1)+8-1, BarNumPosY); //描分隔符
            Display_Locate(0x10, BarNumPosX-8*(i+1)+8-0, BarNumPosY);
        }
    }
//----------------------------------
    MenuGUI_SetEnFont(En_8x16);

   return;

}


⌨️ 快捷键说明

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