欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4948|回復: 2
收起左側

基于51單片機和ILI9325液晶驅動芯片的GUI函數

[復制鏈接]
ID:102668 發表于 2016-1-16 05:16 | 顯示全部樓層 |閱讀模式
基于51單片機和ILI9325液晶驅動芯片的GUI函數  液晶是320×240的
部分頭文件沒寫出來  如字庫需要這些自己建立
 
GUI頭文件
#ifndef GUI_H
#define GUI_H
#include"config.h"
/*GUI函數*/
void GUI_clearscreen(uint b_color);//清屏
void GUI_Point(uchar x, uint y, uint color);//畫點
void GUI_sprintf_chartobit(uchar x, uint y,uchar dat, uint color,uint b_color);//無符號字符型數以二進制形式顯示
void GUI_sprintf_chartohex(uchar x, uint y,uchar dat, uint color,uint b_color);//無符號字符型數以十六進制形式顯示
void GUI_sprintf_chartodec(uchar x,uint y,uchar dat,uint color,uint b_color);//無符號字符型數以十進制形式顯示
void GUI_sprintf_nu(uchar x, uint y,uchar nu, uint color,uint b_color);//顯示1位16進制數
void GUI_HLine(uchar x, uint y, uchar length, uint color);//畫橫線
void GUI_RLine(uchar x, uint y, uint high, uint color);//畫豎線
void GUI_line(uint x1,uint y1,uint x2,uint y2,uint color);//畫直線
void GUI_DisPicture(uchar x, uint y, uchar length, uint high);//顯示圖片(圖標)
void GUI_sprintf_char(uchar x, uint y,uchar c, uint color,uint b_color);//顯示英文或數字字符
void GUI_sprintf_string(uchar x, uint y,char code *s, uint color,uint b_color);//顯示英文字符串
void GUI_sprintf_HZ(uchar x, uint y, uint color,uint b_color);//顯示預定義漢字字符串
void GUI_box(uchar sx,uint sy,uchar ex,uint ey,uint color);//畫實心矩形
void GUI_rectangle( uchar sx,uint sy,uchar ex,uint ey,uint color);//畫空心矩形
void GUI_wrul(uchar x, uint y, unsigned long num, uint color,uint b_color);//以十進制形式顯示無符號長整型數
void GUI_wrlval(uchar x, uint y,unsigned long num,uchar bits,uchar dp,uint color,uint b_color);//以十進制形式顯示長變量
uint RGB(uchar R,uchar G,uchar B);//RGB顏色混合

/*定義常用顏色的顏色碼*/
#define RED 0xf800 //紅
#define YELLOW 0xffe0 //黃
#define GREEN 0x07e0 //綠
#define CYAN 0x07ff //青
#define BLUE 0x001f //藍
#define PURPLE 0xf81f //紫
#define BLACK 0x0000 //黑
#define WHITE 0xffff //白
#define GRAY 0x7bef //灰

#endif
 
 
GUI函數
#include "stc.h"
#include "top51.h"
#include "GUI/gui.h"
#include "LCM/ILI9325.h"
#include "bmp.h"
#include "16x8.h"
#include "chinese.h"
/************************************
清屏
入口參數: b_color是背景顏色。
出口參數: 無
說明:使用背景顏色清除TFT模塊屏幕的全部顯示內容。
*************************************/
void GUI_clearscreen(uint b_color)
{
 uint i,j;
 LCD_setwindow(0,0,240,320);
 for (i=0;i<320;i++)
 {
  for(j=0;j<240;j++)
   write_data_u16(b_color);
 }
}

/*********************************************
畫點
入口參數: (x,y)是點的坐標,color 是點的顏色。
出口參數: 無
說明:用指定的顏色在指定的坐標位置上畫出一個點。
**********************************************/
void GUI_Point(uchar x, uint y, uint color)

 LCD_setxy(x,y);
 write_data_u16(color);
}

/**********************************************************
無符號字符型數以二進制形式顯示
入口參數:(x,y)是顯示內容的左上角坐標,color 是顯示字符的顏色,
          b_color是背景顏色。
出口參數: 無
說明:無符號字符型數用指定的顏色和背景顏色在指定的坐標位置上
以二進制形式顯示出來。
************************************************************/
void GUI_sprintf_chartobit(uchar x, uint y,uchar dat, uint color,uint b_color)

 uchar i ;
 for(i=0;i<8;i++)
 {
  if((dat&(0x80>>i))==(0x80>>i))
  {
   GUI_sprintf_nu(x,y,1,color,b_color) ;
  }
  else
  {
   GUI_sprintf_nu(x,y,0,color,b_color) ;
  }
  x+=8 ;
 }
}

/**********************************************************
無符號字符型數以十六進制形式顯示
入口參數:(x,y)是顯示內容的左上角坐標,dat 是欲顯示的無符號字符型數,
          color 是顯示字符的顏色,b_color是背景顏色。
出口參數: 無
說明:無符號字符型數用指定的顏色和背景顏色在指定的坐標位置上
      以十六進制形式顯示出來。
************************************************************/
void GUI_sprintf_chartohex(uchar x, uint y,uchar dat, uint color,uint b_color)

 uchar i ;
 GUI_sprintf_nu(x,y,dat>>4,color,b_color) ;
 x+=8 ;
 GUI_sprintf_nu(x,y,dat&0x0f,color,b_color) ;
}

/**********************************************************
無符號字符型數以十進制形式顯示
入口參數:(x,y)是顯示內容的左上角坐標,dat是欲顯示的無符號字符型數,
          color 是顯示字符的顏色,b_color是背景顏色。
出口參數: 無
說明:無符號字符型數用指定的顏色和背景顏色在指定的坐標位置上
      以十進制形式顯示出來。
************************************************************/
void GUI_sprintf_chartodec(uchar x,uint y,uchar dat,uint color,uint b_color)
{
 GUI_sprintf_char(x,y,dat/100+'0',color,b_color);
 GUI_sprintf_char(x+8,y,dat/10%10+'0',color,b_color);
 GUI_sprintf_char(x+16,y,dat%10+'0',color,b_color);
}

/*********************************************
顯示1位16進制數
入口參數: (x,y) 是顯示內容的左上角坐標,c:欲顯示的1位16進制數,color:顏色,b_color:背景顏色。
出口參數: 無
說明:用指定位置上顯示1位16進制數。
**********************************************/
void GUI_sprintf_nu(uchar x, uint y,uchar nu, uint color,uint b_color)

   uchar  s_x=0 ,s_y=0, temp=0 ;
   uint j;
   if (nu>9)
   {nu=nu+7;}
   nu=nu+16;
   for(s_y=0;s_y<16;s_y++)
   {
   if(s_y+y<320)
    {
   j=nu;
     j=j*16+s_y;
     temp=font16x8[j];
       //temp = font16x8[nu*16+s_y] ;
       for( s_x=0 ; s_x<8 ; s_x++ )
       {
        if(x+s_x<240)
        {
         if((temp&(0x80>>(s_x))) == (0x80>>(s_x))  )
         {
        GUI_Point(x+s_x, y+s_y,color) ;
         }
         else
         {
          GUI_Point(x+s_x, y+s_y,b_color) ;
       }
      }
     }
    }
 }
}
/**********************************************************
畫橫線
入口參數: (x,y)是橫線起點坐標,length是橫線長度,color 是橫線顏色。
出口參數: 無
說明:用指定的顏色在指定位置上畫出指定長度的一條橫線。
************************************************************/
void GUI_HLine(uchar x, uint y, uchar length, uint color)

 LCD_setwindow(x,y,x+length-1,y);
 do
 { 
  write_data_u16(color);//逐點顯示,描出水平線
  length--;
 }while(length);
}
/**********************************************************
畫豎線
入口參數: (x,y)是豎線起點坐標,high 豎線高度,color 是豎線顏色。
出口參數: 無
說明:用指定的顏色在指定位置上畫出指定長度的一條豎線。
************************************************************/
void GUI_RLine(uchar x, uint y, uint high, uint color)

   LCD_setwindow(x,y,x,y+high-1);
   do
   { 
  write_data_u16(color);// 逐點顯示,描出垂直線
  high--;
   }while(high); 
}

/********************************************************************
畫直線(可以畫任意方向直線,包括橫線、豎線、斜線)。
入口參數: (x1,y1)起點, (x2,y2)終點, color顏色。
出口參數: 無
說明:用指定的顏色在指定的兩點間畫出一條直線。
***********************************************************************/
void GUI_line(uint x1,uint y1,uint x2,uint y2,uint color) 

    uint t; 
    int xerr=0,yerr=0,delta_x,delta_y,distance; 
    int incx,incy; 
    uint row,col; 
    delta_x = x2-x1;//計算坐標增量 
    delta_y = y2-y1; 
    col=x1; 
    row=y1; 
    if(delta_x>0) incx=1;//設置單步方向 
    else  
    { 
        if(delta_x==0) incx=0;//垂直線 
        else {incx=-1;delta_x=-delta_x;} 
    } 
    if(delta_y>0)incy=1; 
    else 
    { 
        if(delta_y==0) incy=0;//水平線 
        else {incy=-1;delta_y=-delta_y;} 
    } 
    if(delta_x>delta_y) distance=delta_x;//選取基本增量坐標軸 
    else distance=delta_y; 
    for(t=0;t<=distance+1;t++) 
 {                                     //畫線輸出 
     GUI_Point(col, row, color);
        xerr+=delta_x; 
        yerr+=delta_y; 
       if(xerr>distance) 
        { 
            xerr-=distance; 
            col+=incx; 
        } 
        if(yerr>distance) 
        { 
            yerr-=distance; 
            row+=incy; 
        } 
    } 
}

/**********************************************************
顯示圖片(圖標)
入口參數:(x,y)是開始點的坐標,length是圖片長度,high是圖片高度。//pic 圖片數組的指針
出口參數: 無
說明:用指定位置上顯示事先定義的圖片。
要顯示的圖片事先定義在bmp.h中的pic[]數組中,
如果想修改圖片大小、內容,請修改bmp.h中的pic[]數組,
建議用Image2Lcd軟件將你要顯示的圖象自動轉換為數組數據。
************************************************************/
//void GUI_DisPicture(uchar x, uint y, uchar length, uint high ,const uchar *pic)
void GUI_DisPicture(uchar x, uint y, uchar length, uint high)
{
   uint temp=0,tmp=0,num=0;
 LCD_setwindow(x,y,x+length-1,y+high-1);
 num=length*high*2;
 do
 { 
    //temp=pic[tmp]|( pic[tmp+1]<<8);
    temp=pic[tmp+1];
    temp=temp<<8;
    temp=temp|pic[tmp];
    write_data_u16(temp);//逐點顯示
    tmp+=2;
 }while(tmp<num);
}

/*********************************************
顯示英文或數字字符
入口參數:(x,y) 是顯示內容的左上角坐標,c:顯示的英文字符,
          color:顏色,b_color:背景顏色。
出口參數: 無
說明:用指定位置上顯示單個英文字符或數字字符。
**********************************************/
void GUI_sprintf_char(uchar x, uint y,uchar c, uint color,uint b_color)

 uchar  s_x ,s_y, temp ;
   uint j;
   c -= 32;
   for( s_y=0 ; s_y < 16 ; s_y++ )
   {
  if(s_y+y<320)
    {
   j=c;
     j=j*16+s_y;
     temp=font16x8[j];
       //temp = font16x8[c*16+s_y] ;
       for( s_x=0 ; s_x<8 ; s_x++ )
       {
       if(x+s_x<240)
        {
         if((temp&(0x80>>(s_x))) == (0x80>>(s_x))  )
         {
        GUI_Point(x+s_x, y+s_y,color) ;
         }
         else
         {
          GUI_Point(x+s_x, y+s_y,b_color) ;
       }
      }
     }
    }
 }
}
 
/*********************************************
顯示英文字符串
入口參數:(x,y) 是顯示內容的左上角坐標,*s:英文字符串指針,
          color:顏色,b_color:背景顏色。
出口參數: 無
說明:在指定位置上顯示英文字符串。
**********************************************/
void GUI_sprintf_string(uchar x, uint y,char code *s, uint color,uint b_color)

 for(;*s!='\0';s++)
 {
  GUI_sprintf_char(x, y,*s, color,b_color);
  x=x+8;
 }
 
 //while (*s)
 // {
 // GUI_sprintf_char(x, y,*s, color,b_color);
 // s++;
 // x=x+8;
 // }
}

/*********************************************
顯示預定義漢字字符串
入口參數:(x,y) 是顯示內容的左上角坐標,color:顏色,b_color:背景顏色。
出口參數: 無
說明:在指定位置上顯示預定義的中文字符串。
      要顯示的中文字符串事先定義在chinese.h中的china_char[]數組中,
  如果想修改中文字符串長度、內容,請修改chinese.h中的
  china_char[]數組,建議用字模提取軟件zimoV2.2將你要顯示的
  中文字符串自動轉換為數組數據。
**********************************************/
void GUI_sprintf_HZ(uchar x, uint y, uint color,uint b_color)
{
 uchar  s_x=0 ,s_y=0, temp=0 ; 
 uchar n;
 uint j,words;
 words=sizeof(china_char)/32;
 for( n=0 ; n<words ; n++ )
   {
   for( s_x=0 ; s_x<16 ; s_x++ )
    {
     if(s_x+x<240)
     {
        j=n;
        j=j*32+s_x;
        temp = china_char[j] ;
        //temp = china_char[n*32+s_x] ;
      for( s_y=0 ; s_y<8 ; s_y++ )
         {
         if(y+s_y<320)
          {
          if((temp&(0x80>>(s_y))) == (0x80>>(s_y))  )
           {
           GUI_Point(x+s_x+n*16, y+s_y,color) ;
           }
          else
           {
           GUI_Point(x+s_x+n*16, y+s_y,b_color) ;
        }
     }
      }
     }
  }
  for( s_x=0 ; s_x<16 ; s_x++ )
    {
     if(s_x+x<240)
     {
      j=n;
      j=j*32+s_x+16;
      temp = china_char[j] ;
      //temp = china_char[n*32+s_x+16] ;
       for( s_y=0 ; s_y<8 ; s_y++ )
         {
         if(y+s_y<320)
          {
          if((temp&(0x80>>(s_y))) == (0x80>>(s_y))  )
           {
           GUI_Point(x+s_x+n*16, y+s_y+8,color) ;
           }
          else
           {
           GUI_Point(x+s_x+n*16, y+s_y+8,b_color) ;
        }
     }
      }
     }
  }
 }
}
 
/*********************************************
畫實心矩形
入口參數: (sx,sy)左上角頂點坐標, (ex,ey)右下角頂點坐標, color顏色
出口參數: 無
說明:在指定位置上畫出實心矩形。
**********************************************/
void GUI_box(uchar sx,uint sy,uchar ex,uint ey,uint color)
{
 uint temp;  
 LCD_setwindow(sx,sy,ex,ey);
   sx=ex-sx+1;
 sy=ey-sy+1;
 while(sx--)
 {
   temp=sy;
  while(temp--)
   { 
   write_data_u16(color);
  }
 }
}

/*********************************************
畫空心矩形
入口參數: (sx,sy)左上角頂點坐標, (ex,ey)右下角頂點坐標, color顏色
出口參數: 無
說明:在指定位置上畫出空心矩形。
**********************************************/
void GUI_rectangle( uchar sx,uint sy,uchar ex,uint ey,uint color)
{
 GUI_line(sx,sy,ex,sy,color);
 GUI_line(sx,sy,sx,ey,color);
 GUI_line(ex,sy,ex,ey,color);
 GUI_line(sx,ey,ex,ey,color);
}
/*********************************************
以十進制形式顯示無符號長整型數
入口參數:(x,y) 是顯示內容的右上角坐標;
    num是欲顯示的無符號長整型數
        num的數值范圍為:0~4,294,967,295(十進制),
    也就是說利用該函數,我們最多將一個10位十進制數顯示在LCD屏上;
    color:顏色,b_color:背景顏色。
出口參數: 無
說明:將一個無符號長整型數以十進制形式顯示在TFT屏上。
注意:在使用該函數時,不論最終顯示的數有幾位,它都將在LCD屏幕上
      占10個字符的空間(顯示的多位十進制數不足10位時,
  本函數會在有效顯示數字前面補空格)。
**********************************************/
void GUI_wrul(uchar x, uint y, unsigned long num, uint color,uint b_color)
{
 unsigned long temp;
 uchar i;
 for(i=0;i<10;i++)
 {
  if(num!=0)
  {
   temp=num/10;
   GUI_sprintf_char(x-7,y,num-temp*10+'0',color,b_color);
   num=temp;
  }
  else/*往前寫滿10位,也就是前面都寫空格*/
  {
   GUI_sprintf_char(x-7,y,' ',color,b_color);
  }
  x=x-8;/*設置光標在文字插入后自動左移*/
 }
}
/*********************************************
以十進制形式顯示長變量
入口參數:
   x,y ----是顯示內容的右上角坐標
    num ----欲顯示的長變量
   bits ----允許顯示的位數
     dp ----小數點位置
  color ----顏色
b_color ----背景顏色
出口參數: 無
說明:
將一個長變量的數值以十進制形式顯示在TFT屏上,可以根據需要確定
是否顯示小數點以及小數點位置,也可以確定在TFT屏幕上顯示的位數。
注意:
1、要顯示的數據比規定的顯示位數多,規定的位全部寫-,表示數據溢出。
2、本函數實際上相當于GUI_wrul函數的增強版,如果我們指定bits=10 dp=0,
如下所示:
GUI_wrlval(20,239,tp,10,0,WHITE,BLACK);
那么,其作用和GUI_wrul函數完全一樣。
**********************************************/
void GUI_wrlval(uchar x, uint y,unsigned long num,uchar bits,uchar dp,uint color,uint b_color)
{
 char str[10];/*無符號長整型數轉換為字符串是10個,所以需要10個單元存儲*/ 
 unsigned long temp;
 uchar i;
 //LCD_wrcmd(CUR_AUTO_L);/*設置光標在文字插入后自動左移*/
 for(i=0;i<bits;i++)
 {
  if(num!=0)
  {
   temp=num/10;
   str[i]=num-temp*10+'0';
   num=temp;
  }
  else/*往前寫*/
  {
   if(i>=dp)str[i]=0x20;/*小數點前零都變空格*/
   else str[i]='0';/*小數點后零保留*/
  }
 }
 i=0;
 if (num!=0)/*要顯示的數據比規定的顯示位數多,數據顯示溢出*/
 {
  while(i<bits)/*往前寫滿規定的位數,也就是前面都寫空格,直到規定的位數*/
  {
   GUI_sprintf_char(x-7,y,'-',color,b_color);/*規定的位全部寫-,表示數據溢出*/
   i++;
   x=x-8;
   if (i==dp)
   {
    GUI_sprintf_char(x-7,y,'.',color,b_color);/*插入小數點*/
    x=x-8;
   }
  }
 }
 else
 {
  while(i<bits)/*顯示前面的有效數字*/
  {
   if ((i==dp)&(str[dp]==0x20))
   {
    GUI_sprintf_char(x-7,y,'.',color,b_color);/*插入小數點*/
    x=x-8;
    GUI_sprintf_char(x-7,y,'0',color,b_color);/*小數點前為0時要補寫0*/
    x=x-8;
   }
   else
   {
    if ((i==dp)&(i!=0))
    {
     GUI_sprintf_char(x-7,y,'.',color,b_color);/*插入小數點*/
     x=x-8;
    }
    GUI_sprintf_char(x-7,y,str[i],color,b_color);
    x=x-8;
   }
   i++;    
  }
 }
}

/*********************************************
RGB顏色混合
入口參數:R(紅色分量)0-255,G(綠色分量)0-255,B(藍色分量)0-255
出口參數: 按R5-G6-B5格式混合后的16位顏色碼。
說明:將電腦上常見的R8-G8-B8格式轉換成8位單片機常用的R5-G6-B5格式。
**********************************************/
uint RGB(uchar R,uchar G,uchar B)
{
 return((uint)(R&0XF8)<<8|(uint)(G&0XFC)<<3|(uint)(B&0XF8)>>3);
}
 
回復

使用道具 舉報

ID:106703 發表于 2016-4-14 21:33 | 顯示全部樓層
能把其他的頭文件發給我嗎 3q   qq郵箱823822517@qq.com
回復

使用道具 舉報

ID:364764 發表于 2018-7-6 17:13 | 顯示全部樓層
你好能發我一下頭文件嗎,415746969@qq.com
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表