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

📄 gui.c

📁 Atmega64单片机程序(完整工程)
💻 C
📖 第 1 页 / 共 3 页
字号:
        default : break;
    }
}


void GUI_DispCEOL(void)
{
    INT8U i;
    for(i = PosX; i <= LCD_XSIZE-8; i += 8) 
    {
        GUI_DispCharAt(' ', i, PosY);
    }
}

/*
*****************************************************************************
* GUI_DispStringAt - 指定位置显示一个字符串
* 支持中英混合 当中英混合时英文字体强制为8x16 如果单单英文 按照设定字体
* @Param x0:X轴坐标
* @Param y0:Y轴坐标
* @Param s:字符串
*****************************************************************************
*/
//void GUI_DispStringAt(INT8U _CONST_ *s,INT8U x0,INT8U y0)
void GUI_DispStringAt(INT8U *s,INT8U x0,INT8U y0)
{
    INT8U i;  
    INT16U temp;
    if (NoXY == FALSE)//没有提供坐标,则使用系统坐标
    {
        x0 = PosX;
        y0 = PosY;
    }
	if(x0>LCD_XSIZE)
	    x0=x0%LCD_XSIZE;
	if(y0>LCD_YSIZE)
	    y0=y0%LCD_YSIZE;	
	
    i = 0;
    while(s[i]!='\0')
    {
        if (s[i] < 0x80) 
        {//是ASCII  
             if(s[i] == '\n')
             {
                 x0 = 0;
                 y0 += Char_YSIZE+2;
             }
             else 
             {
                if ( x0 > LCD_XSIZE-Char_XSIZE ) 
                {//换行
                    x0 = 0;
                    y0 += Char_YSIZE+2;
                }
                switch (GUITextMode) 
                {
                    case GUI_TEXTMODE_NORMAL :
                         GUI_Display_ASCII(s[i], x0, y0);
                         break;
                    case GUI_TEXTMODE_REVERSE :
                         GUI_Display_InvASCII(s[i], x0, y0);
                         break;
                    case GUI_TEXTMODE_UNDERLINE :
                         GUI_Display_ASCII_UnderLine(s[i], x0, y0);
                         break;
                    default :
                         break;
                }
                x0 += Char_XSIZE;
             }
        }
        else 
        {//是中文 
            Char_YSIZE=En_6x12_YSIZE;//如果有中文,英文强制转换 6*12
            if (x0 > LCD_XSIZE-Chinese_XSIZE)
            {
                x0 = 0;
                y0 += Chinese_YSIZE+2;
            } 
            temp=(INT16U)(s[i])*256+s[i+1];
            GUI_Display_Chinese(temp,x0,y0);//中文
            i++;
            x0 += Chinese_XSIZE;
       }
       i++;
    }
    if(NoXY == FALSE)
    {
        PosX = x0;
        PosY = y0;
    }
}

/*
*****************************************************************************
* GUI_DispString - 在当前系统坐标下显示字符串
* 除了坐标不能指定外 功能跟GUI_DispStringAt一致
* @Param s:字符串
*****************************************************************************
*/
void GUI_DispString(INT8U *s)
{
    NoXY = FALSE;
    GUI_DispStringAt(s,PosX,PosY);
    NoXY = TRUE;
}


#if  GUI_DispStringLen_EN
void GUI_DispStringLen(INT8U *s, INT16U Len)
{
    INT8U i; 
    INT16U temp;
    
    i = 0;
    while(s[i]!='\0')
    {
        if (i >= Len )
        {
            return;
        }
        if (s[i] < 0x80) 
        {//是ASCII
             if(s[i] == '\n')
             {
                 PosX = 0;
                 PosY +=Char_YSIZE+2;
             } 
             else 
             {
                if( PosX >= LCD_XSIZE ) 
                {//换行
                    PosX = 0;
                    PosY +=Char_YSIZE+2;
                }
                switch (GUITextMode) 
                {
                    case GUI_TEXTMODE_NORMAL :
                         GUI_Display_ASCII(s[i], PosX, PosY);
                         break;
                    case GUI_TEXTMODE_REVERSE :
                         GUI_Display_InvASCII(s[i], PosX, PosY);
                         break;
                    case GUI_TEXTMODE_UNDERLINE :
                         GUI_Display_ASCII_UnderLine(s[i], PosX, PosY);
                         break;
                    default :
                         break;
                }
                PosX +=Char_XSIZE;
             }
        } 
        else
        {//是中文 
            Char_YSIZE=En_6x12_YSIZE;//如果有中文,英文强制转换 8*16
            if (PosX > LCD_XSIZE-16)
            {
                PosX = 0;
                PosY +=Chinese_YSIZE+2;
                //return;
            } 
            temp=(INT16U)(s[i])*256+s[i+1];
            GUI_Display_Chinese(temp,PosX,PosY);//中文
            i++;
            PosX +=Chinese_XSIZE;
       }
       i++;
    }
}
#endif


void GUI_CursorOn(INT8U x, INT8U y)
{
    LCD_Display_Locate(0xFF,x,y);
    LCD_Display_Locate(0xFF,x,y+1);
}

void GUI_CursorOFF(INT8U x, INT8U y)
{
    LCD_Display_Locate(0x00,x,y);
    LCD_Display_Locate(0x00,x,y+1);
}

#if GUI_MATH_EN
/*
*****************************************************************************
* GUI_DispDecAt - 显示十进制数值
* DESCRIPTION: -
* 处理长度最多5个数字(因为U16--->65536)
* @Param v:显示的数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY 均是起点位置坐标 也就是数值最高位的坐标
* @Param Len:指定的显示长度1--5内
* @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(CharBuf[i])
        {
            GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
        }
        else if(i > HighByte)
        {
            GUI_DispCharAt(' ',x+((Len-1)-i)*Char_XSIZE,y);
        }
    }

}

/*
*****************************************************************************
* GUI_DispHexAt - 显示一个数据的十六进制值
* DESCRIPTION: -
* 最大长度4个
* @Param v:数据
* @Param x:X轴坐标
* @Param y:Y轴坐标  XY均是起点坐标 也就是数据最高字节坐标
* @Param Len:长度1--4
* @Return :
*
*****************************************************************************
*/
void GUI_DispHexAt(INT32U v, INT8U x, INT8U 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);
        }
    }
}

// ---- 显示不带符号的整数  (数字 起始位置XY,显示长度) -----------------------------
void GUI_Display_Number(INT16U Number, INT8U X, INT8U Y, INT8U Lenth)
{
    INT8U DispNum;

    X = ( X + Lenth *En_6x12_XSIZE - En_6x12_XSIZE );
    for(; Lenth>0; Lenth--)
    {
        DispNum =(INT8U)(Number%10) + '0';
        GUI_Display_ASCII(DispNum, X, Y);
        X -= En_6x12_XSIZE;
        Number = Number / 10;
    }
}

// ---- 显示带符号的整数  (数字 起始位置XY,显示长度) ---------------------------------
void GUI_Display_SignedNumber(int Number,INT8U X,INT16U Y,INT8U Lenth)
{
    if(Number < 0)
    {
        GUI_Display_ASCII('-', X, Y);
        GUI_Display_Number(-Number, X+En_6x12_XSIZE, Y, Lenth);
    }
    else
    {
        GUI_Display_ASCII(' ', X, Y);
        GUI_Display_Number(Number, X+En_6x12_XSIZE, Y, Lenth);
    }
}

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

// ---- 显示带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
void GUI_Display_SignedDecimal(long int Number, char X, INT16U Y, INT8U INT, INT8U DEC)
{
  if(Number < 0)
  {
      GUI_Display_ASCII('-', X, Y);
      GUI_Display_Decimal(-Number, X+En_6x12_XSIZE, Y, INT, DEC);
  }
  else
  {
      GUI_Display_ASCII(' ',X,Y);
      GUI_Display_Decimal(Number, X+En_6x12_XSIZE, Y, INT, DEC);
  }
}

#endif

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

⌨️ 快捷键说明

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