// ファイル名 selector.c
// プッシュスイッチで1~7の数字を得る
#include <htc.h>
__CONFIG(PWRTEN&HS&WDTDIS&UNPROTECT&MCLRDIS&BORDIS&IESODIS&FCMDIS);
#define _XTAL_FREQ 20000000
#define true 1
#define false 0
typedef unsigned char byte;
#define PERIOD 100
/*
20MHz/4 = 5MHz
TMR0 * prescale*counter/5MHZ
= (256-PERIOD) * 256*2/5MHZ
= (256-100) * 256*2/5MHZ = 16m秒
*/
void LED(byte n, byte times);
void Delay50();
void Delay100();
void Delay500();
byte progSW();
unsigned char counter=0;
void interrupt Intr(void)
{
// 割り込みがtimer0から来る
counter++;
TMR0 = PERIOD;
T0IF = 0; // 割り込みフラグクリア
return;
}
main()
{
unsigned int pushTime=0;
PORTA = 0; // PORTAを0にする
TRISA = 0; // PORTAを出力に設定する
ANSEL = 0; // アナログ入力をOFF
// Timer0 の設定
OPTION = 0; // FOSC/4 プリスケーラ1/2
T0IE=1; // Timer0 の割り込みON
T0IF=0; // 割り込みフラグクリア
GIE=1; // CPUへの割り込みON
while(true) {
if(!RA3) { // プッシュスイッチが
if(counter==0){
if(++pushTime > 500) {// 長押しだったら
LED(7,2); // 白で2回点滅
progSW(); // さらに続けて番号を得る
pushTime = 0;
}
}
}
else pushTime = 0;
}
}
void LED(byte n, byte times)
{
byte i;
for(i=0; i<times; i++) {
PORTA = n;
Delay50(); // 50msディレイ
PORTA = 0;
Delay50(); // 50msディレイ
}
}
byte progSW(){
byte on=0;
byte state=0;
int t=0;
Delay500();
while(true){
if(!RA3) { // 押されたら
Delay100() ;
on = true;
t=0;
}
if(on && RA3) {
on = false;
if(++state==8) state=0;
LED(state, 1);
t=0;
}
if(counter++==0) {
if(t++==1000) return state; // 0も返す
}
}
}
void Delay50() // 50m秒ディレイ
{
int i;
for(i=0; i<5; i++)
__delay_ms(10);
}
void Delay100() // 100m秒ディレイ
{
int i;
for(i=0; i<10; i++)
__delay_ms(10);
}
void Delay500() // 500m秒ディレイ
{
int i;
for(i=0; i<50; i++)
__delay_ms(10);
}
|