キッチンタイマーの製作(6)機能仕様書
機能仕様書が無いとプログラムが作れないので、仮に以下のような仕様にします。
【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秒以上禁止等)の処理を追加すれば完成です。