4桁で実験 投稿者:ioio 投稿日:2008/04/24(Thu) 11:51 No.554
原典はこちら http://www.piclist.com/techref/io/led/8x7s8pin.htm 投稿No.534で紹介された海外のサイトです。有益な情報に感謝です。
LEDのアノードコモン端子をポートに直結しました。 セグメント電流制限抵抗は680Ωです。 ソースコードのDIG_SIZEで最大8桁まで対応します。 コピーで利用する場合は、インデントの全角スペースを半角または水平タブに変更してください。
//**************************************************************************** // Project : 7SEG LED 8桁表示(フロートビットダイナミック点灯方式) // C_Compiler : WinAVR // Chip type : ATtiny2313 // Clock frequency : 内蔵RC1MHz(8MHz*1/8) //**************************************************************************** // インクルード #include "io.h" //----------------------------------------------------------------------------- // ポートマップ // PB0 seg_a, 1桁目の走査 a // PB1 seg_b, 2桁目の走査 ━ // PB2 seg_c, 3桁目の走査 f┃ ┃b // PB3 seg_d, 4桁目の走査 ━g // PB4 seg_e, 5桁目の走査 e┃ ┃c // PB5 seg_f, 6桁目の走査 ━ ● // PB6 seg_g, 7桁目の走査 d dot // PB7 seg_dot, 8桁目の走査 // PD6 float bit //----------------------------------------------------------------------------- // 定数 #define T1MSEC 125 // タイマー0設定値=1msec #define DIG_SIZE 4 // 表示桁数指定(最大8桁まで) //----------------------------------------------------------------------------- // ROM領域定義 const unsigned char seg_code[] = { // アノードコモン用 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xD8, // 0,1,2,3,4,5,6,7 0x80, 0x98, 0x88, 0x83, 0x86, 0xA1, 0x86, 0x8E, // 8,9,A,B,C.D.E.F 0xBF}; // - //----------------------------------------------------------------------------- // メイン関数 // 機能 : PORTBに接続した8桁の7SEG LEDをfloat bit方式でダイナミック点灯 // 処理 : 1) ポート、タイマー0、WDTなどの初期化 // : 2) 表示データ取得、7SEG LED点灯 // : 3) ダイナミック表示桁更新 // : 4) 1msec遅延 // : 5) 2へループ //----------------------------------------------------------------------------- int main(void) { // 入出力ポート初期化 // Port B 初期化 // b0-b7=Out PORTB=0x00; DDRB=0xFF;
// Port D 初期化 // b0-b6=Out PORTD=0xFF; DDRD=0xFF;
// タイマ0スタート TCCR0B = 0x02; // プリスケール1/8。クロック8usec。
// アナログ比較器初期化 ACSR=(1<<ACD); // アナログ比較器電源オフ
// ウォッチドッグ(WD)禁止 __asm__ ("WDR" ::); // WD タイマリセット MCUSR &= ~(1<<WDRF); // WD リセットフラグ(WDRF)解除 WDTCSR |= (1<<WDCE)|(1<<WDE); // WDCEとWDEに論理1書き込み WDTCSR = 0x00; // WD禁止
unsigned char dsp_no; // 表示値格納 unsigned char seg_data; // セグメントデータ格納 unsigned char dig_no = 1; // 表示桁初期値設定 unsigned char dig_data = 1; // 桁走査データ初期値設定 unsigned char dot_pos = 3; // ドット位置指定 unsigned char dsp_buf[8] = // 表示データバッファー {1, 2, 3, 4, 5, 6, 7, 8}; // 配列要素先頭が1桁目
while (1){ PORTB = 0x00; // 全桁OFF dsp_no = dsp_buf[dig_no-1]; // 表示データ取得 seg_data = seg_code[dsp_no]; // セグメント点灯データ取得 if((seg_data & dig_data) == 0x00){ PORTD &= ~(1<<PD6); // フロートビットオン }else{ PORTD |= (1<<PD6); // フロートビットオフ } if( dot_pos == dig_no){ // ドット点灯桁チェック seg_data &= 0x7F; // ドット点灯ビットを合成 } DDRB = ~seg_data | dig_data; // オンセグメントのみ出力ポートに設定 seg_data |= dig_data; // 桁走査データと合成 PORTB = seg_data; // セグメントと桁走査を出力
dig_data <<= 1; // 桁走査データ更新 if(++dig_no > DIG_SIZE){ // 表示桁を更新 dig_no = 1; // 表示桁初期値設定 dig_data = 1; // 桁走査データ初期値設定 }
// 1msec遅延 TCNT0 = 0x00; while( TCNT0 < T1MSEC ); // 8μsec*125=1msec待ち } } //----------------------------------------------------------------------------- // END //-----------------------------------------------------------------------------
Re: 4桁で実験 - ノンノ 2008/04/24(Thu) 20:02 No.555 PICよりAVRは素直で良いですね。 しかしPICで作ると単体で(16F648Aなど非同期プリスケーラ) 50MHZのカウンタが出来てしまいます。 (カウントレベル0-5Vとして、場合によってはプリアンプのみ必要)
470ΩをRA3,4につないでタイムピリオドカウント、1/8プリスケーラ押し出しで50MHZカウントが出来ます。T1キャプチャーを使えば 周期測定方式併用で1秒で9桁表示できます。 (計算が大変ですが・・) PIC「AN592」が原典
|