7セグ君 クロック七変化

7セグ君を使ってPIC16F88の内蔵オシレーターのクロック切り替えのデモです。
PIC16F88の内蔵オシレーターを8MHz→ 4MHz→ 2MHz→ 1MHz→ 500kHz→ 250kHz→ 125kHz→ 31.25kHz→ 8MHz→… と切り替えています。

ポイント
内蔵オシレーターを使うためにHI-TECH Cでは__CONFIGINTIO(15, 16ピンをI/Oとして使う)もしくはINTCLK(15ピンにクロックを出力、16ピンはI/O?未確認)を指定します。
クロック数を指定するのはOSCCONレジスタの6-4ビットで以下のように指定します。
000: 31.25kHz
001: 125kHz
010: 250kHz
011: 500kHz
100: 1MHz
101: 2MHz
110: 4MHz
111: 8MHz

ソースコード

#include <pic.h>

__CONFIG(INTIO & MCLREN & PWRTEN & WDTDIS & BOREN & LVPDIS & UNPROTECT);
__CONFIG(CCPRB3 & DEBUGEN);

#define SEG7_A_PIN	RA7
#define SEG7_B_PIN	RA4
#define SEG7_C_PIN	RA2
#define SEG7_D_PIN	RA1
#define SEG7_E_PIN	RB5
#define SEG7_F_PIN	RA6
#define SEG7_G_PIN	RB4
#define SEG7_DP_PIN	RA3

void allOff()
{
	SEG7_A_PIN = 1;	// A
	SEG7_B_PIN = 1;	// B
	SEG7_C_PIN = 1;	// C
	SEG7_D_PIN = 1;	// D
	SEG7_E_PIN = 1;	// E
	SEG7_F_PIN = 1;	// F
	SEG7_G_PIN = 1;	// G
	SEG7_DP_PIN = 1;	// DP
	RB0 = 0;
	RB1 = 0;
	RB2 = 0;
}

void selectLED(unsigned char sel)
{
	switch (sel) {
		case 0:
			SEG7_A_PIN = 0;
			break;
		case 1:
			SEG7_B_PIN = 0;
			break;
		case 2:
			SEG7_C_PIN = 0;
			break;
		case 3:
			SEG7_D_PIN = 0;
			break;
		case 4:
			SEG7_E_PIN = 0;
			break;
		case 5:
			SEG7_F_PIN = 0;
			break;
	}
}

void main()
{
	unsigned char sw = 0;
	unsigned char x = 0;
	unsigned char osc = 0x07;	// 8MHz
	OSCCON = osc << 4; // クロック設定
	TRISA = 0x21;
	TRISB = 0xC0;
	ANSEL = 0;
	while (1) {
		allOff();
		selectLED(sw);
		RB0 = 1;
		RB1 = 1;
		RB2 = 1;
		sw++;
		if (sw > 5) {
			sw = 0;
			x++;
		}
		for (unsigned char z = 0; z < 255; z++) {
		}
		if (x == 4) {
			osc--;
			OSCCON = osc << 4;	// クロック設定
			if (osc == 0) {
				osc = 8;
			}
			x = 0;
		}
	}
}

PIC16F88は内蔵オシレーターで動かせるので、部品数も減るし気楽に動かせて便利ですね。

カテゴリー: PIC, 作ったモノ タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA