/* * * プログラムテンプレート * 2008 nazo-fjt.com * by Hiroshi FJT * * Device = PIC16F877/877A * Compiler = HI-TECH PICC-Lite Compiler * */ #include /* define設定 */ #define TimIntLoop 100 /* 0.5秒を生成する為のタイマー割り込み回数 */ #define IdleLoopCount 170 /* 時間稼ぎループ回数(0-255) */ #define SwPushCount 5 /* SWが押されたと認識するカウント数 */ #define SwLongCount 500 /* SWが長押しされたと認識するカウント数 */ #define SwContenuCount 90 /* SWが長押しが継続されたと認識するカウント数 */ /* コンフィグビット設定 */ __CONFIG(UNPROTECT & PWRTEN & WDTDIS & XT & LVPDIS); /********************************************************************/ /* プロトタイプ宣言 */ /********************************************************************/ /* I/O処理レイヤー */ void DispOut(void); void SWscan(void); void IntTimer(void); /* イベント通知レイヤー */ void InitDone(void); /* 初期化終了通知 */ void SW1Push(void); /* SW1(mode) */ void SW1Long(void); void SW1Contenu(void); void SW1Rel(void); void SW1LgRel(void); void SW2Push(void); /* SW2(hh) */ void SW2Long(void); void SW2Contenu(void); void SW2Rel(void); void SW2LgRel(void); void SW3Push(void); /* SW3(mm) */ void SW3Long(void); void SW3Contenu(void); void SW3Rel(void); void SW3LgRel(void); void SW4Push(void); /* SW4(m) */ void SW4Long(void); void SW4Contenu(void); void SW4Rel(void); void SW4LgRel(void); void SW5Push(void); /* SW5(SecReset) */ void SW5Long(void); void SW5Contenu(void); void SW5Rel(void); void SW5LgRel(void); void SW6Push(void); /* SW6(Alm1 Snooze/Stop) */ void SW6Long(void); void SW6Contenu(void); void SW6Rel(void); void SW6LgRel(void); void SW7Push(void); /* SW7(Alm2 Snooze/Stop) */ void SW7Long(void); void SW7Contenu(void); void SW7Rel(void); void SW7LgRel(void); void HalfSec(void); /* 0.5sec通知 */ void LoopEvnt(void); /* loopイベント通知 */ /* アプリ処理レイヤー */ /* この下にアプリで利用する関数のプロトタイプを宣言 */ /********************************************************************/ /* グローバル変数定義 */ /********************************************************************/ /* システム利用変数 */ /* 表示 */ unsigned char D1; unsigned char D2; unsigned char D3; unsigned char D4; unsigned char D5; unsigned char D6; bit DP1; bit DP2; bit DP3; bit DP4; bit DP5; bit DP6; bit DAM; bit DPM; /* SW status */ /* 0 - open * 1 - push * 2 - long push * 3 - long push contenues */ unsigned char SW1status; unsigned char SW2status; unsigned char SW3status; unsigned char SW4status; unsigned char SW5status; unsigned char SW6status; unsigned char SW7status; /* アプリ利用変数 */ /* この下にアプリで利用するグローバル変数を宣言する */ /********************************************************************/ /* システムレイヤー */ /********************************************************************/ /* メイン */ void main() { unsigned char i; /* PIC初期化 */ /* デフォルト値のままでいいところはコメントアウトしておく */ /* 割り込み設定フラグ設定 */ /* PIE1 * +----TMR2IE * | */ PIE1=0b00000010; /* PIE2 */ PIE2=0b00000000; /* INTCON * +---- GIE * |+--- PEIE * || */ INTCON=0b11000000; /* I/O設定 */ /* ADコンバータの機能を殺す */ /* PORTAとPORTEを汎用I/Oとして使うため */ /* デフォルトではA/DコンバータはDisableなのにポート設定はアナログ入力になっている */ ADCON0=0b00000000; ADCON1=0b00000110; /* * 7 6 5 4 3 2 1 0 * RA - - O/NC I/SW5 I/SW4 I/SW3 I/SW2 I/SW1 * RB O/colC O/colB O/colA O/D.P. O/numD O/numC O/numB O/numA * RC O/T2 O/T1 O/A2 O/A1 O/1Hz O/Test O/Test O/NC * RD I/SW12 ISW11 I/SW10 I/SW9 O/NC I/SW8 I/SW7 I/SW6 * RE - - - - - O/PM O/AM O/DispEna * * TRISx 0 output * 1 input * bit76543210 */ TRISA=0b00011111; TRISB=0b00000000; TRISC=0b00000000; TRISD=0b11110111; TRISE=0b00000000; /* システム変数初期化 */ /* 080513追加 */ SW1status=0; SW2status=0; SW3status=0; SW4status=0; SW5status=0; SW6status=0; SW7status=0; /* タイマ設定 */ /* * Clock * 3.2768MHz * | * 1/4 (819.200KHz) * | * Prescaler * 1/16 (51.200KHz) * | * TMR2 Reg ---Comparator--- PR2 Reg * 0-255 1/(PR2+1) 127 * (400Hz) * | * Postscaler * 1/2 * | * 200Hz * Postscaler * +-------- TOUTPS3 0000: 1/1 * |+------- TOUTPS2 0001: 1/2 * ||+------ TOUTPS1 : * |||+----- TOUTPS0 1111: 1/16 * |||| * ||||+---- TMR2ON 0:Stop 1:Start * ||||| * ||||| Prescaler * |||||+--- T2CKPS1 00: 1/1 * ||||||+-- T2CKPS0 01: 1/4 * |--|||| 1x: 1/16 */ T2CON=0b00001111; PR2=127; /* 初期化終了通知呼び出し */ InitDone(); /* Idol Loop */ while(1) { /* TestOutをHにする */ RC2=1; /* 表示実行 */ DispOut(); /* SW Sclan呼び出し */ SWscan(); /* loopイベント通知 */ LoopEvnt(); /* TestOutをLにする */ RC2=0; /* 時間稼ぎループ */ i=0; do{ i++; }while(i