有了画线的方法,我们还不能画出时分秒指针,因为画线需要起点坐标和末点坐标。指针是从圆心这一点指向这一刻时间的一条线,起点坐标有了,就是圆盘的圆心坐标,但是末点坐标不知道。比如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
isplay_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
isplay_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