3桁7SEG時計(PIC16F648A)を作りた…
3桁7SEG時計(PIC16F648A)を作りたい・・
3桁時計を作りたいです。
割り込みを使って1秒を作って0:00から9:59まで表示する時計。
私はプログラムの方はあんまり得意ではないので、
ご教授の方よろしくお願いいたします。
以下、必要と思われる情報です。
Device:PIC16F648A マイクロチップテクノロジ
コンパイラ:CCS社製PICC MATLAB+CCSコンパイラの環境です。
このハードウェアで0~999までカウント
するプログラムは動作しています。
クロック:内臓4MHzです。
ハードウェアポート仕様
PORTA_A1:7SEGLED Cathode Common制御 分(1の位)NPNトランジスタON/OF
A2:7SEGLED Cathode Common制御 分(10の位)NPNトランジスタON/OF
A3:7SEGLED Cathode Common制御 時(1の位)NPNトランジスタON/OF
PORTB_B0:7SEGLED Anode 制御 7SEG_a
PORTB_B1:7SEGLED Anode 制御 7SEG_b
PORTB_B2:7SEGLED Anode 制御 7SEG_c
PORTB_B3:7SEGLED Anode 制御 7SEG_d
PORTB_B4:7SEGLED Anode 制御 7SEG_e
PORTB_B5:7SEGLED Anode 制御 7SEG_f
PORTB_B6:7SEGLED Anode 制御 7SEG_g
PORTB_B7:7SEGLED Anode 制御 7SEG_h
下記のプログラムは0~600までカウントするプログラムです。
val値でカウントする値を可変できます。
#include <16f648a.h>
#fuses INTRC_IO,NOWDT,NOLVP,NOMCLR //内部クロック、WDT,LVPなし
#use delay(CLOCK=4000000) //クロック4MHz
//#define TIME_OUT
unsigned int const LED_SEG[]= //7SEG表示用テーブル
{
0b00111111, /* 0= "0" [1] */
0b00000110, /* 1= "1" [2] */
0b01011011, /* 2= "2" [3] */
0b01001111, /* 3= "3" [4] */
0b01100110, /* 4= "4" [5] */
0b01101101, /* 5= "5" [6] */
0b01111100, /* 6= "6" [7] */
0b00100111, /* 7= "7" [8] */
0b01111111, /* 8= "8" [9] */
0b01101111, /* 9= "9" [10]*/
0b10000000, /* 10= "." [11]*/
0b01000000, /* 11= "-" [12]*/
};
unsigned int ct; //数字の更新間隔
unsigned long val; //表示する数字
unsigned int digit; //表示する桁
unsigned char st[3];
void main(void)
{
set_tris_a(0b11110000);
set_tris_b(0b00000000);
digit=0;
ct=1; //数字を更新する周期
val=0; //表示する値
while(1)
{
ct --;
if(ct == 0)
{ //数字の更新
st[2]=val/100; //
st[1]=val/10-st[2]*10; //計算
st[0]=val%10; //計算
val++;
if(val==600) val=0;
ct=20; //200にすると
//約1秒間隔の表示に
//なります。
}
if(digit== 2)
{ //第3桁の表示
output_b(LED_SEG[st[2]]);
output_bit(PIN_A3,1);//3桁表示開始
delay_ms (5); //表示期間(ミリ秒)
output_bit(PIN_A3,0); //表示を消す
delay_us(100);
}
if(digit== 1) //第2桁の表示
{
output_b(LED_SEG[st[1]]);
output_bit(PIN_A2,1);
delay_ms (5);
output_bit(PIN_A2,0);
delay_us(100);
}
if(digit == 0) //第1桁の表示
{
output_b(LED_SEG[st[0]]);
output_bit(PIN_A1,1);
delay_ms (5);
output_bit(PIN_A1,0);
delay_us(100);
}
digit ++;
if(digit == 3) digit=0;//表示桁を変更
}
}
お礼
ご回答くださり、ありがとうございます。 もともと RT-Linux を使用していたため、ART-Linux が必要としている ハードがどの程度のものなのかを理解していなかったため、非常に参考になりました。 その後、Web等で調査した結果、boot時に append= として、引数を渡すことで 100usecでの動作が可能であることがわかりました。 しかし、私の場合は、append="mem=255M" として、すでにappend引数を使用していて boot時に渡せない、という新たな問題が。。。 難しいです。