OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5480|回复: 5

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

[复制链接]

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-6-27
在线时间
28 小时
发表于 2017-12-11 16:37:05 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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:颜色
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:颜色
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:颜色
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,单色填充函数;
//4,彩色填充函数
__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;                                                        //背景色                  
        u16(*read_point)(u16,u16);                                //读点函数
        void(*draw_point)(u16,u16,u16);                        //画点函数
         void(*fill)(u16,u16,u16,u16,u16);                //单色填充函数           
         void(*colorfill)(u16,u16,u16,u16,u16*);        //彩色填充函数         
        u16 lcdwidth;                                                        //LCD的宽度
        u16 lcdheight;                                                        //LCD的高度
}_gui_phy;

extern _gui_phy gui_phy;


这是我的效果

这是我的效果
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-6-27
在线时间
28 小时
 楼主| 发表于 2017-12-11 16:49:45 | 显示全部楼层
  就是感觉这两句没有执行 gui_fill_circle(x,y,r,WHITE);                //画外圈
                                       gui_fill_circle(x,y,r-4,BLACK);                //画内圈
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-13 01:16:24 | 显示全部楼层
2829065211 发表于 2017-12-11 16:49
就是感觉这两句没有执行 gui_fill_circle(x,y,r,WHITE);                //画外圈
                     ...

仿真找问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-6-27
在线时间
28 小时
 楼主| 发表于 2017-12-13 15:28:44 | 显示全部楼层

原子哥,我从主函数最里面的子函数开始测试,在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;
       

        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;
        }
}   


调用填充函数LCD_Fill(240,400,340,400,RED);画直线还是可以   

        gui_phy.fill=LCD_Fill;  这一句里面调用gui_phy.fill(240,500,339,500,RED);这一句就没法显示了,这是什么原因啊


回复

使用道具 举报

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-6-27
在线时间
28 小时
 楼主| 发表于 2017-12-13 15:32:23 | 显示全部楼层

主函数

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
//ALIENTEK 探索者STM32F407开发板 实验13
//LCD显示实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK
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);

int main(void)
{
        u8 lcd_id[12];                                //存放LCD ID字符串
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);      //初始化延时函数
        uart_init(115200);                //初始化串口波特率为115200       
        LED_Init();                                          //初始化LED
        LCD_Init();           //初始化LCD FSMC接口
        POINT_COLOR=RED;      //画笔颜色:红色
        sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组  函数功能:把格式化的数据写入某个字符串                                        
          while(1)
        {                 

                POINT_COLOR=RED;          
                LCD_ShowString(30,40,210,24,24,"Explorer STM32F4");       
                LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
                LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
                LCD_ShowString(30,110,200,16,16,lcd_id);                //显示LCD ID                                                       
                LCD_ShowString(30,130,200,12,12,"2014/5/4");          

//    gui_fill_circle(240,400,100,RED);                //画外圈
                LCD_Draw_Circle(240,200,100);
               
    LCD_Fill(240,400,340,400,RED);
        //        LCD_Fill(240,400,340,400,RED);
               
                gui_phy.fill(240,500,340,500,RED);
               
                LED0=!LED0;         
                delay_ms(1000);       
        }
}

//画实心圆
//x0,y0:坐标
//r半径
//color:颜色
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:颜色
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初始化
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;
        }
}   





.h文件

//gui底层接口
//也就是外部需要实现的函数!
//这里我们需要外部提供4个函数
//1,读点函数;
//2,画点函数;
//3,单色填充函数;
//4,彩色填充函数
__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;                                                        //背景色                  
        u16(*read_point)(u16,u16);                                //读点函数
        void(*draw_point)(u16,u16,u16);                        //画点函数
        void(*fill)(u16,u16,u16,u16,u16);                //单色填充函数           
        void(*colorfill)(u16,u16,u16,u16,u16*);        //彩色填充函数          
        u16 lcdwidth;                                                        //LCD的宽度
        u16 lcdheight;                                                        //LCD的高度
}_gui_phy;
extern _gui_phy gui_phy;







我实在是没有找出哪里的问题,能帮我看一下嘛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-14 01:13:28 | 显示全部楼层
2829065211 发表于 2017-12-13 15:32
主函数

#include "sys.h"

单步跟踪啊!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 22:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表