ili9341显示屏–时钟


​ 要求:

  1. 使用Arduino控制LCD显示屏ili9341,在屏幕上显示一个尽可能大的时钟表盘,包含时针、分针、秒针。时钟能够正常走字计时。在屏幕上空余的地方显示日期。
  2. Arduino上连接几个按钮,按下按钮时可以调整日期和时间。

注:题目来自HBUE的硬件编程考题,本代码仍有缺陷,显示器闪动严重,且不够简洁,代码电路仅供学习交流使用,转载使用时请注明来处。

代码

/*
SOFTWARE: Proteus 8 Professional
CSDN: 空白之子
*/
#include <stdint.h>
#include <TFTv2.h>
#include <SPI.h>#define PI 3.1415926
int i, j, k, m;
int hour1, hour2, min1, min2, second1, second2;
int year = 2021, month = 6, day = 18;
int temp[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char clockNum[12][3] = { "12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"};
char num[12][3] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};void setup()
{Serial.begin(9600);SPSR |= (1 << SPI2X);                       // 2x SPI speed TFT_BL_ON;                                  // turn on the background lightTft.TFTinit();                              //init TFT libraryfor (int ii = 2; ii <= 8; ++ii)pinMode(ii,  INPUT);OutClock();
}//显示器240*320
void loop()
{for (i = 0; i < 24; ++i){for (j = 0; j < 60; ++j){for (k = 0; k < 60; ++k){Adjust();OutTime();Clear();}}}CorrectDate();
}//显示裱框
void OutClock(void)
{int m, x, y;Tft.drawCircle(120, 110, 90,WHITE); for ( m = 0; m < 12; ++m){x = 120 + sin(PI * (m  /  6.0) ) * 85;y = 110 - cos(PI * (m  /  6.0) ) * 85;Tft.drawString(clockNum[m], x, y, 2, WHITE);}
}//显示时间日期表针
void OutTime(void)
{//时针、分针、秒针if (j == 59 || i == 0){Tft.drawLine(120,110,hour1,hour2,BLACK); }if (i == 59 || i == 0){Tft.drawLine(120,110,min1,min2,BLACK); }Tft.drawLine(120,110, second1, second2, BLACK);hour1 = 120 + sin(PI * (i  /  6.0) ) * 35;hour2 = 110 - cos(PI * (i  /  6.0) ) * 35;min1 = 120 + sin(PI * (j  /  30.0) ) * 55;min2 = 110 - cos(PI * (j  /  30.0) ) * 55;second1 = 120 + sin(PI * (k  /  30.0) ) * 70;second2 = 110 - cos(PI * (k  /  30.0) ) * 70;Tft.drawLine(120,110, second1, second2, WHITE);Tft.drawLine(120,110,min1,min2,GREEN); Tft.drawLine(120,110,hour1,hour2,RED);
//数字时间日期Tft.drawString(num[year/1000], 45, 260, 2, WHITE);Tft.drawString(num[year/100%10], 60, 260, 2, WHITE);Tft.drawString(num[year%100/10], 75, 260, 2, WHITE);Tft.drawString(num[year%10], 90, 260, 2, WHITE);Tft.drawString("-", 105, 260, 2, WHITE);Tft.drawString(num[month/10], 120, 260, 2, WHITE);Tft.drawString(num[month%10], 135, 260, 2, WHITE);Tft.drawString("-", 150, 260, 2, WHITE);Tft.drawString(num[day/10], 165, 260, 2, WHITE);Tft.drawString(num[day%10], 180, 260, 2, WHITE);Tft.drawString(num[i/10], 60, 230, 2, WHITE);Tft.drawString(num[i%10], 75, 230, 2, WHITE);Tft.drawString(":", 90, 230, 2, WHITE);Tft.drawString(num[ j/10], 105, 230, 2, WHITE);Tft.drawString(num[j%10], 120, 230, 2, WHITE);Tft.drawString(":", 135, 230, 2, WHITE);Tft.drawString(num[k/10], 150, 230, 2, WHITE);Tft.drawString(num[k%10], 165, 230, 2, WHITE);delay(1000);
}//更正日期
void CorrectDate(void)
{day++;if ( (year % 4 == 0 && year %100 != 0) || (year %400 == 0) )temp[1] = 29;if (day > temp[month - 1] ){day = 1;month++;}if (month > 12){month = 1;year++;}
}//调整时间日期
void Adjust(void)
{if (digitalRead(2) == HIGH){if (digitalRead(7) == HIGH)year++;if (digitalRead(8) == HIGH)year--;}if (digitalRead(3) == HIGH){if (digitalRead(7) == HIGH)month++;if (digitalRead(8) == HIGH)month--;}if (digitalRead(4) == HIGH){if (digitalRead(7) == HIGH)day++;if (digitalRead(8) == HIGH)day--;}if (digitalRead(5) == HIGH){if (digitalRead(7) == HIGH)i++;if (digitalRead(8) == HIGH)i--;}if (digitalRead(6) == HIGH){if (digitalRead(7) == HIGH)j++;if (digitalRead(8) == HIGH)j--;}if (k < 0 || k >= 60)k = 0;if (j < 0 || j >= 60)j = 0;if (i < 0 || i >= 24)i = 0;
}//部分清屏
void Clear(void)
{Tft.drawLine(120,110,hour1,hour2,BLACK); Tft.drawLine(120,110,min1,min2,BLACK); Tft.drawLine(120,110, second1, second2, BLACK); Tft.drawString(num[year/1000], 45, 260, 2, BLACK);Tft.drawString(num[year/100%10], 60, 260, 2, BLACK);Tft.drawString(num[year%100/10], 75, 260, 2, BLACK);Tft.drawString(num[year%10], 90, 260, 2, BLACK);Tft.drawString("-", 105, 260, 2, BLACK);Tft.drawString(num[month/10], 120, 260, 2, BLACK);Tft.drawString(num[month%10], 135, 260, 2, BLACK);Tft.drawString("-", 150, 260, 2, BLACK);Tft.drawString(num[day/10], 165, 260, 2, BLACK);Tft.drawString(num[day%10], 180, 260, 2, BLACK);Tft.drawString(num[i/10], 60, 230, 2, BLACK);Tft.drawString(num[i%10], 75, 230, 2, BLACK);Tft.drawString(":", 90, 230, 2, BLACK);Tft.drawString(num[ j/10], 105, 230, 2, BLACK);Tft.drawString(num[j%10], 120, 230, 2, BLACK);Tft.drawString(":", 135, 230, 2, BLACK);Tft.drawString(num[k/10], 150, 230, 2, BLACK);Tft.drawString(num[k%10], 165, 230, 2, BLACK);
}

电路

效果

ili9341显示屏--时钟相关推荐

  1. ESP32驱动3.2寸ILI9341显示屏+XPT2046触摸,GUIslice用户图形库

    ESP32的主板ESPDUINO-32如下: 屏用如下的: 显示驱动用TFT_eSPI,这个显示的速度比adafruit ILI9341快10倍. 一.配置TFT_eSPI: arduino IDE ...

  2. LED显示屏二次开发接口的设计方案

    引言 在LED 显示屏工程应用中,有单块显示屏项目,但更多的是多块显示屏项目.对于单块显示屏,直接使用厂商配置的控制软件就满足要求了:但对于多块显示屏,尤其是系统集成项目,厂商配置的控制软件就很难满足 ...

  3. 使用MLX90640自制红外热像仪(四):stm32f103c8t6刷320x240分辨率屏的时间测试

    要显示MLX90640的数据,需要每次把320*240个像素点全部刷新一次.现在来测试下stm32f103c8t6使用普通IO刷屏. 72M主频的stm32f103c8t6刷TFT,全屏一直刷新测试 ...

  4. LCD屏参:手把手教你计算LCD屏参(proch值)

    LCD屏参(proch值)解释和计算 Linux内核的lcd控制器使用clcd_panel结构体表示一个LCD屏的硬件参数: /* include/linux/fb.h */   struct fb_ ...

  5. MTK 驱动开发(18)---LCD 参数理解

    转载自http://blog.csdn.net/longxiaowu/article/details/24319933 Linux内核的amba lcd控制器使用clcd_panel结构体表示一个LC ...

  6. LCD fb driver for linux 参数计算

    本文参考了:http://www.linuxidc.com/Linux/2011-01/31800.htm 感谢该文的作者. Linux内核的amba lcd控制器使用clcd_panel结构体表示一 ...

  7. 4.EMC整改案案例解析及分析(静电辐射发射)。

    一:静电 静电是生活中常见的问题,设备在进行EMC设计时候,静电放电是不能缺少的项目,静电问题直接影响到设备的使用. 减轻静电放电现象影响的一些常用方法包括: 1.绝缘    2.正确接地    3. ...

  8. LCD屏参:手把手教你配置LCD屏参(proch值)

    LCD屏参(proch值)解释和计算 Linux内核的lcd控制器使用clcd_panel结构体表示一个LCD屏的硬件参数: /* include/linux/fb.h */ struct fb_vi ...

  9. STM32学习之ILI9341控制显示屏输出(一)

    本实验工具: STM32F407ZGT6                    液晶显示屏2.8寸                 显示屏控制芯片:ILI9341 本液晶显示屏内部包含一个ILI934 ...

最新文章

  1. Selenium3自动化测试——17.控制滑动解锁
  2. parted如何将磁盘所有空间格式化_CentOS下大于2T的硬盘格式化问题
  3. win7倒计时桌面小工具_iOS 14系统面板截图曝光,新增桌面小工具,越来越像安卓了...
  4. 一个特别棒的远程在线学习方法的分享!!!妈妈再也不怕我的网课录屏啦学不进去啦!!!
  5. 关于castle和Could not find the dialect in the configuration错误
  6. Scrapy 下载器 中间件(Downloader Middleware)
  7. 敏捷开发团队管理系列之五:大型研发团队的切分(刚参加3.17 MDP团队管理场次的读者请看)...
  8. Java垃圾回收器的工作原理
  9. python基于经纬度距离汇聚点_python实现两个经纬度点之间的距离和方位角
  10. 硅谷NewGen:AI棋至拐点,推动下一代技术变革
  11. PHP中strtotime()的使用
  12. DL实战(2):SiamFC - TensorFlow配置
  13. 【系统分析师之路】第五章 复盘软件工程(开发模型开发方法)
  14. 手机电源管理芯片一般在哪
  15. JAVA学习 API_day03(字符串编码, 泛型, 数据结构, Collection)
  16. 微信应用号(小程序)开发IDE配置
  17. react强制页面刷新
  18. Java基础知识学完了,还在看着控制台上输出的结果发呆吗?还不来认识认识GUI编程(初识GUI)
  19. VMware vSphere 6.7 虚拟化搭建及配置完整详细手册 | 周末送资料
  20. 复习笔记5-nginx、rabbitmq、redis、jenkins、Docker、ELK、日志、Hadoop

热门文章

  1. 阿联酋哈姆丹国际摄影大赛 多位中国摄影师得奖
  2. IOS开发之——MapKit地图
  3. 蓝桥杯2022年1月STEMA C++中级组编程真题解析
  4. iPhone的Push功能原理浅析
  5. UML之教学管理系统——5、Rational Rose画状态机图(一)
  6. macOS 开发 - 10.15 Screen Recording 屏幕录制 授权及跳转
  7. java读取excel文件单元格英文出现乱码问题的解决方法
  8. XDown 2.0.2.3中文版:小编自用款mac下载工具
  9. java控制网页_教你用纯Java实现一个网页版的Xshell(附源码)
  10. Android最新面试实战总结