1
按照申请板卡的时间来说,现在也该发个结项贴,不过还没准备好,呵呵,所以整了一个简单的12864的简单显示实验,看到很多坛友也发过12864显示的帖子。没有实现时间显示的全部功能,仅仅实现了简单的时间累加显示。
这里还是强调一下编程的思想,软件尽量做成模块,暴露出来接口给外部调用。同时,对于咱们这些搞 单片机的,就会有一个矛盾,模块分层作的越好,效率相应也会有所降低。但是为了便于移植,和降低软件的耦合性,应该尽量做到模块化,虽然我做的不好。同时和硬件打交道的应该对硬件接口进行封装,对硬件接口进行抽象。
这里我就分了几部分,bsp_oled.c对硬件接口封装,oled.c实现了oled的驱动程序,clock.c和display.c是显示应用程序。
下面是对硬件接口控制部分的封装, IO_CTRL_H和IO_CTRL_L这两个宏的作用就是对IO口的封装。
- #define OLED_DC_H() IO_CTRL_H(OLED_DC_PORT, OLED_DC_PIN)
- #define OLED_DC_L() IO_CTRL_L(OLED_DC_PORT, OLED_DC_PIN)
- #define OLED_SCK_H() IO_CTRL_H(OLED_SCK_PORT, OLED_SCK_PIN)
- #define OLED_SCK_L() IO_CTRL_L(OLED_SCK_PORT, OLED_SCK_PIN)
- #define OLED_SDIN_H() IO_CTRL_H(OLED_SDIN_PORT, OLED_SDIN_PIN)
- #define OLED_SDIN_L() IO_CTRL_L(OLED_SDIN_PORT, OLED_SDIN_PIN)
- #define OLED_CS_H() IO_CTRL_H(OLED_CS_PORT, OLED_CS_PIN)
- #define OLED_CS_L() IO_CTRL_L(OLED_CS_PORT, OLED_CS_PIN)
- #define OLED_RST_H() IO_CTRL_H(OLED_RST_PORT, OLED_RST_PIN)
- #define OLED_RST_L() IO_CTRL_L(OLED_RST_PORT, OLED_RST_PIN)
复制代码
显示函数的主体部分如下,这里仿了一下linux的时间API, time(&timep)获取了系统时间,gmtime(timep, &tm)对系统时间进行了格式转换。ClockShow(tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_ms);就是显示的关键部分,对时钟的绘制都是在这个函数中实现的,实现的比较粗糙。
- void ClockTask(void)
- {
- time_t timep;
- struct tm tm;
- time(&timep);
- gmtime(timep, &tm);
- ClockShow(tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_ms);
-
- }
复制代码
- void ClockShow(int hour, int min, int sec, int ms)
- {
- static int secp = 0;
- static int hourp = 0;
- static int minp =0;
- static int flag = 0;
-
- int hour_h = hour/10;
- int hour_l = hour%10;
- int min_h = min/10;
- int min_l = min%10;
-
- if(ms>500)
- {
-
- //OLED_DisableRefresh();
- if(flag==1)
- {
- flag=0;
- ClockDrawNum(clock.x2, clock.y, 10, FONT32, 1);
- }
- }
- else if(ms<500)
- {
-
- if(flag==0)
- {
- flag = 1;
- OLED_Fill(clock.x2, clock.y, clock.x3,clock.y+FONT32, 0);
- }
- }
- if(secp!=sec)
- {
- secp = sec;
-
- }
- if(minp!=min)
- {
- minp=min;
- ClockDrawNum(clock.x3, clock.y, min_h,FONT32, 1);
- ClockDrawNum(clock.x4, clock.y, min_l, FONT32, 1);
- }
- if(hourp!=hour)
- {
- hourp=hour;
- ClockDrawNum(clock.x0, clock.y, hour_h, FONT32, 1);
-
- ClockDrawNum(clock.x1, clock.y, hour_l, FONT32, 1);
- }
- //OLED_EnableRefresh();
-
- }
复制代码
为了能够产生系统时间,需要在定时器中断中调用time_ballback(int ms)函数,来对系统时间进行计时。如下
- int time_callback(int ms)
- {
- mtime+=ms;
- return 0;
- }
复制代码
|
|