HOME       2015/8/11


KR1000用 デジタル角度表示器の作成 PIC16F88 7SEGLED 4桁

手持ちを使ったので新たに購入する場合は最新のPICを使ってください。

電圧入力はインピーダンス10kΩと高いのでOPAMPでインピーダンスを下げました。

使用したOPAMPは358です。出力3.5Vしか保証していないので入力電圧を1/2して入力しています。

基準電圧はRA3に2.5Vを入力しています。

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF

#pragma config PWRTE = ON

#pragma config MCLRE = OFF
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0 // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode disabled)
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 1000000
const unsigned char seg_d[16] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x67,
0x77, 0x7C, 0x58, 0x5E, 0x79, 0x71 };//7seg data
const unsigned char scan[4] = {
0b00000001,0b00000010,0b00000100,0b00010000};
unsigned char digit_no=0,dsp_buf[4]={0,0,0,0};
unsigned int temp1,t2,dsp_cnt,t;
int n,i;
void lout(void);
int main(int argc, char** argv) {
OSCCON= 0b01011010; //1MHz 選択
TRISA=0b11101000;
TRISB=0b10000000;
PORTA=0b00000000;
PORTB=0b00000000;
ANSEL = 0b01000000; //RC4アナログ
ADCON1= 0b11100000; //基準電圧
ADCON0= 0b11110001; //RC4,ADON
while(1){
for(t=0;t<2;t++){}; //wait
GO = 1; // A/D変換開始
while(GO){}
dsp_cnt=ADRESL+(ADRESH*256);
temp1=dsp_cnt>>1;
lout();
}
return (EXIT_SUCCESS);
}
void lout(void){
n = 1000; // 4桁の10進数に変換
for(i=3;i>=0;i--){
t2 = temp1/n; // 千、百、十、一の個数を計算
dsp_buf[i] = (unsigned char)t2;// 表示バッファーに代入
temp1 = temp1 % n; // 余りを求める
n /= 10;
}
for (digit_no=0;digit_no<4;digit_no++){
PORTB = seg_d[dsp_buf[digit_no]] ; //7セグDATA出力
if(digit_no==3 && dsp_buf[3]==0) PORTA=0 ; // 4桁目0なら表示しない
else { PORTA = (scan[digit_no]);
for(t=0;t<80;t++){}; //wait
}
}
}

 

相手によってアンテナの方向が違います。アナログ表示器はイメージは良いのですが、絶対値がわかりません。

PICのA/Dを利用して作成しました。

小数点は消灯したほうが良いです

揺らぎも全くなく使いやすいです。