一回も披露したことのない豆知識

ニキシー管時計を自作しているのですか、スイッチ入力のプログラムが分かりません。

#include <16f1938.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,NOBROWNOUT,NOIESO
#use delay(clock=16MHZ)// クロック周波数は16MHz
#byteRA = 0x0c//RAをポートAのアドレス0Ch番地に設定
#bit MODE_SW = RA.0
#bit UP_SW = RA.1
#bit DOWN_SW = RA.2
#bit NIXI_8 = RA.6
#bit NIXI_9 = RA.7

#byteRB = 0x0d//RBをポートBのアドレス0Dh番地に設定
#byteRC = 0x0e//RCをポートCのアドレス0Eh番地に設定
void io_init(void);// i/o設定関数
signed int sec=56,min=34,hour=12;
void disp_nixi(int v);
int flag=0;
/*--------------------------------------
timer0割り込み 1ms間隔
---------------------------------------*/
#INT_TIMER0
void timer0(void)
{
static signed int flag=0;
static signed long m_sec=0;//msカウンタ
set_timer0(131); //256-125 =131 125* 8us = 1000us

//全て消灯
RB=0x00;
disp_nixi(10);
delay_us(10);

m_sec++;
if(m_sec>1000){
sec++;
m_sec=0;
}
if(sec>60){
min++;
sec=0;
}
if(min>60){
hour++;
min=0;
}
if(hour>=24){
hour=0;
}

if(flag<6)flag++;
else flag=0;
switch(flag){
case 0:
disp_nixi(sec%10);
RB=0x01;//1桁ON
break;

case 1:
disp_nixi(sec/10);
RB=0x02;//2桁ON
//RB=0x02;//2桁ON
break;

case 2:
disp_nixi(min%10);
RB=0x04;//3桁ON
break;

case 3:
disp_nixi(min/10);
RB=0x08;//4桁ON
break;

case 4:
disp_nixi(hour%10);
RB=0x10;//5桁ON
break;

case 5:
disp_nixi(hour/10);
RB=0x20;//6桁ON
break;
}//end switch
} // end timer0(void)
void main(void)
{
long int flag=0,i;
io_init();
while(1){
//ここにプログラムを書きたいです

}// end while()
} // end main(void)


void io_init(void){
setup_oscillator(OSC_16MHZ);// 内部クロックを16MHzに設定
RA=0x00;
RB=0x00;
RC=0x00;
setup_adc_ports(NO_ANALOGS);// ポートAはデジタルI/Oに設定
//timer0の設定
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32); // 4ck 1命令 4/16M = 0.25us 0.25us*32 : 1ct = 8us タイマ0のモード設定
set_timer0(131); //256-125 =131 125* 8us = 1000us
// TRIS_aの設定 A0~A7:入力 1111 1111 A2:sw2 A1:sw1 A1:sw1
set_tris_a(0x3f);
// TRIS_bの設定
set_tris_b(0x00);//H-side ドライブ0~5
// TRIS_cの設定
set_tris_c(0x00);//7~4:free  C3~0:L-side ドライブ
// TRIS_eの設定
set_tris_e(0xff);
enable_interrupts(INT_TIMER0);//tmr0割り込み許可
enable_interrupts(GLOBAL);//グローバル割込み許可
}

void disp_nixi(int v){
switch(v){
case 0:
NIXI_8 =0;
NIXI_9 =0;
RC=0b10000000;
break;
case 1:
NIXI_8 =0;
NIXI_9 =1;
RC=0b00000000;
break;
case 2:
NIXI_8 =0;
NIXI_9 =0;
RC=0b00010000;
break;
case 3:
NIXI_8 =1;
NIXI_9 =0;
RC=0b00000000;
break;
case 4:
NIXI_8 =0;
NIXI_9 =0;
RC=0b00000010;
break;
case 5:
NIXI_8 =0;
NIXI_9 =0;
RC=0b00000100;
break;
case 6:
NIXI_8 =0;
NIXI_9 =0;
RC=0b00001000;
break;
case 7:
NIXI_8 =0;
NIXI_9 =0;
RC=0b00000001;
break;
case 8:
NIXI_8 =0;
NIXI_9 =0;
RC=0b01000000;
break;
case 9:
NIXI_8 =0;
NIXI_9 =0;
RC=0b00100000;
break;
default :
NIXI_8 =0;
NIXI_9 =0;
RC=0b00000000;
}
}

↑のプログラムのwhile文部分にプログラムを書きたいのですが、
どのようなプログラムを書いたらよいのでしょうか。
教えていただけると助かります。

A 回答 (1件)

キースイッチはチャタリングがあるので、on/offのみで判別できません



 キースイッチonの時間が50mS以上あるか?、次にoffの時間が50mS以上ある時のみ、一回キー入力ありと判別しています (時間はスイッチにより調整します)

具体的には、割り込み内で、カウンタを使い キーon/off 時間を計測し、キー入力フラグを立てています
    • good
    • 0
この回答へのお礼

なるほど、そうだったのですね。
まだまだ勉強が足りないと改めて感じました。

お礼日時:2015/01/19 21:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報