探索者画表盘指针时钟,外圆怎么没法显示啊!感觉代码调用没问题啊

2019-07-20 10:31发布

本帖最后由 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;


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。