基于arduino和I2C协议OLED12864的电子时钟和菜单功能

说明:

up使用了基于Arduino的 OLED12864 显示,并在此之上编写了具有菜单选择功能的电子时钟。由于仅用了一周的课程设计时间进行编写,且up自身编写水平能力有限,故只能从实现目标的角度来说完成了设计,由于程序还存在着很多改进地方,加上第一次写博客,请路过的各位针对程序和博客提出有意义的意见,谢谢。

--------------------------------以下进入正题------------------------------------

一 系统硬件设计

1.1 系统总体分析

系统主要由三个部分组成,见下图。分别是单片机最小系统板,键盘模块和显示模块,其中键盘模块为单向输入,显示模块为双向输入输出。

1.2 硬件电路设计

1.2.1 单片机最小系统板

此次采用的是arduino UNO R3单片机,其他型号单片机均可兼容,但需要注意Arduino mini可能会存在RAMROM空间不足的情况,一下为最小系统板的连线原理图。图虽然乱但只需注意mega328P的12、13、14、15和18号引脚,分别对应UNO的6,7,8,9和12号引脚,还需注意这五个引脚与键盘的接线方式。

1.2.2 键盘模块

在设计的系统中我们需要用键盘来输入数值。此次键盘共有5个按键,实物中从左至右功能依次为‘菜单’,‘上一个’,‘下一个’,‘是’,‘否’,并均作为独立按键依次连接在arduino UNO的12,9,8,7,6五个I/O口上。
键盘按下相应端口呈高电平,未按下呈低电平,原理图见下

1.2.3 显示模块

本次采用的是显示模块是基于I2C协议的OLED 12864模块,针对arduino使用了库Adafruit_GFX.h和Adafruit_SSD1306.h两个库文件。原理图见下

二 程序设计及调试

2.1 主要子程序设计

2.1.1 键盘键入程序及其流程图

(1)流程图

(2)源程序

void keyboard()
{if (digitalRead(up)== 1){delay(10); if (digitalRead(up)== 1){arrow_pos = arrow_pos - 8;if (arrow_pos < 8)arrow_pos = 24;}}if (digitalRead(down) == 1){delay(10)if (digitalRead(down) == 1){arrow_pos = arrow_pos + 8;if (arrow_pos > 26)arrow_pos = 8;}if (digitalRead(y) == 1){delay(10)if ((digitalRead(y) == 1) && (layer < 13)){layer_b = layer;layer = 10 + arrow_pos / 8;}}if (digitalRead(n) == 1){if (digitalRead(n) == 1){if (layer == 1)flag_menu = 0;layer = layer_b;}}
}

2.1.2 实时时间显示程序

(1) 流程图

(2)源程序

void oled_i2c_go(){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(47, 1);display.print("T I M E");
display.setTextSize(2);
display.setCursor(17, 14);
for (int i = 0; i < 8; i++)        display.print(a[i]);
display.display();
}

2.1.3 实时时间计算程序

(1) 流程图

(2)源程序

void Time_Interrupt()
{if (flag_m == 1){    m1++;flag_m = 0;}if (m1 > 9){m2++; m1 = 0;if (m2 > 5){f1++; m2 = 0;if (f1 > 9){f2++; f1 = 0;if (f2 > 5){s1++; f2 = 0;if ((s2 >= s2set) && (s1 >= s1set))                                         {s2 = 0; s1 = 1; f2 = 0; f1 = 0;if ((s2set == 1) && (s1set == 2))                                       {   if (flag_apm == 0)flag_apm = 1;elseflag_apm = 0;}}else if (s1 > 9)s2++; s1 = 0;}}}
}

2.2 总体程序流程图


注:layer值是判断进入哪个菜单的标志,其中在一级菜单时,layer=1,二级菜单layer=1+二级菜单序号*10

2.3 程序调试和结果分析

2.3.1 程序测试阶段

首先插上电源,自动进入计时界面。在无任何操作的情况下一直为显示实时时间的画面。
按下菜单键,进入第一级菜单,最上部显示标题“M E N U”,下部显示三个子菜单选线,左边有箭头指向子菜单,箭头指向的子菜单可由键盘的“上”和“下”两个功能键进行调整。若想返回实时时间界面,按下功能键“否”即可,若进入子菜单,按下功能键“是”即可。
12小时制与24小时制转换子菜单。进入该子菜单有标题“change 12_24”和两个选项“choose 12”、“choose 24”,使用“上”、“下”功能键进行选择,最后按“是”确定,或按“否”返回一级菜单。
闹钟设定子菜单。进入该子菜单有标题“Set clock”,并有待设定时间“00:00:00”,运用“上”“下”功能键进行滚动设定每一位数,功能键“是”表示确认设定当前位且进入下一位设定,当设定完最后一位按“是”则设定完毕并启动闹钟,功能键“否”表示取消当前位设定并转而设定上一位。若设定的时间不符合规范,则设定失败。当闹钟时间到时,单片机最小系统板上Led灯会亮起或高亮。
时间设定子菜单。进入该子菜单有标题“Set time”,并有待设定时间“00:00:00”,与设定闹钟的方式一致设定实时时间,设定完毕最后一位按下“是”则会返回一级菜单,再返回实时显示界面。

2.3.2 结果分析

从调试结果来看,该设计实现了实时显示时间,12与24小时制的转换,设定闹钟和设定实时时间这4个功能 ,并且实时时间采用了定时器计时,提高时间的准确性。

参考文献

[1] Michael Margolis.Arduino 权威指南[M].北京;人民邮电出版社,2015:210-250
[2] 张荣标.微型计算机原理与接口技术[M].北京:机械工业出版,2018:45-90
[3] Bjarne Stroustrup.C++程序设计:原理与实践[M].北京.机械工业出版社,2017:193-200

附录

程序清单:
https://github.com/tlwwjzx/Arduino-OLED12864-Clock-Menu
注:初次用GitHub,硕士的标签始终不会改,目前本科一枚大佬轻喷。

基于arduino的oled12864电子时钟和菜单功能相关推荐

  1. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  2. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  3. keil c语言 1602时钟代码,基于单片机的LCD1602电子时钟设计.doc

    基于单片机的LCD1602电子时钟设计 设计任务和目的 1.1.设计任务 (1):用单片机设计基于LCD1602的电子时钟,显示时间和日期: (2):误差精度控制在1s/天: (3):具有时间和日期的 ...

  4. 【036】基于51单片机的电子时钟与秒表Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的电子时钟与秒表proteus仿真设计一份: (2).基于51单片机的电子时钟与秒表proteus仿真设计keli源代码一份: (3).基于51单片机的电子时 ...

  5. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  6. 西电A测 | 基于Arduino uno的电子密码锁仿真系统 | 使用Proteus仿真 | Arduino IDE编写

    西电A测 | 基于Arduino uno的电子密码锁仿真系统 | 使用Proteus仿真 | Arduino IDE编写 | ATMEGA328P 电子密码锁系统 Arduino UNO Arduin ...

  7. 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)

    51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...

  8. 基于AT89C51单片机的电子时钟设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87695258?spm=1001.20 ...

  9. 基于8051单片机实现电子时钟+数字秒表设计

    电子时钟+数字秒表设计 概述 设计任务的基本要求 整体方案 电路设计原理 软件设计 元件清单 项目下载地址 概述 电子时钟是一种利用数字电路来显示秒.分.时的计时装置,与传统的机械钟相比,它具有走时准 ...

最新文章

  1. Java项目:基于遗传算法学校排课系统(java+Springboot+Maven+mybatis+Vue+Mysql)
  2. linux 查看 特定进程 内存
  3. c# xml文件新增同级节点_[C#.NET 拾遗补漏]08:强大的LINQ
  4. 曝光!衡中教室高清摄像头记录:不想一辈子吃苦,就必须闻鸡起舞!(转给学生)...
  5. 2017.9.18 HH的项链 思考记录
  6. Oracle 获取月初和月末
  7. springcloud-gateway启动报错ApplicationContextException: Unable to start ServletWebServerApplicationConte
  8. PHPCMS V9.6.0 SQL注入漏洞EXP
  9. drawforeground只有鼠标事件进入才刷新_罗技各系鼠标测评(2020年12月更新)
  10. 有关计算机组装和拆卸的说法,有关计算机组装论文
  11. Cube IDE 的下载安装
  12. 最大功率点跟踪测试软件,最大功率点跟踪(MPPT)
  13. WORD文件拼版生成PDF方法
  14. 服务器lsass占用内存_Lsass.exe进程占用大量内存
  15. 【网页开发】登录注册页面01
  16. 80后男人的脱单技巧
  17. 添加或修改Kindle图书封面
  18. Android Things:外设I/O接口-GPIO
  19. 云服务器deeplearning_吴恩达deeplearning.ai将于11月6日开放第四课,主讲卷积神经网络...
  20. 计算机考研考线代和概率论吗,2018考研数学各章节考点汇总(高数+线代+概率论)...

热门文章

  1. python基础库-python基础库-Pandas
  2. 这个方法可以让你的代码高出一个逼格——掌握 Java Stream 流操作
  3. 余数和问题(编程启蒙)
  4. 三字棋游戏的的设计和代码
  5. MFC单文档中,增加,删除 工具栏图标
  6. 玩转MallBuilder多用户商城
  7. ps图片怎样实现渐变
  8. 城市多杆合一智慧路灯综合杆改造的意义
  9. ASP.NET -- WebForm -- .aspx与.aspx.cs文件
  10. FTP传输一定要注意使用二进制模式