« PICのお勉強(25) C言語編 7セグメントLEDを使ってみる | トップページ | PICのお勉強(27) C言語編 液晶ディスプレイ SD1602を使ってみる »

2012年6月23日 (土)

PICのお勉強(26) C言語編 2桁7セグLEDのダイナミック点灯

7segled22 2桁の7セグメントLEDを「ダイナミック点灯」という方法で点灯させてみました。
 この図のように,PIC16F84AのRB0~RB7のピンを7セグLEDに接続し,1桁めと2桁めの同じアルファベット記号の端子もブレッドボード上で接続しておきます。
また,PICマイコンのRA0とRA1を7セグLEDの13番端子と14番端子にそれぞれ接続します。
これで,RA0をLowレベルにすると1桁めの7セグLEDを,RA1をLowレベルにすると2桁めの7セグLEDを点灯させることができます。
201206187segled 次のような動作をプログラムしました。
 まずmain()で,2桁めの数字d1を0~9まで増やしつつ,1桁めの数字d0を0~9まで増やしていきます。(ネストをそのまま日本語にするとヘンなもんですな)
で,ときどきTMR0割り込みして,1桁めと2桁めの数字を交互に点灯させます。
 実際には交互に点灯してるのですが,人間の目には1桁めも2桁めも同時に点灯してるように見えるのです。これが「ダイナミック点灯」ってやつの仕掛けです。
ソースはこれ→lesson26.c

/************************************
16F84A HI-TECH C v.9.83
2桁7セグメントLEDのダイナミック点灯
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

unsigned char i;
unsigned char d0, d1;
unsigned char p[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void interrupt warikomi(void)
{
T0IF = 0; //TMR0割り込み禁止
i++;
if (i == 2)
{
i = 0;
}

if (i == 0)
{
PORTA = 0x1E; // 1桁目
PORTB = p[d0];
}
else
{
PORTA = 0x1D; // 2桁目
PORTB = p[d1];
}
}

main(void)
{
TRISA = 0x00; //RA0~RA4は出力
PORTA = 0x03; //RA0とRA1をHighレベルにする
TRISB = 0x00; //RB0~RB7は出力
PORTB = 0x00;
OPTION = 0x86; //プリスケーラ64
TMR0 = 0x00; //TMR0は0からスタート
T0IE = 1; //TMR0割り込み許可
GIE = 1; //すべての割り込み許可
i = 0;

while (1)
{
for (d1 = 0; d1 < 10; d1++)
{
for (d0 = 0; d0 < 10; d0++)
{
__delay_ms(500);
}
}
}
}


| |

« PICのお勉強(25) C言語編 7セグメントLEDを使ってみる | トップページ | PICのお勉強(27) C言語編 液晶ディスプレイ SD1602を使ってみる »

PICマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: PICのお勉強(26) C言語編 2桁7セグLEDのダイナミック点灯:

« PICのお勉強(25) C言語編 7セグメントLEDを使ってみる | トップページ | PICのお勉強(27) C言語編 液晶ディスプレイ SD1602を使ってみる »