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

📄 k90ti_lcd.c

📁 本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC上的测试移植代码。 ------------------------------ Menu_Src目录为Menu的源
💻 C
📖 第 1 页 / 共 3 页
字号:
void GUI_CursorOFF(U8 x, U8 y)
{
    Display_Locate(0x00,x,y);
    Display_Locate(0x00,x,y+1);
}
*/
#endif

/*
*****************************************************************************
* GUI_DispHexAt - 显示一个数据的十六进制值
* DESCRIPTION: -
* 最大长度4个
* @Param v:数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY均是起点坐标 也就是数据最高字节坐标
* @Param Len:长度1--4
* @Return :
*
*****************************************************************************
*/
void GUI_DispHexAt(INT32U v, INT16U x, INT16U y, INT8U Len)
{
    INT8U i;
    INT8U HexData;
    if(Len > 8){//限制范围
        Len = 8;
    }
    for(i = 0; i < Len; i++){
        HexData = v&0x0F;
        v = v >>4;
        if(HexData < 0x0A){
            GUI_DispCharAt(HexData+'0',x+Char_XSIZE*(Len-1-i),y);
        }else{
            GUI_DispCharAt(HexData-0x0A+'A',x+Char_XSIZE*(Len-1-i),y);
        }
    }
}
//显示 bit的数据
void GUI_DispBitAt(INT8U v, INT16U x, INT16U y)
{
    INT8U i;

    for(i = 0; i < 8; i++){
        if(v & 0x80){
            GUI_DispCharAt('1',x+Char_XSIZE*i,y);
        }else{
            GUI_DispCharAt('0',x+Char_XSIZE*i,y);
        }
        v = v << 1;
    }
}

/*
*****************************************************************************
* HBar - 显示一个垂直的进度条
* DESCRIPTION: -
* 附加有百分比显示
* @Param y0:进度条起点X轴坐标   0-->LCD_YSIZE
* @Param y1:进度条结束点X坐标   0-->LCD_YSIZE  必须大于y0  百分比显示于该坐标之后
* @Param x:进度条X轴坐标        0--LCD_X_BYTE_SIZE
* @Param percent:当前百分值     0-->100
* @Return :
*
*****************************************************************************
*/
void VBar(INT16U x, INT16U y0, INT16U y1,INT8U percent)
{
    INT8U U8Temp;
    INT16U Ypos;
    float Center;
    if(percent > 100){//防止上溢出
        percent = 100;
    }
    Center = (y1-y0);
    Center *= percent;
    Center /= 100;
//    U8Temp = (x1-x0)*percent/100;//这个计算做法在430上能用,但C51下似乎必须用浮点算
    U8Temp = (INT8U)Center;
    Display_Locate(0xFF, x, y0);
    Display_Locate(0xFF, x, y1);
    for(Ypos = 1; Ypos < U8Temp; Ypos++){
        Display_Locate(0xBD, x, y0+Ypos);
    }
    for(Ypos = y0+U8Temp+1; Ypos < y1; Ypos++){
        Display_Locate(0x81, x, Ypos);
    }
}

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

INT8U _CONST_ BarCode0[]={0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE};
void HBar(INT16U y, INT16U x0, INT16U x1,INT8U percent)
{

    INT8U U8Temp;
    INT8U U8A;
    INT8U U8B;
    INT16U i;
    INT8U Width;
    float Center;

    Center = (x1-x0)*8;
    Center *= percent;
    Center /= 100;
//    U8Temp = (x1-x0)*percent/100;//这个计算做法在430上能用,但C51下似乎必须用浮点算
    U8Temp = (INT8U)Center;
    U8A = U8Temp / 8;
    U8B = U8Temp % 8;
/*
    if(U8A){
        for(i = 0; i < U8A; i++){
            for(Width = 0; Width < 8; Width++){
                Display_Locate(0xFF, x0 + i, y+Width);
            }
        }

    }else{
        for(Width = 0; Width < 8; Width++){
            Display_Locate(0x80, x0, y+Width);
        }
    }
*/
//------------------
    for(i = 0; i < U8A; i++){
        Display_Locate(0xFF, x0+i, y);
        Display_Locate(0x00, x0+i, y+1);
        for(Width = 2; Width < 6; Width++){
            Display_Locate(0xFF, x0+i, y+Width);
        }
        Display_Locate(0x00, x0+i, y+6);
        Display_Locate(0xFF, x0+i, y+7);
    }

    if (U8A == x1-x0){
        U8Temp = BarCode0[U8B] | 0x01;
    }else if(U8A == 0){
        U8Temp = BarCode0[U8B] | 0x80;
    }else{
        U8Temp = 0xFF;
    }
    i = x0+ U8A;
    Display_Locate(0xFF, i, y);
    Display_Locate(0x00, i, y+1);
    for(Width = 2; Width < 6; Width++){
        Display_Locate(U8Temp, i, y+Width);
    }
    Display_Locate(0x00, i, y+6);
    Display_Locate(0xFF, i, y+7);


//------------------
    for(i = x0+U8A+1; i < x1-1; i++){
        Display_Locate(0xFF, i, y);
        Display_Locate(0x00, i, y+1);
        for(Width = 2; Width < 6; Width++){
            Display_Locate(0x00, i, y+Width);
        }
        Display_Locate(0x00, i, y+6);
        Display_Locate(0xFF, i, y+7);
    }

    if (U8A != x1-x0){
        i = x1-1;
        Display_Locate(0xFF, i, y);
        Display_Locate(0x01, i, y+1);
        for(Width = 2; Width < 6; Width++){
            Display_Locate(0x01, i, y+Width);
        }
        Display_Locate(0x01, i, y+6);
        Display_Locate(0xFF, i, y+7);
    }
/*
    if(U8A){
        for(Width = 0; Width < 8; Width++){
            Display_Locate(0x80, x0, y+Width);
        }
    }
    U8Temp = (INT8U)Center;
    U8Temp = U8Temp % 8;
    if(U8Temp){

    }

    for(i = x0+U8Temp+1; i < x1; i++){
        Display_Locate(0xFF, i, y);
        Display_Locate(0x00, i, y+1);
        for(Width = 2; Width < 6; Width++){
            Display_Locate(0x00, i, y+Width);
        }
        Display_Locate(0x00, i, y+6);
        Display_Locate(0xFF, i, y+7);
    }
*/
}
/*
*****************************************************************************
* GUI_DispDecAt - 显示十进制数值
* DESCRIPTION: -
* 处理长度最多5个数字(因为INT16S--->+- 32768)
* @Param v:显示的数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY 均是起点位置坐标 也就是数值最高位的坐标
* @Param Len:指定的显示长度1--5内正负号跟随于最高位的数字前面 更高的用空白显示
5位时:

+12345
   +12
  -235

* @Return :
*
*****************************************************************************
*/
void GUI_DispDecSAt(INT16S v, INT16U x, INT16U y, INT8U Len)
{
#define IsPositive  0
#define IsNegative  1
#define IsZero      2
    INT8U i;
    INT8U CharBuf[5];
    INT8U HighByte;
    INT8U Flag;
    Len += 1;//预留 + -符号
    Flag = 0;
    if(v < 0){
        v = -v;
        Flag = IsNegative;
    }else if (v == 0){
        Flag = IsZero;
    }else{
        Flag = IsPositive;
    }
    HighByte = 0;
    for(i = 0; i < 5; i++){
        CharBuf[i] = (INT8U)(v%10);
        v = v/10;
        if(CharBuf[i]){
            HighByte = i;
        }
    }
    //第0位无论如何也显示
    i = 0;
    GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
    for(i = 1; i < Len; i++){
        if(i > HighByte){
            GUI_DispCharAt(' ',x+((Len-1)-i)*Char_XSIZE,y);
        }else{
            GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
        }
    }
    if(IsZero == Flag){
        GUI_DispCharAt(' ',x+((Len-2)-HighByte)*Char_XSIZE,y);
    }else if(IsPositive == Flag){
        GUI_DispCharAt('+',x+((Len-2)-HighByte)*Char_XSIZE,y);
    }else{
        GUI_DispCharAt('-',x+((Len-2)-HighByte)*Char_XSIZE,y);
    }


}
/*
*****************************************************************************
* GUI_DispDecAt - 显示十进制数值
* DESCRIPTION: -
* 处理长度最多5个数字(因为INT16S--->+- 32768)
* @Param v:显示的数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY 均是起点位置坐标 也就是数值最高位的坐标
* @Param Len:指定的显示长度1--5内 高位用空格填充
5位时:

12345
   12
  235

* @Return :
*
*****************************************************************************
*/
void GUI_DispDecAt(INT16U v, INT16U x, INT16U y, INT8U Len)
{
    INT8U i;
    INT8U CharBuf[5];
    INT8U HighByte;

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

}

/*
*****************************************************************************
* GUI_DrawIcon - 制定位置显示一个图标 图标数据区的开始2个字节指明该图标大小
* DESCRIPTION: -
*
* @Param x0:X轴坐标
* @Param y0:Y轴坐标 注意边界!
* @Param Ico:图标数据
* @Return :
* ----
*****************************************************************************
*/
void GUI_DrawIcon(INT8U _CONST_ *Ico,INT16U x0,INT16U y0)
{
    INT16U i;
    INT16U j;
    INT16U Count;
    INT16U ICO_XLen;
    INT16U ICO_YLen;

    ICO_XLen = Ico[0];//X Byte len
    ICO_YLen = Ico[1];//Y Byte len

    Count = 2;
    for(j = 0; j < ICO_YLen; j++){
        if(y0 + j < LCD_YSIZE){
            for(i = 0; i < ICO_XLen; i++){
                if(x0 + i < LCD_X_BYTE_SIZE){
                    Display_Locate(Ico[Count++],x0+i,y0+j);
                }else{
                    Count++;//如果越界 只是丢弃数据不显示
                }
            }
        }else{
//            Count++;//如果越界 只是丢弃数据不显示
            return;
        }
    }
}

void GUI_Test(void)
{
    INT8U x;
    INT8U y;
    INT16U Key;
    GUI_Init();
//    for(y = 0; y <= 100;y++){
//        Display_Locate(0xFF, 0,y);
//    }
//    Display_ASCII('A',0,0);
//    Display_ASCII('B',1,0);
//    Display_ASCII('C',1,8);
/*
    for(x = 0; x < 8; x++){
        y = (1<<x);
        GUI_DispBitAt(y, 0,0);
        GUI_DispHexAt(y, 0,Char_YSIZE*4,2);
    }
    for(y = 0; y <= 100;y++){
        for(x = 0; x <= 100;x++){
            //VBar(2,10,210,x);
            HBar(10, 2,22,x);
            LCD_DelayMs(300);
        }
        LCD_DelayMs(300);
    }
*/
//    GUI_SetFontZoom(GUI_TEXTMODE_ZOOMx2);
//    GUI_DispStringAt("ABFC",0,0);
//    GUI_DispStringAt("String测试",0,Char_YSIZE*7);
//    Display_Locate(0x01, 0,0);
//    Display_Locate(0x02, 1,1);
//    Display_Locate(0xFF, 0,1);
//    for(x = 0; x < 8; x++){
//        Display_Locate((1<<x), 0,0);
//    }
    GUI_SetFontZoom(GUI_TEXTMODE_ZOOMx1);

    GUI_DispStringAt("String",0,Char_YSIZE*13);

//    Display_Chinese(0xD5EF,10,0);
    GUI_DispStringAt("String测试中..",0,Char_YSIZE*2);
    GUI_DispStringAt("AString测试中..",10,480-32);
    Display_Locate(0xFF, 0,0);
    while(1){
        for(y = 0; y <= 100;y++){
            GUI_DispDecAt(y,0,0,3);
            SIM_Delay(1);
            Key = GUI_GetKey();
            if(Key){
                GUI_DispHexAt(Key,0,48,4);
            }

        }
    }

//    Display_Locate(0xFF, 0,1);


    Display_Locate(0xFF, LCD_X_BYTE_SIZE-1,0);

    Display_Locate(0xFF, 0,(LCD_YSIZE-1));
    Display_Locate(0xFF, LCD_X_BYTE_SIZE-1,LCD_YSIZE-1);

    for(x = 0; x < (LCD_XSIZE/8); x++){
        Display_Locate(0xAA, x,0);
        Display_Locate(0xAA, x,1);
        Display_Locate(0xAA, x,2);
    }


}

⌨️ 快捷键说明

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