本帖最后由 2829065211 于 2017-12-11 16:58 编辑
探索者画表盘指针时钟,外圆怎么没法显示啊!感觉代码调用没问题啊
主函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "math.h"
int main(void)
{
while(1)
{
calendar_circle_clock_drawpanel(240,400,320,12);
}
}
子函数 .c文件
//画圆形指针表盘
//x,y:坐标中心点
//size:表盘大小(直径)
//d:表盘分割,秒钟的高度
void calendar_circle_clock_drawpanel(u16 x,u16 y,u16 size,u16 d)
{
u16 r=size/2;//得到半径
u16 sx=x-r;
u16 sy=y-r;
u16 px0,px1;
u16 py0,py1;
u16 i;
gui_fill_circle(x,y,r,WHITE); //画外圈
gui_fill_circle(x,y,r-4,BLACK); //画内圈
for(i=0;i<60;i++)//画秒钟格
{
px0=sx+r+(r-4)*sin((app_pi/30)*i);
py0=sy+r-(r-4)*cos((app_pi/30)*i);
px1=sx+r+(r-d)*sin((app_pi/30)*i);
py1=sy+r-(r-d)*cos((app_pi/30)*i);
gui_draw_bline1(px0,py0,px1,py1,0,WHITE);
}
for(i=0;i<12;i++)//画小时格
{
px0=sx+r+(r-5)*sin((app_pi/6)*i);
py0=sy+r-(r-5)*cos((app_pi/6)*i);
px1=sx+r+(r-d)*sin((app_pi/6)*i);
py1=sy+r-(r-d)*cos((app_pi/6)*i);
gui_draw_bline1(px0,py0,px1,py1,2,YELLOW);
}
for(i=0;i<4;i++)//画3小时格
{
px0=sx+r+(r-5)*sin((app_pi/2)*i);
py0=sy+r-(r-5)*cos((app_pi/2)*i);
px1=sx+r+(r-d-3)*sin((app_pi/2)*i);
py1=sy+r-(r-d-3)*cos((app_pi/2)*i);
gui_draw_bline1(px0,py0,px1,py1,2,YELLOW);
}
gui_fill_circle(x,y,d/2,WHITE); //画中心圈
}
//画实心圆
//x0,y0:坐标
//r半径
//color:颜 {MOD}
void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
{
u32 i;
u32 imax = ((u32)r*707)/1000+1;
u32 sqmax = (u32)r*(u32)r+(u32)r/2;
u32 x=r;
gui_draw_hline(x0-r,y0,2*r,color);
for (i=1;i<=imax;i++)
{
if ((i*i+x*x)>sqmax)
{
// draw lines from outside
if (x>imax)
{
gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
}
x--;
}
// draw lines from inside (center)
gui_draw_hline(x0-x,y0+i,2*x,color);
gui_draw_hline(x0-x,y0-i,2*x,color);
}
}
//画水平线
//x0,y0:坐标
//len:线长度
//color:颜 {MOD}
void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
{
if((len==0)||(x0>gui_phy.lcdwidth)||(y0>gui_phy.lcdheight))return;
gui_phy.fill(x0,y0,x0+len-1,y0,color);
}
_gui_phy gui_phy; //gui物理层接口
//gui初始化
void gui_init(void)
{
gui_phy.read_point=LCD_ReadPoint;
gui_phy.draw_point=LCD_Fast_DrawPoint;//快速画点
gui_phy.fill=LCD_Fill;
gui_phy.colorfill=LCD_Color_Fill;
gui_phy.back_color=BACK_COLOR;
gui_phy.lcdwidth=lcddev.width;
gui_phy.lcdheight=lcddev.height;
//设置listbox/filelistbox参数
if(lcddev.width==240)
{
gui_phy.tbfsize=16;
gui_phy.tbheight=20;
gui_phy.listfsize=12;
gui_phy.listheight=20;
}else if(lcddev.width==320)
{
gui_phy.tbfsize=16;
gui_phy.tbheight=24;
gui_phy.listfsize=16;
gui_phy.listheight=24;
}else if(lcddev.width==480)
{
gui_phy.tbfsize=24;
gui_phy.tbheight=32;
gui_phy.listfsize=24;
gui_phy.listheight=32;
}
}
//画一条粗线(方法1)
//x0,y0:起点 x1,y1:终点
//size:线粗细,仅支持:0~2.
//color:颜 {MOD}
void gui_draw_bline1(u16 x0,u16 y0,u16 x1,u16 y1,u8 size,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x1-x0; //计算坐标增量
delta_y=y1-y0;
uRow=x0;
uCol=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++ )//画线输出
{
if(size==0)LCD_Fast_DrawPoint(uRow,uCol,color);//画点
if(size==1)
{
LCD_Fast_DrawPoint(uRow,uCol,color);//画点
LCD_Fast_DrawPoint(uRow+1,uCol,color);//画点
LCD_Fast_DrawPoint(uRow,uCol+1,color);//画点
LCD_Fast_DrawPoint(uRow+1,uCol+1,color);//画点
}
if(size==2)
{
LCD_Fast_DrawPoint(uRow,uCol,color);//画点
LCD_Fast_DrawPoint(uRow+1,uCol,color);//画点
LCD_Fast_DrawPoint(uRow,uCol+1,color);//画点
LCD_Fast_DrawPoint(uRow+1,uCol+1,color);//画点
LCD_Fast_DrawPoint(uRow-1,uCol+1,color);//画点
LCD_Fast_DrawPoint(uRow+1,uCol-1,color);//画点
LCD_Fast_DrawPoint(uRow-1,uCol-1,color);//画点
LCD_Fast_DrawPoint(uRow-1,uCol,color);//画点
LCD_Fast_DrawPoint(uRow,uCol-1,color);//画点
}
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
子函数.h文件
void calendar_circle_clock_drawpanel(u16 x,u16 y,u16 size,u16 d);
void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color);
void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color);
void gui_init(void);
void gui_draw_bline1(u16 x0,u16 y0,u16 x1,u16 y1,u8 size,u16 color);
//gui底层接口
//也就是外部需要实现的函数!
//这里我们需要外部提供4个函数
//1,读点函数;
//2,画点函数;
//3,单 {MOD}填充函数;
//4,彩 {MOD}填充函数
__packed typedef struct
{
u8 language; //GUI当前语言,取值范围0~GUI_LANGUAGE_NUM-1;
u16 memdevflag; //存储设备状态;
//bit7:0,存储设备7~0在位状态;0,不在位;1,在位;
//bit15:8,存储设备7~0使用状态;0,不在使用中;1,正在使用中
//本例中,存储设备0表示:SD卡
// 1表示:SPI FLASH
// 2表示:U盘
//其他,未用到
//这四个参数,会控制listbox/filelistbox等控件的具体效果
u8 tbfsize; //filelistbox/listbox时,顶部/底部横条字体大小
u8 tbheight; //filelistbox/listbox时,顶部/底部横条高度
u8 listfsize; //list字体大小
u8 listheight; //list条目高度
u16 back_color; //背景 {MOD}
u16(*read_point)(u16,u16); //读点函数
void(*draw_point)(u16,u16,u16); //画点函数
void(*fill)(u16,u16,u16,u16,u16); //单 {MOD}填充函数
void(*colorfill)(u16,u16,u16,u16,u16*); //彩 {MOD}填充函数
u16 lcdwidth; //LCD的宽度
u16 lcdheight; //LCD的高度
}_gui_phy;
extern _gui_phy gui_phy;
一周热门 更多>