#include <xc.h>
#define _XTAL_FREQ 8000000
#pragma config FOSC = HSHP
#pragma config WDTEN = OFF
unsigned char seg_char[11] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x1C};
unsigned long value;
unsigned int raw_adc = 0;
unsigned char digits[4] = {0, 0, 0, 0};
unsigned char digit_counter = 0;
unsigned char conversion_done = 0;
// Yeni eklediğimiz şalterler
unsigned char mod_flag = 0; // 0: Volt Modu, 1: Ham ADC Modu
unsigned char blink_on = 1; // Ekranın ve LED'in o anki açık/kapalı durumu
unsigned int blink_counter = 0; // 250 ms'yi sayacak sayaç
void main(void) {
// PORT AYARLARI
TRISA = 0xE0;
ANSELA = 0x00;
PORTA = 0x00; // Komple PORT yapıldı
TRISB = 0xFF;
ANSELB = 0x00;
PORTB = 0x00;
TRISD = 0x00;
ANSELD = 0x00;
PORTD = 0x00; // Komple PORT yapıldı
TRISE = 0x0F;
ANSELE = 0x02;
PORTE = 0x00;
// ADC AYARLARI (RE1 - AN6)
ADCON0 = 0x19;
ADCON1 = 0x00;
ADCON2 = 0xA1;
// TIMER0 AYARLARI (10 ms)
T0CON = 0xC6;
TMR0L = 100;
// KESME AYARLARI
INTCON2bits.INTEDG0 = 0;
TMR0IE = 1;
INT0IE = 1;
PEIE = 1;
GIE = 1;
GODONE = 1; // Sistemi başlat
while (1) {
if (conversion_done == 1) {
conversion_done = 0;
// Ham veriyi hesapla (0-1023)
raw_adc = (unsigned int)((ADRESH << 8) + ADRESL);
// MATEMATİK BÖLÜMÜ
if (mod_flag == 0) {
value = (unsigned long)((5000UL * raw_adc) / 1023);
digits[3] = (unsigned char)(value / 1000);
digits[2] = (unsigned char)((value / 100) % 10);
digits[1] = (unsigned char)((value / 10) % 10);
digits[0] = 0; // Bu modda 0. hane 'u' harfi olacağı için önemi yok
}
else {
value = raw_adc;
digits[3] = (unsigned char)(value / 1000);
digits[2] = (unsigned char)((value / 100) % 10);
digits[1] = (unsigned char)((value / 10) % 10);
digits[0] = (unsigned char)(value % 10);
}
GODONE = 1; // Sıradaki ölçümü ateşle
}
}
}
void __interrupt(high_priority) isr() {
// --- GÖREV 1: ZAMANLAMA VE EKRAN (TIMER0) ---
if (TMR0IF) {
TMR0IF = 0;
TMR0L = 100;
// 1. BLINK (ALARM) SAYACI
if (raw_adc > 800) {
blink_counter++;
if (blink_counter >= 25) { // 250 ms dolunca
blink_on = !blink_on; // Ana şalteri tersle
blink_counter = 0; // Sayacı sıfırla
}
} else {
blink_on = 1; // Alarm yoksa şalter hep açık kalsın
blink_counter = 0;
}
// 2. GÖRÜNTÜ VE LED YÖNETİMİ
PORTA &= 0xF0; // RA0-RA3 (haneleri) kapat ama RA4 LED'ini bozma
if (blink_on == 1) { // Şalter "AÇIK" ise
// LED Kontrolü
if (raw_adc > 800) PORTAbits.RA4 = 1; // Alarm varsa LED'i yak
else PORTAbits.RA4 = 0;
// Hane İçeriği (Modlara Göre)
if (digit_counter == 0) {
if (mod_flag == 0) PORTD = seg_char[10]; // Volt moduysa 'u' bas
else PORTD = seg_char[digits[0]]; // Ham modsa rakam bas
} else {
if (mod_flag == 0 && digit_counter == 3) {
PORTD = seg_char[digits[digit_counter]] + 0x80; // Volt modunda noktayı ekle
} else {
PORTD = seg_char[digits[digit_counter]]; // Sadece rakam
}
}
// İlgili haneyi aktif et
PORTA =(0x01 << digit_counter);
} else {
// Şalter "KAPALI" ise (Blink'in karanlık fazı)
PORTAbits.RA4 = 0; // LED'i kapat.
}
// Multiplexing sayacı
digit_counter++;
if (digit_counter == 4) {
digit_counter = 0;
}
}
// --- GÖREV 2: ADC BİTİŞ KONTROLÜ ---
if (PIR1bits.ADIF) {
PIR1bits.ADIF = 0;
conversion_done = 1;
}
// --- GÖREV 3: MOD DEĞİŞTİRME BUTONU ---
if (INT0IF) {
INT0IF = 0;
mod_flag = !mod_flag;
}
}
#include <xc.h>
#define _XTAL_FREQ 8000000
#pragma config FOSC = HSHP
#pragma config WDTEN = OFF
unsigned char seg_char[11] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x1C};
unsigned long value;
unsigned int raw_adc = 0;
unsigned char digits[4] = {0, 0, 0, 0};
unsigned char digit_counter = 0;
unsigned char conversion_done = 0;
// Yeni eklediğimiz şalterler
unsigned char mod_flag = 0; // 0: Volt Modu, 1: Ham ADC Modu
unsigned char blink_on = 1; // Ekranın ve LED'in o anki açık/kapalı durumu
unsigned int blink_counter = 0; // 250 ms'yi sayacak sayaç
void main(void) {
// PORT AYARLARI
TRISA = 0xE0;
ANSELA = 0x00;
PORTA = 0x00; // Komple PORT yapıldı
}
void __interrupt(high_priority) isr() {
}