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

📄 gui.c

📁 240*320 TFT屏用M16读取SD卡内BMP格式图片.和汉字显示程序(字库也是存在SD卡里
💻 C
字号:
/******************************************
//测试系统
//芯片:ATmega16L
//频率:8MHz内频
//电压:3.3V
*******************************************/

#include"gui.h"
#include <avr/pgmspace.h> 


const unsigned char suzi[] PROGMEM={


/*--  0  --*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

/*--  1  --*/

0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,

/*--  2  --*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,

/*--  3  --*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

/*--  4  --*/

0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,

/*--  5  --*/

0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

/*--  6  --*/

0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

/*--  7  --*/

0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,

/*--  8  --*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,

/*--  9  --*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,

/*--  ??×?:  A  --*/
/*--  ??ì?12;  ′?×?ì?????ó|μ?μ??ó?a£o?íx??=8x16   --*/
0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00,

/*--  ??×?:  B  --*/
/*--  ??ì?12;  ′?×?ì?????ó|μ?μ??ó?a£o?íx??=8x16   --*/
0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x44,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,

/*--  ??×?:  C  --*/
/*--  ??ì?12;  ′?×?ì?????ó|μ?μ??ó?a£o?íx??=8x16   --*/
0x00,0x00,0x00,0x3E,0x42,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x44,0x38,0x00,0x00,

/*--  ??×?:  D  --*/
/*--  ??ì?12;  ′?×?ì?????ó|μ?μ??ó?a£o?íx??=8x16   --*/
0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,

/*--  ??×?:  E  --*/
/*--  ??ì?12;  ′?×?ì?????ó|μ?μ??ó?a£o?íx??=8x16   --*/
0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x42,0x42,0xFC,0x00,0x00,

/*--  ??×?:  F  --*/
/*--  ??ì?12;  ′?×?ì?????ó|μ?μ??ó?a£o?íx??=8x16   --*/
0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x40,0x40,0xE0,0x00,0x00,

};




/************************************
//清屏函数
//改变color数值可以改变清屏的背景颜色
*************************************/
void  GUI_ClearSCR(void)
{  
    uint16 x,y,color;
	color=0x0000;
 	LCD_WriteCommand(0,0x02,0x00);	  //X
	LCD_WriteCommand(1,0x03,0x0000);  //Y
	LCD_WriteCommand(0,0x04,0xEF);	  //结束列数(0~239)	
	LCD_WriteCommand(1,0x05,0x013F);  //结束行数(0~319)
	
   	LCD_WriteRegister(0x0E);          //写显示数据区
	
	for(y=0;y<320;y++)
	{
	  for(x=0;x<240;x++)
	    {
	     LCD_WriteData(color);
		}
	}
	
}


/*********************************************
//画点函数
//(x,y)点的坐标量,color 点的颜色
**********************************************/
void  GUI_Point(uint8 x, uint16 y, uint16 color)
{  
	LCD_WriteCommand(0,0x02,x);	      //X
	LCD_WriteCommand(1,0x03,y);       //Y
	LCD_WriteCommand(0,0x04,x);	      //结束列数(0~239)	
	LCD_WriteCommand(1,0x05,y);       //结束行数(0~319)
	
	LCD_WriteRegister(0x0E);          //写显示数据区
	LCD_WriteData(color);
}


/*********************************************
//显示数字函数
//(x,y)点的坐标量,nu数字值,color颜色,b_color背景颜色
**********************************************/
void  GUI_sprintf_nu(uint8 x, uint16 y,uint8 nu, uint16 color,uint16 b_color)
{  
  uint8  s_x ,s_y, temp ;
  
  for( s_y=0 ; s_y < 16 ; s_y++ )
    {
	
	 if(s_y+y<320)
	   {
	   
	     temp = pgm_read_byte(suzi+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)开始点的坐标量,color 线的颜色,
************************************************************/
void  GUI_sprintf_chartobit(uint8 x, uint16 y,uint8 bin_data, uint16 color,uint16 b_color)
{  
  uint8 i ;
  for(i=0;i<8;i++)
    {
	  if((bin_data&(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)开始点的坐标量,color 线的颜色,
************************************************************/
void  GUI_sprintf_chartohex(uint8 x, uint16 y,uint8 hex_data, uint16 color,uint16 b_color)
{  
  uint8 i ;

		  GUI_sprintf_nu(x,y,hex_data>>4,color,b_color) ;
		  x+=8 ;
		  GUI_sprintf_nu(x,y,hex_data&0x0f,color,b_color) ;

 
}


/**********************************************************
//画横线函数
//(x,y)开始点的坐标量,color 线的颜色, length 横线长度
************************************************************/
void  GUI_HLine(uint8 x, uint16 y, uint8 length, uint16 color) 
{  

   LCD_WriteCommand(0,0x02,x);	        //X
   LCD_WriteCommand(1,0x03,y);          //Y
   LCD_WriteCommand(0,0x04,x+length-1);	//结束列数(0~239)	
   LCD_WriteCommand(1,0x05,y);          //结束行数(0~319)
	
   LCD_WriteRegister(0x0E);             //写显示数据区
	
	do{  
       LCD_WriteData(color);	       // 逐点显示,描出水平线
       length--;
      }while(length);
}

/**********************************************************
//画竖线函数
//(x,y)开始点的坐标量,color 线的颜色, high 竖线高度
************************************************************/
void  GUI_RLine(uint8 x, uint16 y, uint16 high, uint16 color) 
{  
   
    LCD_WriteCommand(0,0x02,x);	        //X
	LCD_WriteCommand(1,0x03,y);         //Y
	LCD_WriteCommand(0,0x04,x);	        //结束列数(0~239)	
	LCD_WriteCommand(1,0x05,y+high-1);  //结束行数(0~319)
	
	LCD_WriteRegister(0x0E);          //写显示数据区
	
   do{  
      LCD_WriteData(color);	          // 逐点显示,描出垂直线
      high--;
     }while(high);	
}




/**********************************************************
//显示图片函数
//(x,y)开始点的坐标量
//length 图片长度, high 图片高度
//pic 图片数组的指针
************************************************************/
void  GUI_DisPicture(uint8 x, uint16 y, uint8 length, uint16 high ,const uint8 *pic)
{
    uint16 temp,tmp=0,num=0;
    LCD_WriteCommand(0,0x02,x);	            //X
	LCD_WriteCommand(1,0x03,y);             //Y
	LCD_WriteCommand(0,0x04,x+length-1);	//结束列数(0~239)	
	LCD_WriteCommand(1,0x05,y+high-1);      //结束行数(0~319)
	num=length*high*2;
	
	LCD_WriteRegister(0x0E);                //写显示数据区
	
	do{  
	   temp=pic[tmp]| pic[tmp+1]<<8;
       LCD_WriteData(temp);	            // 逐点显示
	   tmp+=2;
	   
      } while(tmp<num);
}


/******************************************************************** 
函 数 名:line()
功    能:画线
说    明:在12864屏上画线
入口参数:tx,ty ,xe,ye,   color
          起点    终点     颜色
返 回 值:无
***********************************************************************/
void GUI_line(uint x0,uint16 y0,uint xt,uint16 yt,uint16 color)  
{  
    uint16 t;  
    int    xerr=0,yerr=0,delta_x,delta_y,distance;  
    int    incx,incy;  
    uint row,col;  
    delta_x    = xt-x0;                            //计算坐标增量  
    delta_y    = yt-y0;  
    col    = x0;  
    row    = y0;  
    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;  
        }  
    }  
}



⌨️ 快捷键说明

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