MPLAB X IDE v3.05 XC8 16F88 実験 7seg LED 4桁 電圧計 ( 7seg アノードコモン ) max80V

// *****************************************************************************
// < コンパイラ MPLAB X XC8 > 怪答PIC 2015/07/31
// 16F88
// 7seg LED  4桁 電圧計 ( 7seg アノードコモン )
// *****************************************************************************
// 1 RA2 AN2 電圧入力
// 2 RA3 AN3
// 3 RA4 AN4
// 4 RA5
// 5 Vss E
// 6 RB0 LED 7seg a
// 7 RB1 LED 7seg b
// 8 RB2 LED 7seg c
// 9 RB3 LED 7seg d
// 10 RB4 LED 7seg e
// 11 RB5 LED 7seg f
// 12 RB6 AN5 LED 7seg g
// 13 RB7 AN6 LED 7seg dp
// 14 Vdd + 5V
// 15 RA6
// 16 RA7
// 17 RA0 AN0
// 18 RA1 AN1
// *****************************************************************************

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#define _XTAL_FREQ 8000000
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB3/PGM pin has PGM function, Low-Voltage Programming enabled)
#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 = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode enabled)

// 7seg LED アノードコモン 表示パターン
const unsigned char seg_d[10] = {
0b11000000, // 7seg 0
0b11111001, // 7seg 1
0b10100100, // 7seg 2
0b10110000, // 7seg 3
0b10011001, // 7seg 4
0b10010010, // 7seg 5
0b10000011, // 7seg 6
0b11111000, // 7seg 7
0b10000000, // 7seg 8
0b10011000 // 7seg 9
};

// 7seg LED アノードコモン DP有り 表示パターン
const unsigned char seg_ds[10] = {
0b01000000, // 7seg 0
0b01111001, // 7seg 1
0b00100100, // 7seg 2
0b00110000, // 7seg 3
0b00011001, // 7seg 4
0b00010010, // 7seg 5
0b00000011, // 7seg 6
0b01111000, // 7seg 7
0b00000000, // 7seg 8
0b00011000 // 7seg 9
};

// 7seg LED 点灯
const unsigned char scan[4] = {
0b00000001, // 右から1桁目
0b00000010, // 右から2桁目
0b00000100, // 右から3桁目
0b00001000 // 右から4桁目
};

unsigned char digit_no=0;
unsigned char dsp_data[4]={0,0,0,0};
unsigned char t;

unsigned int temp1;
unsigned int t2;
unsigned int dsp_cnt;

int n,i;
void lout(void);
void main(){
OSCCON= 0b01111000; //8MHz 選択
TRISA=0b11110000;
TRISB=0b00000000;
PORTA=0b00000000;
PORTB=0b00000000;
ADCON1= 0b11000000; //基準電圧VDD,VSS
ANSEL= 0b00010000; //RN4アナログ
ADCON0= 0b00100001; //RN2,ADON

while(1){
ADIF=0; //割込みFクリヤ
ADIE=1; //割込み許可
PEIE=1; //周辺割込み許可
__delay_us(10);
GO = 1; // A/D変換開始
// SLEEP();
while(GO){}
dsp_cnt=ADRESL+(ADRESH*256); // 5Vの時表示が1024 VR1を調整して5Vに
temp1=dsp_cntdsp_cnt<<3; //8000フルスケールニする
lout();
}
}

void lout(void){ // ---変換原理が???---
n = 1000; // 4桁の10進数に変換
for(i=3;i>=0;i--){
t2 = temp1/n; // 千、百、十、一の個数を計算
dsp_data[i] = (unsigned char)t2; // 表示バッファーに代入
temp1 = temp1 % n; // 余りを求める
n /= 10;
}

// 7seg LED 表示
PORTA = 0b11111111; //全桁消灯
PORTB = seg_d[dsp_data[0]] ; //7セグDATA出力
PORTA = (scan[0]) ; // 1桁ビット出力
__delay_ms(5);

PORTA = 0b11111111; //全桁消灯
PORTB = seg_d[dsp_data[1]] ; //7セグDATA出力
PORTA = (scan[1]) ; // 2桁ビット出力
__delay_ms(5);

PORTA = 0b11111111; //全桁消灯
PORTB = seg_ds[dsp_data[2]] ; //7セグDATA出力(DP表示)
PORTA = (scan[2]) ; // 3桁ビット出力
__delay_ms(5);

PORTA = 0b11111111; //全桁消灯
PORTB = seg_d[dsp_data[3]] ; //7セグDATA出力
if(dsp_data[3]==0) PORTB=0b11111111 ; // 4桁目0なら表示しない
else { PORTA = (scan[3]); // 4桁ビット出力
__delay_ms(5);
}
}


 16F88_013-3.c