對于電子時鐘而言,雖然我們可以在程序中對RTC芯片寫入初始時間數據,但按鍵調時功能也是必不可少的,它可以讓我們更加靈活的進行時間調節校準。
1
菜單顯示結構
本實驗中顯示菜單結構如下圖所示:
菜單結構
其中menu00是首頁正常的時間日期顯示界面,然后通過搖桿按鍵切換頁面,進行日期調節和時間調節選擇,然后對應跳轉年月日和時分秒的調節頁面。
根據結構圖,結合多級菜單思路,很容易得到搖桿按鍵與界面對應的相關數據。
//定義按鍵操作數據
KEY_TABLE table[9] =
{
{0, 0, 0, 0, 1, (*menu00)},
{1, 1, 2, 0, 3, (*menu11)},
{2, 1, 2, 0, 6, (*menu12)},
{3, 3, 4, 1, 3, (*menu21)},
{4, 3, 5, 1, 4, (*menu22)},
{5, 4, 5, 1, 5, (*menu23)},
{6, 6, 7, 2, 6, (*menu24)},
{7, 6, 8, 2, 7, (*menu25)},
{8, 7, 8, 2, 8, (*menu26)},
};
2
實驗材料
3
實驗步驟
1.根據原理圖搭建電路圖。
DS1302模塊的VCC和GND連接Uno開發板的3.3V和GND。DS1302模塊的CLK、DAT、RST對應連接Uno開發板的4、3、2引腳。OLED的VCC和GND分別連接開發板的3.3V和GND,OLED的SDA、SCL分別連接開發板的A4、A5引腳。雙軸按鍵搖桿模塊的VCC、GND分別連接開發板的5V、GND,模塊的X軸輸出、Y軸輸出分別連接開發板的模擬引腳A0、A1。
實驗原理圖如下圖所示:
實驗原理圖
2.代碼較長,部分截取如下,完整代碼請在文末獲取。
...
void show_time(Time tim)
{
char date[20];
char timer[20];
snprintf(date, sizeof(date), "%04d-%02d-%02d",
tim.yr, tim.mon, tim.date);
snprintf(timer, sizeof(timer), "%02d:%02d:%02d",
tim.hr, tim.min, tim.sec);
oled.clearDisplay();//清屏
oled.setCursor(15, 2);//設置顯示位置
oled.println("--CLOCK--");
oled.setCursor(4, 25);//設置顯示位置
oled.println(date);
oled.setCursor(18, 50);//設置顯示位置
oled.println(timer);
oled.display(); // 開顯示
}
...
void loop() {
keyValue = keyScan();
if (keyValue != 0) //每發生一次有效按鍵就根據按鍵功能獲取對應函數并執行
{
switch (keyValue)//獲取按鍵對應序號
{
case 1: funIndex = table[funIndex].right; break;
case 2: funIndex = table[funIndex].left; break;
case 3: funIndex = table[funIndex].down; break;
case 4: funIndex = table[funIndex].up; break;
}
current = table[funIndex].operation;//根據需要獲取對應需要執行的函數
(*current)();//執行獲取到的函數
}
if (menu == 0)//只有在首頁才進行時間刷新
{
updatTime();
}
}
3.連接開發板,設置好對應端口號和開發板類型,進行程序下載。
程序下載
-
DS1302
+關注
關注
8文章
448瀏覽量
50483 -
RTC
+關注
關注
2文章
511瀏覽量
65903 -
SDA
+關注
關注
0文章
123瀏覽量
27962 -
OLED顯示屏
+關注
關注
6文章
211瀏覽量
30547 -
GND
+關注
關注
2文章
525瀏覽量
38448
發布評論請先 登錄
相關推薦
評論