2019年2月19日 星期二

ROSA 系統開發 65 ─ MENU 選單

https://4rdp.blogspot.com/2019/02/rosa-65-menu.html


上一期 ROSA 開發處理了日期與時間,因為 Nokia 5110 LCD 可顯示 48 x 84 pixels,所以它可顯示 6 x 14 字元,因此弄一個功能選單,本文就此說明。

第一行顯示日期時間,第二行顯示選單標題以反黑標示,第三到第六行為選單內容,另外左邊保留一 > 符號,用來表示選擇某個選項。

#include "..\ROSA_DEFINE.h"

#if defined(DISPLAY_NONE)
  #define ledPin 13  // 第13隻接腳控制 LED 明滅。
  byte state = 0;

  void ROSA_DISPLAY_SETUP() {
    // put your setup code here, to run once:
    pinMode(ledPin, OUTPUT);
  }

  void ROSA_DISPLAY_LOOP() {
    state = 1 - state;
    if (state==0)
      digitalWrite(ledPin, LOW); // 設定PIN13腳位為低電位= 0V ,LED 熄滅
    else
      digitalWrite(ledPin, HIGH); // 設定PIN13腳位為高電位= 5V ,LED 發亮
  }

  void ROSA_DISPLAY_DATE() {
  }
  
  void ROSA_DISPLAY_TIME() {
  }
#elif defined(DISPLAY_5110)
  #include
  #include
  Adafruit_PCD8544 display = Adafruit_PCD8544(9, 10, 11, 13, 12);

  char items[5];
  char select;

  void ROSA_DISPLAY_SETUP() {
    // put your setup code here, to run once:
    display.begin();
    // init done

    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(BLACK);
  }

  void ROSA_DISPLAY_LOOP() {
    display.clearDisplay();
    display.setCursor(0,0);
    display.print(PRODUCT);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println(VERSION);
    display.setTextColor(BLACK);
    display.setCursor(0,30);
    //display.display();
  }
  
  void ROSA_DISPLAY_DATE() {
  char buf[5];
  sprintf(buf, "2%03d.", year);
    display.print(buf);
  sprintf(buf, "%02d.", month);
    display.print(buf);
  sprintf(buf, "%02d", day);
    display.println(buf);
    display.display();
  }
  
  void ROSA_DISPLAY_TIME() {
  char buf[3];
  sprintf(buf, "%02d:", hour);
    display.print(buf);
  sprintf(buf, "%02d:", minute);
    display.print(buf);
  sprintf(buf, "%02d", second);
    display.println(buf);
    display.display();
  }
  
  void ROSA_DISPLAY_DATE_TIME(byte location) {
  char buf[3];
  if (location == 0) {
      display.clearDisplay();
      display.setCursor(0,0);
      display.setTextColor(BLACK);
  }
  sprintf(buf, "%02d.", month);
    display.print(buf);
  sprintf(buf, "%02d ", day);
    display.print(buf);

  sprintf(buf, "%02d:", hour);
    display.print(buf);
  sprintf(buf, "%02d:", minute);
    display.print(buf);
  sprintf(buf, "%02d", second);
    display.print(buf);
    display.display();
  }

  #define ROSA_MENU(hd, it1, it2, it3, it4, sel)  {items[0]=hd; items[1]=it1; items[2]=it2; items[3]=it3; items[4]=it4; select=sel;}

  #define MENU_TEXT(ln)  {for (byte i=0 ; i<12 ; i++){display.print((char) pgm_read_byte(&MENUTEXT[ln][i]));}}

  void ROSA_DISPLAY_MENU() {
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.setCursor(0,8);
    display.print("  ");
    MENU_TEXT(items[0]);
    display.setTextColor(BLACK);
    display.setCursor(12,16);
    MENU_TEXT(items[1]);
    display.setCursor(12,24);
    MENU_TEXT(items[2]);
    display.setCursor(12,32);
    MENU_TEXT(items[3]);
    display.setCursor(12,40);
    MENU_TEXT(items[4]);
    display.setCursor(0,(select+1)*8);
    display.print(">");
    display.display();
  }
#endif


對於程式設計有興趣的朋友,可以透過這專案的進行,學習 ROSA 開發是如何逐步建置,只要比對每個版本的差異,就知道程式變動的情形。各位在參考 ROSA 開發的同時,你可以一邊構思,未來你會怎樣利用這些基本功能設計自己的作品。

本程式放在 ROSA_v2019.1.18.zip,有興趣的朋友可以透過下列連結取得:
https://docs.google.com/forms/d/e/1FAIpQLScqMLIi7bPF-XLTFVplfGU6lGte1P2Y7Sjur4lC_kDZDyYEEw/viewform

沒有留言:

張貼留言