📄 gui.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 + -