digital saat

Başlatan picman, 16 Şubat 2005, 23:01:06

picman

beyler ilgisi olan arkadaşlara faydası olur düşüncesiyle aşığıda pic basic pro ile yazdığım saat programını veriyorum

saygılarımla

'PROGRAMIN ADI: DIGITAL SAAT

I VAR BYTE
SAAT VAR BYTE
DAKIKA VAR BYTE
DIGIT VAR BYTE
SN VAR BYTE
DK VAR BYTE
YEDEK VAR BYTE
SYMBOL SCAN=$6
SYMBOL DISPLAY=$5
P_YED VAR BYTE
LED VAR BYTE
YUK VAR BYTE
YUK=%00000000
LED=%00000
SN=0
DK=0
PORTB=0
PORTA=0
SAAT=12
DAKIKA=00
I=0
DIGIT=0
@ device pic16F84, XT_OSC, wdt_off, pwrt_on, protect_off

    OPTION_REG=$55
    INTCON=$A0
    ON INTERRUPT GOTO TMR_INT
   
BASLA: '-----------------PORT TANIMLAMALARI YAPILIYOR--------------
TRISB=%11100000
TRISA=%00000
'---------------- -------ANA PROGRAM KESİMİ--------------------
MAIN:
   GOSUB TARA
   IF (PORTB.5=0)   THEN
       PAUSE 50
       DAKIKA=DAKIKA+1
       gosub DK_TEST
     ENDIF  
   IF (PORTB.6=0) THEN
    PAUSE 50
    SAAT=SAAT+1
    GOSUB SA_TEST
   ENDIF  
   IF (dakika=02) then
      YUK=%00010000
   IF  (DAKIKA=03) THEN
      YUK=%00000000
  ENDIF
ENDIF                    
GOTO MAIN
'---------SAAT AYARI İÇİN DAKIKA VE SAAT TEST ALT PROGRAMLARI------
DK_TEST:
   IF (DAKIKA>=60) THEN
       DAKIKA=0
      ENDIF
   RETURN
SA_TEST:
   IF (SAAT>=24) THEN
       SAAT=0
    ENDIF
  RETURN            
TARA:'------------------DAKIKA TARAMA----------------------
  YEDEK=%00000001
FOR I=1 TO 2
P_YED=DAKIKA DIG DIGIT
PORTA=LED | P_YED
POKE SCAN,YEDEK      
 PAUSE 2  
 YEDEK=YEDEK | YUK
 PEEK SCAN,YEDEK
 PORTB=0            
   DIGIT=DIGIT+1
 YEDEK=YEDEK << 1
 NEXT I
DIGIT=0
I=0
'------------------------SAAT TARAMA--------------------------          
FOR I=1 TO 2
 P_YED=SAAT DIG DIGIT
 PORTA=LED | P_YED
  POKE SCAN,YEDEK                                                            
 PAUSE 2          
 YEDEK=YEDEK | YUK            
 PEEK SCAN,YEDEK
 PORTB=0
   DIGIT=DIGIT+1
 YEDEK=YEDEK << 1
NEXT I
DIGIT=0
RETURN

 
TMR_INT:'---------INTERRUPT ALT PROGRAMI--------------------------
      DISABLE
       SN=SN+1
       IF (SN>=30) THEN
        LED=%00000
    IF (SN>=61) then    
       SN=0
       LED=%10000
       DK=DK+1  
    else
       gosub INT_CIK
    ENDIF  
ENDIF
    IF (DK>=60) THEN  
    DK=0  
    DAKIKA=DAKIKA+1
   ENDIF  
INT_CIK:      
     GOSUB TEST
  INTCON.2=0                                                                                
  RESUME  
     
TEST:'----------DAKIKA VE SAAT TEST ALT PROGRAMI----------------------  
   IF (DAKIKA>=60) THEN
       DAKIKA=0
       SAAT=SAAT+1

   IF (SAAT>=24) THEN
     SAAT=0          
     ENDIF
  ENDIF
RETURN
END'-----------------PROGRAM SONU------------------------------  
'PROGRAMI HAZIRLAYAN: YUSUF YİĞİT
'İYİ EĞLENCELER
Bilgi paylaştıkça artar..

sefil

lcd de nasıl oluyor?yardımcı olursan çok sevinirim..selametle...

seco06

TRISB=%11110000   
TRISA=%00111 
PORTA=0
PORTB=0
 
'-----------------------------------------------------------------
@ DEVICE pic16F84                      
@ DEVICE pic16F84, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F84, PWRT_ON             'Power on timer açık
@ DEVICE pic16F84, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F84, XT_OSC
'-----------------------------------------------------------------
DEFINE LCD_DREG		PORTB	'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT		4		'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG		PORTB	'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		3		'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG	PORTB	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	1		'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS		4		'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES	2		'LCD Kaç sıra yazabiliyor
'DEFINE OSC 4
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
'----------------------------------------------------------------------------
X            VAR    WORD  
SAYAC       VAR   BYTE
SN          VAR   BYTE
DAK         VAR   BYTE
SAAT        VAR   BYTE
GUN         VAR   BYTE
symbol  SEC=PORTA.0
SYMBOL  YUKARI=PORTA.2
SYMBOL  ASAGI =PORTA.1
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1

'-----------------------------------------------------------------------------

BASLA:
      GOSUB EKRAN0        'SAATİ EKRANA YAZ
      if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
      GOTO BASLA
      
EKRAN0:
       LCDOUT $FE,$84,DEC2 SAAT,":",DEC2 DAK:RETURN
       
AYAR:  
       WHILE SEC=0 
       WEND
HOUR:  GOSUB EKRAN0
       LCDOUT $FE,$84
       lcdout $FE,$0E  'ÇİZGİLİ KURSÖR AÇIK
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0       
        ENDIF   
        IF ASAGI=0 THEN
           SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF   
        GOSUB GECIKME
        GOTO HOUR
        
MINBIR: WHILE SEC=0
        WEND
        
MINUTE: GOSUB EKRAN0
       LCDOUT $FE,$87
        IF SEC=0 THEN SECBIR
        IF YUKARI=0 THEN
           DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59              
        ENDIF
        GOSUB GECIKME
        GOTO MINUTE
        
SECBIR: WHILE SEC=0
        WEND
SECOND: 
        GOSUB EKRAN0
        LCDOUT $FE,$8A
        IF SEC=0 THEN ARA
        IF YUKARI=0 THEN
           SN=SN+1
           IF SN=60 THEN SN=0
        ENDIF
        IF ASAGI=0 THEN
           SN=SN-1
           IF SN=255 THEN SN=0
        ENDIF
        GOSUB GECIKME
        GOTO SECOND

GECIKME:
        FOR X=0 TO 1800
        PAUSEUS 100
        NEXT X
        RETURN

ARA:    LCDOUT $FE,$0C
        WHILE SEC=0  
        wend
        gosub GECIKME
        goto BASLA
                
 DISABLE
KESME:
      SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
          SN=SN+1        'saniye değeri bir artırılıyor
            IF SN=60 THEN  'saniye 60 olmuş ise 1 dakika süre geçti ohalde
              SN=0        ' saniye sıfırlanıyor
               DAK=DAK+1   ' dakika değeri bir artırılıyor
                  IF DAK=60 then   'dakika 60 olmuş ise 1 saat süre geçti
                     DAK=0         ' dakika sıfırlanıyor
                     SAAT=SAAT+1   ' saat değeri bir artırılıyor
                        IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
                           GUN=GUN+1     'gün değeri bir artırılıyor
                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                        endif                    'gün sıfırlanıyor 1 yıl geçti
                  ENDIF 
            ENDIF
           lcdout $fe,$89,":",DEC2 SN
          ENDIF
CIK:     INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END
        

sefil

seco dost çook sağ olasın,ama 16f84 ile yapmam gerekli... 16f628 yerine 16f84 die deiştirsem olurmu??

seco06

Tabiki olur.Yukarıda kodu senin için yeniden düzenledim

seco06