嵌入式课程设计-- 基于LCD的电子时钟实验

画线函数:void line(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,unsigned char draw)

以中心的坐标为起点,使用while函数与指针最外圈的点比较,不断延长直至相等,所以事先计算出时针,分针和秒针三个同心圆最外圈点的坐标,以便带入函数。也同圆类似,要考虑不同象限点的情况,根据不同的位置带参数到画点函数中描绘。

第五节 MAIN函数的局部原理分析

首先让我们先来看一下main函数的宏定义与变量定义,如下:

从上面的程序可以看出,所使用的头文件主要是config.h。这个文件的内容不再详述,后面的附录会给出。

同时该程序还给出了时分秒的初始值,其字符型为i8,也即char型(在其它文件中有定义)。初始值为:hour=0,min=0,sec=0,ms=0;例如如果当前时间为6:20,十九秒,则将对应的数字修改即可。同理,年月日的初始值设定是一样的,并且字符类型也为char类型。 下面是针对字符类型的宏定义: #define I8 char

#define U8 unsigned char #define I16 short

#define U16 unsigned short #define I32 long #define U32 unsigned long #define I16P I16 #define U16P U16

下面我们来看看对于时针,分针,秒针的坐标设定,程序如下:

- 8 -

上述为秒针的坐标定义,SpaceXS[61]对应于秒针的横坐标值,SpaceYS[61]对应于纵坐标值。第一个点对应的是十二点的位置,即(160,30)点。因此只要设定两个指针,分别指向这两个数组的首地址,每当时间秒变化时,就将这两个指针加一,从而指向下一坐标,达到动态变化的效果。

分针,时针的定义与上述定义完全一样,只不过时针定义时变量个数为十三个,具体如下定义:

SpaceXH[13]={160,175,185,190,185,175,160,145,135,130,135,145,160}, SpaceYH[13]={50,55,65,80,95,105,110,105,95,80,65,55,50};

此外还要设定一些指针,用来指向各个数组的首地址,来方便坐标的变化,定义如下:

*Placex=&SpaceXS[0],*Placey=&SpaceYS[0],*Placexm=&SpaceXM[0], *Placeym=&SpaceYM[0],*Placexh=&SpaceXH[0],*Placeyh=&SpaceYH[0];

下面我们先来介绍此程序中用到的几个重要的函数。

首先来说Set_Color()函数,这是一个设定颜色的函数,此函数的代码在其他文件中经行了编写,只要在括号中输入相应的颜色就可,颜色定义如下: #define GUI_BLACK 0x000000 #define GUI_BLUE 0x0000FF #define GUI_GREEN 0x00FF00 #define GUI_CYAN 0xf0f000 #define GUI_RED 0xFF0000

#define GUI_MAGENTA 0x800080 #define GUI_BROWN 0x2020a0

#define GUI_DARKGRAY 0x404040 #define GUI_GRAY 0x808080

- 9 -

#define GUI_LIGHTGRAY 0xd0d0d0 #define GUI_LIGHTBLUE 0xf08080

#define GUI_LIGHTGREEN 0x80f080 #define GUI_LIGHTCYAN 0x80f0f0

#define GUI_LIGHTRED 0x8080f0 #define GUI_LIGHTMAGENTA 0xf080f0

#define GUI_YELLOW 0xF0f000 #define GUI_WHITE 0xffffff

下面来说Fill_Circle (x, y, r)函数。 如下所示:

void Fill_Circle (U16 x0, U16 y0, U16 r) {

U32 i;

U32 imax = ((int)((int)r*707))/1000+1; U32 sqmax = (int)r*(int)r+(int)r/2; U16 x = r;

LCD_DrawHLine(x0-r,y0,x0+r);

for (i=1; i<= imax; i++) {

if ((i*i+x*x) >sqmax) {

if (x>imax) {

LCD_DrawHLine (x0-i+1,y0+x, x0+i-1); LCD_DrawHLine (x0-i+1,y0-x, x0+i-1); } x--; }

LCD_DrawHLine(x0-x,y0+i, x0+x); LCD_DrawHLine(x0-x,y0-i, x0+x); } }

当此函数执行完以后会在液晶显示仪显示出一个实心圆,与前面的

setcolor函数配合可以画出特定颜色的的圆,x为横坐标,y为纵坐标,r为半径。

还有一个为fillrect()函数。也即矩形填充函数,此函数可以在显示屏上显示特定大小的矩形图案,并结合颜色设定函数得出相应的颜色相应函数如下:

void Fill_Rect(U16 x0, U16 y0, U16 x1, U16 y1) {

LCD_FillRect(x0,y0,x1,y1);

- 10 -

}

既然是实时时钟,那么程序是如何实现指针的偏转的,是靠什么思路实现的。下面的程序是以秒针为例简述这其中的原理的。

可以看到,程序中有擦除上一秒的程序。之所以能靠一个设定颜色的程序来将其擦出是因为,之前已经将底色设定为该指针擦除时的颜色。既然该指针与底色有一样的颜色,所以观察者就看不到之前的指针了,所以就达到了擦出的目的,当显示下一秒时,只要将指针的颜色设定为与底色不同,即达到了显示的效果。

同时,还要显示分针和时针。

对于擦除分针和时针得原理与上面所述大同小异,这里只给出程序,不在详细讨论,程序如下:

- 11 -

联系客服:779662525#qq.com(#替换为@)