基于arduino的oled12864电子时钟和菜单功能

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

说明:

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

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

一 系统硬件设计

1.1 系统总体分析

系统主要由三个部分组成,见下图。分别是单片机最小系统板,键盘模块和显示模块,其中键盘模块为单向输入,显示模块为双向输入输出。
基于arduino的oled12864电子时钟和菜单功能_第1张图片

1.2 硬件电路设计

1.2.1 单片机最小系统板

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

1.2.2 键盘模块

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

1.2.3 显示模块

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

基于arduino的oled12864电子时钟和菜单功能_第4张图片

二 程序设计及调试

2.1 主要子程序设计

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

(1)流程图

基于arduino的oled12864电子时钟和菜单功能_第5张图片

(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(10if (digitalRead(down) == 1){
			arrow_pos = arrow_pos + 8;
			if (arrow_pos > 26)
				arrow_pos = 8;
	}
	if (digitalRead(y) == 1)
	{
		delay(10if ((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) 流程图

基于arduino的oled12864电子时钟和菜单功能_第6张图片

(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) 流程图

基于arduino的oled12864电子时钟和菜单功能_第7张图片

(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;
							else
								flag_apm = 0;
						}
					}
					else if (s1 > 9)
						s2++; s1 = 0;
				}
			}
		}
}

2.2 总体程序流程图

基于arduino的oled12864电子时钟和菜单功能_第8张图片
注: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,硕士的标签始终不会改,目前本科一枚大佬轻喷。

你可能感兴趣的:(萌新)