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を利用して作成しました。
小数点は消灯したほうが良いです
揺らぎも全くなく使いやすいです。