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

📄 gui.c

📁 Atmega64单片机程序(完整工程)
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "SYS_Config.h"
#include "GUI_Config.h"
#include "GUI.h"  

//包含液晶底层驱动函数
#include "LcdDrive.h" 

#include "Chinese.h"
#include "ASCII.h"  
 
/*-------------------------------------------------------------------------
GUI相关全局变量
-------------------------------------------------------------------------*/

INT8U  GUITextMode = GUI_TEXTMODE_NORMAL;  //显示模式
       
INT8U  GUIEnglishFont = En_6x12; //英文字体
INT8U  Char_XSIZE=6;    //英文字体X宽度 不能大于8
INT8U  Char_YSIZE=12;   //英文字体Y宽度 不能大于16

INT8U  GUIChineseFont=Chinese_12x12;
INT8U  Chinese_XSIZE=12;//中文字体x宽度          
INT8U  Chinese_YSIZE=12;//中文字体y宽度      

INT8U  PosX = 0;        //当前系统X坐标
INT8U  PosY = 0;        //当前系统Y坐标

INT8U  NoXY = TRUE;     //是否使用PosX PosY的标志   
                        //1-->不使用   
			            //0-->使用

void GUI_Init(void)
{
    LCD_Init();
    GUI_Clear();
    
    GUITextMode = GUI_TEXTMODE_NORMAL;
    
    GUIEnglishFont = En_6x12;
    Char_XSIZE = En_6x12_XSIZE;
    Char_YSIZE = En_6x12_YSIZE;
    
    GUIChineseFont=Chinese_12x12;
    Chinese_XSIZE=Chinese_12x12_XSIZE;//中文字体x宽度          
    Chinese_YSIZE=Chinese_12x12_YSIZE;//中文字体y宽度  
    
    PosX = 0;
    PosY = 0;
    NoXY = TRUE;
} 

void GUI_Clear(void)
{
    LCD_ClearScreen();
}

void GUI_Delay(INT16U Period)
{
    INT16U i;
    while(Period--)
    {
        for(i=0;i<400;i++)
	    ;
    }  
}

void GUI_GotoX(INT8U x)
{
    if (x >= LCD_XSIZE)
        PosX =LCD_XSIZE;
    else 
        PosX = x;
}

void GUI_GotoY(INT8U y)
{
    if (y >=LCD_YSIZE) 
        PosY = LCD_YSIZE;
    else 
        PosY = y;
}

void GUI_GotoXY(INT8U x,INT8U y)
{
    GUI_GotoX(x);
    GUI_GotoY(y);
}

/*
*****************************************************************************
* GUI_SetTextMode - 设置文字显示模式
* @Param TextMode:模式代码
* @Return :模式代码
*****************************************************************************
*/
INT8U GUI_SetTextMode(INT8U TextMode)
{
    GUITextMode = TextMode;
    return GUITextMode;
}

/*****************************************************************************
* GUI_SetEnFont - 设置显示的英文字体
* DESCRIPTION: -
* 目前支持两种字体8x16 5x8
* @Param EnFont:字体代码
*****************************************************************************/
void GUI_SetEnFont(INT8U EnFont)
{
   if (EnFont == En_5x8)
   {
       GUIEnglishFont  = En_5x8;
       Char_XSIZE = En_5x8_XSIZE;
       Char_YSIZE = En_5x8_YSIZE;
   } 
   else
   {
       GUIEnglishFont  = En_6x12;
       Char_XSIZE = En_6x12_XSIZE;
       Char_YSIZE = En_6x12_YSIZE;
   }
}


/****************************************************************************
* Display_ASCII - 显示一个ASCII
* @Param X:X轴坐标 0--128  (注意边界)
* @Param Y:Y轴坐标 0-- 7   (注意边界)
* @Param Char:ASCII码
******************************************************************************/
void GUI_Display_ASCII(INT8U Char, INT8U X, INT8U Y)
{
    INT8U i, ImgData;
    INT16U temp;
    INT8U HZ_X;  
    
	if(X>=LCD_XSIZE)
	    X=X%LCD_XSIZE;
	if(Y>=LCD_YSIZE)
	    Y=Y%LCD_YSIZE;
		
    HZ_X = X;
    if(GUIEnglishFont == En_5x8)
    {
        for(i = 0; i < En_5x8_XSIZE; i++)
        {   
            temp=i+(INT16U)(Char-0x20)*5; //要注意数据范围
            ImgData = chardot_5x8[temp];
            LCD_Display_Locate(ImgData, HZ_X, Y);
            HZ_X++;
        }
    }
    else 
    {
        for(i=0;i<En_6x12_XSIZE;i++)
        {    
            temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
            ImgData = chardot_6x12[temp];
            LCD_Display_Locate(ImgData, HZ_X, Y);
            HZ_X++;
        }
        HZ_X=X;
        for(i=En_6x12_XSIZE;i<2*En_6x12_XSIZE;i++)
        {
            temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
            ImgData = chardot_6x12[temp];
            LCD_Display_Locate(ImgData, HZ_X, Y + 8);
            HZ_X++;
        }
     }
}

/*****************************************************************************
* Display_InvASCII - 反显示ASCII
* @Param X:X轴坐标  0--191
* @Param Y:Y轴坐标  0--7
* @Param Char:ASCII码
*****************************************************************************/
void GUI_Display_InvASCII(INT8U Char, INT8U X, INT8U Y)
{
    INT8U i, ImgData;
    INT16U temp;
    INT8U HZ_X;      
    
	if(X>=LCD_XSIZE)
	    X=X%LCD_XSIZE;
	if(Y>=LCD_YSIZE)
	    Y=Y%LCD_YSIZE;	
		
    HZ_X = X;
    if(GUIEnglishFont == En_5x8)
    {
        for(i = 0; i < En_5x8_XSIZE; i++)
        {      
            temp=i+(INT16U)(Char-0x20)*5; //要注意数据范围
            ImgData = chardot_5x8[temp]^0xFF;
            LCD_Display_Locate(ImgData, HZ_X, Y);
            HZ_X++;
        }
    } 
    else 
    {
        for(i=0;i<En_6x12_XSIZE;i++)
        {     
            temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
            ImgData = chardot_6x12[temp]^0xFF;
            LCD_Display_Locate(ImgData, HZ_X, Y);
            HZ_X++;
        }
        HZ_X=X;
        for(i=En_6x12_XSIZE;i<2*En_6x12_XSIZE;i++)
        {
            temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
            ImgData = chardot_6x12[temp]^0x3F;//总共12行
            LCD_Display_Locate(ImgData, HZ_X, Y + 8);
            HZ_X++;
        }
    }
}

/*****************************************************************************
* Display_ASCII_UnderLine - 显示一个带有下划线的ASCII
* @Param X:X轴坐标
* @Param Y:Y轴坐标
* @Param Char:ASCII码
******************************************************************************/
void GUI_Display_ASCII_UnderLine(INT8U Char, INT8U X, INT8U Y)
{
    INT8U i, ImgData; 
    INT16U temp;
    INT8U HZ_X; 
	    
    if(X>=LCD_XSIZE)
	    X=X%LCD_XSIZE;
	if(Y>=LCD_YSIZE)
	    Y=Y%LCD_YSIZE;	
	
    HZ_X = X;
    if(GUIEnglishFont == En_5x8)
    {
        for(i = 0; i < En_5x8_XSIZE; i++)
        { 
            temp=i+(INT16U)(Char-0x20)*5; //要注意数据范围
            ImgData = chardot_5x8[temp]|0x80;
            LCD_Display_Locate(ImgData, HZ_X, Y);
            HZ_X++;
        }
    } 
    else 
    {
        for(i=0;i<En_6x12_XSIZE;i++)
        {   
            temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
            ImgData = chardot_6x12[temp];
            LCD_Display_Locate(ImgData, HZ_X, Y);
            HZ_X++;
        }
        HZ_X=X;
        for(i=En_6x12_XSIZE;i<2*En_6x12_XSIZE;i++)
        {   
            temp=i+(INT16U)(Char-0x20)*En_6x12_YSIZE; //要注意数据范围
            ImgData = chardot_6x12[temp]|0x20;
            LCD_Display_Locate(ImgData, HZ_X, Y + 8);
            HZ_X++;
        }
    }
}

void GUI_DispCharAt(INT8U c, INT8U x, INT8U y)
{
    switch (GUITextMode) 
    {
        case GUI_TEXTMODE_NORMAL :
             GUI_Display_ASCII(c, x, y);
             break;
        case GUI_TEXTMODE_REVERSE :
             GUI_Display_InvASCII(c, x, y);
             break;
        case GUI_TEXTMODE_UNDERLINE :
             GUI_Display_ASCII_UnderLine(c, x, y);
             break;
        default :
             break;
    }
}

#if GUI_DispChar_EN
void GUI_DispChar(INT8U c)
{
    GUI_DispCharAt(c, PosX, PosY);
    PosX += 8;
} 
#endif

/*
*****************************************************************************
* GUI_Display_Chinese - 指定位置显示一个16x16的汉字
* @Param x0:X轴坐标0--(192-16)
* @Param y0:Y轴坐标0--(8-2)
* @Param UniCode:汉字内码

*****************************************************************************/

void GUI_Display_Chinese(INT16U UniCode, INT8U x0, INT8U y0) //
{
    INT16U CodeID;
    INT8U  i,ImgData;
    INT8U  HZ_X;  
    
	if(x0>=LCD_XSIZE)
	    x0=x0%LCD_XSIZE;
	if(y0>=LCD_YSIZE)
	    y0=y0%LCD_YSIZE;	
	
    HZ_X = x0;
    //在字库里搜索汉字
    for(CodeID=0; CodeID < hzNum; CodeID++)
    {
        // 找到 指定汉字的 Index 后, 跳出循环
        if( (GB_12[CodeID].Index[0]==UniCode/256) && (GB_12[CodeID].Index[1]==UniCode%256) )
	    {
            break;
        }
        else if(CodeID == (hzNum-1))
        {//未检索到的汉字,显示个"##"提示吧
            GUI_DispCharAt('#',x0,y0);
            GUI_DispCharAt('#',x0+Char_XSIZE,y0);
            return;
        }
    }
//----------------------------------
    switch (GUITextMode) 
    {
        case GUI_TEXTMODE_NORMAL :
          // 写汉字的上半部分  (一个汉字 32 个字节,  显示为2行 * 16列)
            for(i=0; i<Chinese_XSIZE; i++)
            {
		        ImgData = GB_12[CodeID].Msk[i];
                LCD_Display_Locate(ImgData, HZ_X, y0);
                HZ_X++;
            }
            // 写汉字的下半部分
            HZ_X = x0;
            for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
            {
                ImgData = GB_12[CodeID].Msk[i];
                LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
                HZ_X++;
            }
	        break;
        //-----------------------------------------------------------------         
        case GUI_TEXTMODE_REVERSE :
            // 写汉字的上半部分  (一个汉字 32 个字节,  显示为2行 * 16列)
            for(i=0; i<Chinese_XSIZE; i++)
            {
                ImgData = GB_12[CodeID].Msk[i]^0xFF;
                LCD_Display_Locate(ImgData, HZ_X, y0);
                HZ_X++;
            }
            // 写汉字的下半部分
            HZ_X = x0;
            for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
            {
                ImgData = GB_12[CodeID].Msk[i]^0x3F;//总共12行
                LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
                HZ_X++;
            }
	        break;
        //-------------------------------------------------------------------------     
        case GUI_TEXTMODE_UNDERLINE :
          // 写汉字的上半部分  (一个汉字 32 个字节,  显示为2行 * 16列)
            for(i=0; i<Chinese_XSIZE; i++)
            {
                ImgData = GB_12[CodeID].Msk[i];
                LCD_Display_Locate(ImgData, HZ_X, y0);
                HZ_X++;
            }
            // 写汉字的下半部分
            HZ_X = x0;
            for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
            {
                ImgData = GB_12[CodeID].Msk[i]|0x20;
                LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
                HZ_X++;
            }
	        break;
//-------------------------------------------------------------------------     

⌨️ 快捷键说明

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