PICのお勉強(26) C言語編 2桁7セグLEDのダイナミック点灯
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を点灯させることができます。
次のような動作をプログラムしました。
まず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);
}
}
}
}
| 固定リンク | 0
「PICマイコン」カテゴリの記事
- ZK-80で足し算(2020.07.23)
- TK-80互換機 ZK-80のキット(2020.07.21)
- PICのお勉強(37) C言語編 12F683でA/D変換(2015.06.02)
- UVレジンでLEDイルミネーション (2)(2015.05.15)
- PICのお勉強(35) C言語編 PWMでサーボモータを動かす(2014.10.05)
コメント