Site içi Arama

Ara

CCS-C ve 16F628A ile yapılmış basit bir geri sayıcı

Samet Yüzügüllü - 12.06.2012

16F628A ile yapılmış basit bir geri sayıcı. başla ve durdur, reset, ayar butonlarından oluşan geri sayıcı lcd ile gösterilmiştir. LCD yerine istenirse 7-seg displayde kullanılabilir. Program ayar menüsündeyken başla butonu işlemiyor, sayarkende ayar menüsüne girmiyor.

Şemayı pdf dosya olarak indirmek için tıklayınız.

Devreye ait dosyaları indirmek için tıklayınız.

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)
#include "new_lcd.c"
int8 sadise=0,saniye=0,dakika=0,saat=0,ayr=0,durum=0;

#int_TIMER1 //GERÇEK ZAMANLI SAYIM İÇİN TIMER1 KESMESİ
void TIMER1_isr(void)
{
set_timer1(15510);
sadise--;

}
//GERI SAYMASI ICIN ALT PROGRAM
void geri(){
if(sadise==255){
saniye--;
sadise=9;
}
else if(saniye==255){
dakika--;
saniye=59;
}

else if(dakika==255){
saat--;
dakika=59;
}
else if(saat==255)saat=23;
}
//SAAT, DAKİKA, SANİYE AYARLAMA İÇİN ALT PROGRAM
void ayar(){
if(input(pin_a2)&&durum==0){
ayr++;
while(input(pin_a2));}

if(ayr==1){
lcd_gotoxy(1,1);
printf(lcd_putc," Saniye Ayarla");}
if(input(pin_a3)&&ayr==1){
saniye++;
while(input(pin_a3));}

if(input(pin_a4)&&ayr==1){
saniye--;
while(input(pin_a4));}

if(ayr==2){
lcd_gotoxy(1,1);
printf(lcd_putc," Dakika Ayarla ");}
if(input(pin_a3)&&ayr==2){
dakika++;
while(input(pin_a3));}

if(input(pin_a4)&&ayr==2){
dakika--;
while(input(pin_a4));}

if(input(pin_a3)&&ayr==3){
saat++;
while(input(pin_a3));}

if(input(pin_a4)&&ayr==3){
saat--;
while(input(pin_a4));}

if(ayr==3){
lcd_gotoxy(1,1);
printf(lcd_putc," Saat Ayarla ");}

if(ayr==4){
ayr=0;
printf(lcd_putc,"f");}
}
//LCDDE GÖSTERMEK İÇİN ALT PROGRAM
void lcd(){
lcd_gotoxy(3,2);
printf(lcd_putc,"%02u:%02u:%02u:%02u "saat,dakika,saniye,sadise);
if(durum==1){
lcd_gotoxy(4,1);
printf(lcd_putc,"SAYIYOR... ");}
if(durum==0&&ayr==0){
lcd_gotoxy(4,1);
printf(lcd_putc," DURDU... ");}

}

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

set_tris_b(0);
output_b(0);
set_tris_a(255);
output_a(0);
lcd_init();
delay_ms(10);
lcd_gotoxy(3,1);
printf(lcd_putc,"GERI SAYICI");
delay_ms(1000);
lcd_gotoxy(9,1);
printf(lcd_putc,"f");//EKRAN TEMİZLEME
set_timer1(15510);

while(1){
geri();
lcd();
ayar();

//SAYMA İŞLEMİNİ BAŞLATMAK İÇİN
if(input(pin_a0)&&ayr==0&&durum==0){
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
durum=1;
while(input(pin_a0));}
//SAYDIRMA İŞLEMİNİ DURDURMAK İÇİN
if(input(pin_a0)&&durum==1){
setup_timer_1(T1_DISABLED);
durum=0;
while(input(pin_a0));}
//RESETLEMEK İÇİN
if(input(pin_a1)){
setup_timer_1(T1_DISABLED);
durum=0;
sadise=0;
saniye=0;
dakika=0;
saat=0;
while(input(pin_a1));}
//DURUMLARIN HEPSİ AYNI OLDUGUNDA PROGRAMIN DURMASI
if(saat==0&&dakika==0&&saniye==0&&sadise==0){
setup_timer_1(T1_DISABLED);
durum=0;
}
//SINIRLANDIRMALAR
if(saniye==60)saniye=0;
if(dakika==60)dakika=0;
if(saat==24)saat=0;

}
}


E-posta: samet_esk_26@hotmail.com
İçerik Yan Blok
Konular
Tasarım: Teknimer Teknoloji
Yukarı