数码之家

 找回密码
 立即注册
搜索
查看: 8050|回复: 27

[STM] STM32F103制作模拟时钟成功

[复制链接]
发表于 2020-2-7 09:46:09 | 显示全部楼层 |阅读模式


      LCD320*240是个好东西,之前介绍了用LCD320*240做一个俄罗斯方块游戏贪吃蛇游戏,今天再介绍一点其他的好玩的东西-----用LCD320*240做一个模拟指针式时钟。用LCD320*240做一个模拟指针式时钟,其实主要用的是LCD320*240(RA8835)的绘图功能:B站视频地址:https://www.bilibili.com/video/av87242330

      1.利用圆心坐标和半径画一个圆作为表盘
      2.利用两点间画线功能画出时分秒指针。
      让我们一起来做一个LCD320*240模拟指针式时钟,Let\'s GO!!
     LCD320*240的底层驱动很简单,利用时序图可以轻松解决,这部分就跳过了。画圆,画直线之前介绍过了.现在说说怎么画指针,界面.具体看之前我发的帖子!!!!!


有了画线的方法,我们还不能画出时分秒指针,因为画线需要起点坐标和末点坐标。指针是从圆心这一点指向这一刻时间的一条线,起点坐标有了,就是圆盘的圆心坐标,但是末点坐标不知道。比如1秒,秒针由圆心坐标指向1秒的位置,这个1秒的位置在哪??我们可以由圆心坐标和半径,以及时间的角度算出:

/***************************************************
函数名称:LcdTimeX(uint8 Length,uint8 Angle)
函数功能:计算指针的X坐标
输入参数:circle_x:圆心横坐标
          Length  :半径长度
                 Angle   :角度
输出参数: x坐标B站视频地址:https://www.bilibili.com/video/av87242330
****************************************************/
unsigned char Lcd_TimeX(unsigned char circle_x,unsigned char Length,unsigned char Angle)
{
   unsigned char x;
   if((Angle>0) && (Angle<=15))
   {  
     x = circle_x + Length * (sin(PI * Angle / 30));   
   }
   else if(Angle > 15 && Angle <= 30)   
   {  
      x = circle_x + Length * cos((PI * Angle) / 30 - (PI / 2 ));
   }
   else if(Angle > 30 && Angle <= 45)
   {
       x = circle_x - Length * sin((PI * Angle) / 30- PI);
   }
   else
   {
       x = circle_x-Length * cos((PI * Angle) / 30 - ((3 * PI) / 2));
   }  
        return x;                       
}B站视频地址:https://www.bilibili.com/video/av87242330

/***************************************************
函数名称:LcdTimeY(uint8 Length,uint8 Angle)
函数功能:计算指针的Y坐标
输入参数:circle_y:圆心纵坐标
          Length  :半径长度
                 Angle   :角度
输出参数: Y坐标
****************************************************/
unsigned char Lcd_TimeY(unsigned char circle_y,unsigned char Length,unsigned char Angle)
{
   unsigned char y;
   if((Angle>0) && (Angle<=15))
   {  
      y = circle_y - Length * (cos(PI * Angle / 30));   
   }
   else if(Angle > 15 && Angle <= 30)   
   {  
      y = circle_y + Length * sin((PI * Angle) / 30 - (PI / 2 ));
   }
   else if(Angle > 30 && Angle <= 45)
   {
       y = circle_y + Length * cos((PI * Angle) / 30- PI);
   }
   else
   {
       y = circle_y - Length * sin((PI * Angle) / 30 - ((3 * PI) / 2));
   }
   return y;                       
}
好了,所有的东西都准备齐全了,开工!!

先画表盘:
void init_Point_Clock() //初始化表盘
{
      unsigned char i;
      Lcd_Circle(32,32,31,1);//画圆  圆心坐标(32,32) 半径31
      for(i=0;i<60;i++)
     {
        if((i%5)==0)      //画刻度
       {
           Lcd_Line(Lcd_TimeX(32,30,i),Lcd_TimeY(32,30,i),Lcd_TimeX(32,27,i),Lcd_TimeY(32,27,i),1);                                       
       }
    }
}
我用的是定时器做的,这一时刻的时间与上一时刻不一样时,把上一时刻的指针消除掉,显示这一时刻的指针

//【0】:上一时刻时间
//【1】:这一时刻时间
struct POINT_CLOCK
{
        unsigned char hour;
        unsigned char minute;
        unsigned char second;

}Point_Time[2];


/*========================================================================
*name:Display_Pointer(struct POINT_CLOCK AA,unsigned char color)
*function:显示时、分、秒指针
*参    数:结构体: 时分秒   
*                   color: 0不显示  1:显示
*注:秒针长24
        分针长17
         秒针长12
=========================================================================*/
void Display_Pointer(struct POINT_CLOCK AA,unsigned char color)        //指针显示
{
        Lcd_Line(Lcd_TimeX(32,24,AA.second),Lcd_TimeY(32,24,AA.second),32,32,color);         
        Lcd_Line(Lcd_TimeX(32,17,AA.minute),Lcd_TimeY(32,17,AA.minute),32,32,color);        
        Lcd_Line(Lcd_TimeX(32,12,AA.minute/10+5*(AA.hour%12)),Lcd_TimeY(32,12,AA.minute/10+5*(AA.hour%12)),32,32,color);                                                         
}



/*========================================================================
*name:Display_PointClock(struct POINT_CLOCK AA,unsigned char color)
*function:显示时、分、秒指针
*参    数:结构体0:存放上一个时分秒   》》》两者不同时,刷新显示
           结构体1:存放这一个时分秒   》》》
*
*                   color:0不显示  1:显示
=========================================================================*/
void Display_PointClock()        //指针式时钟显示
{
        if(Point_Time[0].second!=Point_Time[1].second)      //秒刷新
        {
                Lcd_Line(Lcd_TimeX(32,24,Point_Time[0].second),Lcd_TimeY(32,24,Point_Time[0].second),32,32,0);
        }
        if(Point_Time[0].minute!=Point_Time[1].minute)    //分刷新
        {
                 Lcd_Line(Lcd_TimeX(32,17,Point_Time[0].minute),Lcd_TimeY(32,17,Point_Time[0].minute),32,32,0);        
        }
        if((Point_Time[0].minute/10+5*(Point_Time[0].hour%12))!=(Point_Time[1].minute/10+5*(Point_Time[1].hour%12)))   //时刷新显示
        {
        Lcd_Line(Lcd_TimeX(32,12,Point_Time[0].minute/10+5*(Point_Time[0].hour%12)),Lcd_TimeY(32,12,Point_Time[0].minute/10+5(Point_Time[0].hour%12)),32,32,0);        
        }
        Display_Pointer(Point_Time[1],1);        //现在的指针式时钟显示
        Point_Time[0]=Point_Time[1];
}

B站视频地址:https://www.bilibili.com/video/av87242330


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 5家元 +115 收起 理由
stdzlqz + 20 謝謝分享
2n3055 + 20 認真發帖
家睦 + 50
潜隆 + 10 謝謝分享
人艰不拆了 + 15

查看全部打赏

发表于 2020-2-7 10:17:29 | 显示全部楼层

回帖奖励 +2 家元

先拿来奖励再说,哈哈:titter:
回复 支持 反对

使用道具 举报

发表于 2020-2-7 10:30:19 | 显示全部楼层

回帖奖励 +2 家元

STM32F103制作模拟时钟成功:handshake:
回复 支持 反对

使用道具 举报

发表于 2020-2-7 10:37:45 | 显示全部楼层

回帖奖励 +2 家元

这个耗电量有些大
回复 支持 反对

使用道具 举报

发表于 2020-2-7 10:40:46 | 显示全部楼层
都是高手,超级厉害:lol:
回复 支持 反对

使用道具 举报

发表于 2020-2-7 10:52:02 | 显示全部楼层
这个钟的精确度怎样啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 10:53:38 | 显示全部楼层
damz 发表于 2020-2-7 10:52
这个钟的精确度怎样啊?

准确,用的定时器我测试过.没有用RTC,RTC不准我用过
回复 支持 反对

使用道具 举报

发表于 2020-2-7 11:03:52 | 显示全部楼层
蛮好的,时针应三点宽,分针二点宽好看些
回复 支持 反对

使用道具 举报

发表于 2020-2-7 13:39:45 | 显示全部楼层
这个很棒,赞一个
回复 支持 反对

使用道具 举报

发表于 2020-2-7 16:02:16 | 显示全部楼层
STM32F103制作模拟时钟成功  这时钟很漂亮!!!
回复 支持 反对

使用道具 举报

发表于 2020-2-22 20:43:52 | 显示全部楼层
谢谢分享
有一个RA8806的320240的屏,学习学习
回复 支持 反对

使用道具 举报

发表于 2020-2-23 19:24:14 | 显示全部楼层
这个可以做个玩玩:loveliness:
回复 支持 反对

使用道具 举报

发表于 2020-2-24 18:59:29 | 显示全部楼层
20多年前用DOS自带的QBASIC写过一个类似的时钟。用参数方程算出指针点坐标,连线即可。
回复 支持 反对

使用道具 举报

发表于 2021-2-11 16:28:27 | 显示全部楼层
画圆画直线的原理可以讲一下吗?:doubt:
回复 支持 反对

使用道具 举报

发表于 2021-2-14 08:24:21 来自手机浏览器 | 显示全部楼层
解得123 发表于 2021-2-11 16:28
画圆画直线的原理可以讲一下吗?

懂程序的都是大神,厉害
回复 支持 反对

使用道具 举报

发表于 2021-9-14 20:28:03 | 显示全部楼层
STM32用不起,别的都还好说。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-15 05:54:05 | 显示全部楼层
jpdd521 发表于 2021-9-14 20:28
STM32用不起,别的都还好说。。

哈哈哈哈哈哈哈哈哈哈哈哈哈h
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-24 11:35:49 | 显示全部楼层
就很棒,超级优秀,可惜没有开源,不过还好吧,基本函数给了
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-24 14:14 , Processed in 0.218400 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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