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 |