摘要:本文深入探究了利用 STM32 微控制器驱动 ILI9341 显示屏绘制时钟的技术方案。
在硬件连接方面,采用 FSMC(灵活静态存储控制器)接口,通过合理配置引脚,实现 STM32 与 ILI9341 的高速稳定通信,确保数据能够快速准确地传输至显示屏。
时间获取借助延时函数,通过精确设定延时参数,实现对秒、分、时等时间单位的计数,为时钟绘制提供准确的时间基准。
时钟显示的流畅性则依赖于 STM32 芯片的高速处理能力,其能够快速完成时间数据的运算与图形绘制指令的生成。同时,优化 ILI9341 的屏幕刷新速度,通过调整显示缓存及刷新频率,减少画面卡顿现象。
源代码如下:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "math.h"
int main(void)
{
uint8_t x = 0;
uint8_t lcd_id[12];
uint16_t xx = 0;
uint16_t y = 0;
uint8_t time_minutes = 30;
uint8_t time_hour = 5;
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);
usart_init(115200);
led_init();
lcd_init();
g_point_color = RED;
sprintf((char *)lcd_id, "LCD ID:%04X", lcddev.id);
while (1)
{
switch (0)
{
case 0:
lcd_clear(WHITE);
break;
case 1:
lcd_clear(BLACK);
break;
case 2:
lcd_clear(BLUE);
break;
case 3:
lcd_clear(RED);
break;
case 4:
lcd_clear(MAGENTA);
break;
case 5:
lcd_clear(GREEN);
break;
case 6:
lcd_clear(CYAN);
break;
case 7:
lcd_clear(YELLOW);
break;
case 8:
lcd_clear(BRRED);
break;
case 9:
lcd_clear(GRAY);
break;
case 10:
lcd_clear(LGRAY);
break;
case 11:
lcd_clear(BROWN);
break;
}
lcd_show_string(10, 40, 240, 32, 32, "STM32", RED);
lcd_show_string(10, 80, 240, 24, 24, "TFTLCD TIME CLOCK TEST", RED);
x++;
if (x == 12)
x = 0;
for(int time_t1 = 0;time_t1<=60;time_t1++){
xx = (int)(72*sin(((float)time_t1*6.0)/360.0*3.14*2));
y = (int)(72*cos(((float)time_t1*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0x1234);
if(time_t1%5==0)
lcd_show_num(xx+100-10, y+200-5, (time_t1/5), 2, 16, RED);
}
for(int time_t1 = 0;time_t1<=60;time_t1++){
HAL_Delay(1000);
if(time_t1>=60)
time_minutes++;
if(time_minutes>=60){
time_hour++;
if(time_hour>=60){
time_hour = 0;
}
time_minutes = 0;
}
for(int ii = 0;ii<51;ii++){
xx = -(int)(ii*sin(((float)(time_hour-1)*6.0)/360.0*3.14*2));
y = (int)(ii*cos(((float)(time_hour-1)*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0xffff);
}
for(int ii = 0;ii<51;ii++){
xx = -(int)(ii*sin(((float)time_hour*6.0)/360.0*3.14*2));
y = (int)(ii*cos(((float)time_hour*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0x1234);
}
for(int ii = 0;ii<72;ii++){
xx = -(int)(ii*sin(((float)(time_t1-1)*6.0)/360.0*3.14*2));
y = (int)(ii*cos(((float)(time_t1-1)*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0xffff);
}
for(int ii = 0;ii<72;ii++){
xx = -(int)(ii*sin(((float)time_t1*6.0)/360.0*3.14*2));
y = (int)(ii*cos(((float)time_t1*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0x1234);
}
for(int ii = 0;ii<56;ii++){
xx = -(int)(ii*sin(((float)(time_minutes-1)*6.0)/360.0*3.14*2));
y = (int)(ii*cos(((float)(time_minutes-1)*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0xffff);
}
for(int ii = 0;ii<56;ii++){
xx = -(int)(ii*sin(((float)time_minutes*6.0)/360.0*3.14*2));
y = (int)(ii*cos(((float)time_minutes*6.0)/360.0*3.14*2));
lcd_draw_point(xx+100, y+200, 0x1234);
}
}
LED0_TOGGLE();
delay_ms(1000);
}
}
效果如下,觉得时钟样式不够好,可以自己慢慢调整: