組込み系システム開発室by藤原技研M

製作中の組込み機器や気になる開発ツールなどを中心に記事を書いています。

キッチンタイマーの製作(6)機能仕様書

機能仕様書が無いとプログラムが作れないので、仮に以下のような仕様にします。

f:id:fujiharagiken:20180125164510p:plain

 f:id:fujiharagiken:20180116135648p:plain

f:id:fujiharagiken:20180130121724p:plain

【main.cを以下のように変更します】

時間設定画面に遷移するようにプログラミングします。

>|c|

int main(void) {
SYSTEM_Initialize();

//タイマー停止
TMR1_Stop();
__delay_ms(40);


// LCD初期化と初期表示処理
WireLcdInit(); // LCD初期化
__delay_ms(1); // ウェイト

gMode = 0;
LcdDisp();

//一定時間初期画面をキープする
__delay_ms(3000);

gMode =1;
int loopCnt = 1;

//永久ループ
while (1) {
SwScan(); // スイッチの取り込みとチャタリング除去処理
switch (loopCnt) {


(以降省略)

||<

 

【スイッチ操作の処理を以下のように変更します】

void swOperation ( void ) {
    // SWに変化があったか判別
    if ( bSwData != bSwDataSave ) {

        if ( ( bSwData & ( SW1 | SW2 ) ) == LOW) { // SW1,SW2同時押し判別
            //分秒スイッチ・オン
            gMin = 0;
            gSec = 0;
            gMode = 1;

            TMR1_Stop(); //タイマーストップ

            beep(70); // ピッ音
            __delay_ms(70);
            beep(70); // ピッ音
            __delay_ms(70);
            beep(70); // ピッ音
            __delay_ms(70);
            beep(210); // ピー音

        } else if ( (bSwData & SW1) == LOW ) { // SW1操作判別
       
            if(gMode == 1) {
                //分スイッチ・オン
                gMin++;
            }
   
            beep(100); // 1KHzで100ms発音処理を追加

        } else if ( (bSwData & SW2) == LOW ) { // SW2操作判別
            if(gMode == 1) {
                //秒スイッチ・オン
                gSec++;
            }
            
            beep(100); // 1KHzで100ms発音処理を追加

        } else if( (bSwData & SW3) == LOW ) { // SW3操作判別
            beep( 300); // 1KHzで100ms発音処理を追加

            if(gMode == 1) {
                gMode = 2;
                TMR1_Start(); //タイマースタート
            } else if(gMode == 2) {
                gMode = 1;
                TMR1_Stop(); //タイマーストップ
            }
        }
    }

    bSwDataSave = bSwData; // 変化検出用旧データを更新
}

 

------------------------------------------------------------------------------------------------------------

LCD表示処理を以下のように変更します】

void LcdDisp (void) {
    char str1[ ] = "Kitchen ";
    char str2[ ] = "Timer ";
    char str3[ ] = " START  ";
    char str5[ ] = "  STOP  ";
    char str6[ ] = "TIME UP ";
    char wk[9] = {'\0'};

    switch (gMode) {
        case 0: //初期画面表示
            //------[ 表示(1行目)]------
            WireLcdDisplay(str1, 8, 0x00);
            
            //------[ 表示(2行目)]------
            WireLcdDisplay(str2, 8, 0x40);
            break;
            
        case 1: // 時間設定画面表示
            //------[ 表示(1行目)]------
            WireLcdDisplay(str5, 8, 0x00);

            //------[ 表示(2行目)]------
            snprintf(wk, 9, " %02d:%02d" , gMin, gSec);
            WireLcdDisplay(wk, 8, 0x40);
            break;

        case 2: // 時間設定画面表示
            //------[ 表示(1行目)]------
            WireLcdDisplay(str3, 8, 0x00);

            //------[ 表示(2行目)]------
            snprintf(wk, 9, " %02d:%02d" , gMin, gSec);
            WireLcdDisplay(wk, 8, 0x40);
            break;

        case 3: // 時間設定画面表示
            //------[ 表示(1行目)]------
            WireLcdDisplay(str6, 8, 0x00);

            //------[ 表示(2行目)]------
            snprintf(wk, 9, " %02d:%02d" , gMin, gSec);
            WireLcdDisplay(wk, 8, 0x40);
            break;

        default:
            break;
    }
}

 

------------------------------------------------------------------------------------------------------------

 

【タイマー割り込み処理を以下のように変更します】

 (省略)

 #include <xc.h>
#include "tmr1.h"

extern int gMin; //変数の外部参照宣言を追加 ※#include "tmr1.h"の下に追加
extern int gSec; //変数の外部参照宣言を追加 ※#include "tmr1.h"の下に追加

 (省略)

void __attribute__ ( (weak) ) TMR1_CallBack(void)
{
    // Add your custom callback code here ※以下のコードを追加
    if(gSec == 0) {
        if(gMin > 0) {
            gMin --;
            gSec = 60;
        }
    }

    if(gSec > 0) {
        gSec --; //カウンタのデクリメント命令を追加
    }

}

------------------------------------------------------------------------------------------------------------

後、タイムアップ時の処理、LEDの点灯処理、時間に関する異常系(60秒以上禁止等)の処理を追加すれば完成です。