Satranç Saati

Başlatan Ankaralı, 11 Eylül 2009, 15:27:56

Ankaralı

Aylar öncesinde foruma bir ilan vermiştim.Gelen teklifler fazla olduğu için kendim oturup bu programı yazmak zorunda kalmıştım  :lol:  Şimdi projeyi yayınlama vakti geldi..

Donanım 2pic 2lcd'den oluşmakta görünüm estetiği açısandan bu şekilde yapıldı.2 picede aynı programı gömüyoruz.Program'da 3 Menu'den oluşuyor.

1.Menü; Belli bir zaman set edilir.Oyuncular her hamle yaptığında kendi zamanlarından azalır.

2.Menü; Belli bir zaman set edilir.Oyuncular'ın her hamle yapışında azalan sürelerinin üzerine +30sn. eklenir...

3.Menü; 2.Menü'nün aynısı fakat satrançta 40. hamleler özel olduğu için 40.hamlelerde sürelerinin üzerine +30dk. daha eklenir.

@ device pic16f628A 	'işlemci 16F628A
@ device pic16f628A, WDT_OFF  'Watch Dog timer kapalı
@ device pic16f628A, PWRT_ON  'Power on timer açık
@ device pic16f628A, PROTECT_OFF  'Kod Koruma kapalı
@ DEVICE PIC16F628A, MCLR_OFF
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT
'------------------------------------------------------------------------------- 
TRISA=255
TRISB=0  
CMCON=7
SIRA var Byte
SECENEK var Byte
SANIYE var Byte 
DAKIKA var Byte 
SAAT var Byte
SAYAC VAR Byte
TIP VAR Byte 
HAMLE VAR Byte
SALISE var Byte
SALISEYENI var Byte
SANIYEYENI var Byte  
DAKIKAYENI var Byte 
SAATYENI var Byte
MENU VAR PORTA.0
YUKARI var PORTA.1
ASAGI var PORTA.2  
MODE VAR PORTA.3
DURDUR VAR PORTA.4 
ANIL VAR PORTA.5                  
Clear
'DEĞİŞKEN TANIMLAMALARI BİTİMİ

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       
Low PORTB.2
PAUSE 500

'ANA MENU BAŞLA
BASLANGIC:
LCDOUT $FE,$80,"  MENU SECINIZ  "
LCDOUT $FE,$C1,3," ",DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE

'GERİ SAYIM BAŞLA
GERI_SAYIM:
If ANIL=0 Then
While ANIL=0 
Wend 
If SECENEK<3 Then 
SECENEK=SECENEK+1
Else
SECENEK=0
Call GECIKME
EndIf
EndIf

If SECENEK=1 Then 
GoTo MEENU_1
EndIf
If SECENEK=2 Then 
GoTo MEENU_2
EndIf
If SECENEK=3 Then 
GoTo MEENU_3
EndIf
GoTo BASLANGIC 

MEENU_1:
If SECENEK=1 Then 
LCDOUT $FE,$80, "MENU1 ZAMAN GIR."  
LCDOUT $FE,$C1,3," ",DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE         
   If ASAGI=0 Then
   While ASAGI=0
   Wend 
      If SANIYE=60 Then SANIYE=0
         SANIYE=SANIYE+20
         If SANIYE=>59 Then DAKIKA=DAKIKA+1
         If SANIYE=>60 Then SANIYE=SANIYE//60
         EndIf
EndIf

MEENU_2:
If SECENEK=2 Then 
LCDOUT $FE,$80, "MENU2 ZAMAN GIR."          
LCDOUT $FE,$C1,3," ",DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE
   If ASAGI=0 Then
   While ASAGI=0
   Wend 
     If SANIYE=60 Then SANIYE=0
         SANIYE=SANIYE+20
         If SANIYE=>59 Then DAKIKA=DAKIKA+1
         If SANIYE=>60 Then SANIYE=SANIYE//60
         EndIf
EndIf

MEENU_3:
If SECENEK=3 Then 
LCDOUT $FE,$80, "MENU3 ZAMAN GIR."        
LCDOUT $FE,$C1,3," ",DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE
   If ASAGI=0 Then 
   While ASAGI=0
   Wend 
     If SANIYE=60 Then SANIYE=0
         SANIYE=SANIYE+20
         If SANIYE=>59 Then DAKIKA=DAKIKA+1
         If SANIYE=>60 Then SANIYE=SANIYE//60
         EndIf
EndIf

If mode=0 Then 
While mode=0 
Wend
TIP=1

If SALISE=0 And SANIYE=0 And DAKIKA=0 And SAAT=0 Then 
GoTo GERI_SAYIM
Else
 
If saat=>0 And dakika=>0 And SANIYE>0 Then 
SANIYE=SANIYE-1
Else
If DAKIKA=0 And SANIYE=0 Then
If SAAT>0 Then SAAT=SAAT-1 : DAKIKA=59 :SANIYE=59
EndIf

If SANIYE=0 Then
If DAKIKA>0 Then DAKIKA=DAKIKA-1 : sANIYE=59
EndIf
EndIf
SALISE=100

GoTo KESME_AYAR 
EndIf

Else
If MENU=0 Then 
While MENU=0
Wend
GoTo BASLANGIC
Else
GoTo GERI_SAYIM
EndIf
EndIf
'GERİ SAYIM BİTİMİ

'KESME KONFİGÜRASYONU BAŞLA
KESME_AYAR: 

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 
If TIP=1 Then GoTo AZALT
'KESME KONFİGÜRASYONU BİTİMİ

'GERI SAYIM BAŞLA
AZALT:
LCDOUT $FE,$C3, DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE

If SECENEK=1 Then
If YUKARI=0 Then
SALISEyeni=SALISE
SANIYEyeni=SANIYE 
DAKIKAyeni=DAKIKA
SAATyeni=SAAT 
While YUKARI=0 
Wend 
GoTo G_DURAGAN_ZAMAN
Else
GoTo AZALT  
EndIf
EndIf

If SECENEK=2 Then
If YUKARI=0 Then
SALISEyeni=SALISE
SANIYEyeni=SANIYE 
DAKIKAYENI=DAKIKA
SAATYENI=SAAT
If SANIYEYENI=60 Then SANIYEYENI=0
SANIYEYENI=SANIYE+30
If SANIYEYENI=>59 Then DAKIKAYENI=DAKIKA+1
If SANIYEYENI=>60 Then SANIYEYENI=SANIYEYENI//60
While YUKARI=0 
Wend 
GoTo G_DURAGAN_ZAMAN 
Else 
GoTo AZALT
EndIf
EndIf

If SECENEK=3 Then
If YUKARI=0 Then
SALISEyeni=SALISE 
SANIYEyeni=SANIYE
DAKIKAYENI=DAKIKA
SAATYENI=SAAT 
HAMLE=HAMLE+1
If HAMLE=40 Then DAKIKAYENI=DAKIKA+30
If SANIYEYENI=60 Then SANIYEYENI=0
SANIYEYENI=SANIYE+30
If DAKIKAYENI=>59 Then SAATYENI=SAAT+1
If DAKIKAYENI=>60 Then DAKIKAYENI=DAKIKAYENI//60
If SANIYEYENI=>59 Then DAKIKAYENI=DAKIKA+1
If SANIYEYENI=>60 Then SANIYEYENI=SANIYEYENI//60
While YUKARI=0 
Wend 
GoTo G_DURAGAN_ZAMAN 
Else 
GoTo AZALT
EndIf
EndIf

G_DURAGAN_ZAMAN:
If durdur=0 Then
SAAT=0
DAKIKA=0
SANIYE=0
SAATyeni=0
DAKIKAyeni=0
SANIYEyeni=0
SALISEyeni=0
SALISE=0
EndIf 
LCDOUT $FE,$C3, DEC2 SAATYENI,":",DEC2 DAKIKAYENI,":",DEC2 SANIYEYENI,":",DEC2 SALISEYENI
If mode=0 Then
While mode=0 
Wend   
GoTo G_DEVAM 
Else
If menu=0 Then
Call GECIKME 
GoTo BASLANGIC
Else
GoTo G_DURAGAN_ZAMAN 
EndIf 
EndIf

G_DEVAM: 
SAAT=SAATyeni
DAKIKA=DAKIKAyeni
SANIYE=SANIYEyeni
SALISE=SALISEYENI
GoTo AZALT

'GERI SAYIM BİTİMİ

'KESME FONKSIYONU BAŞLA
Disable 
KESME:
If TIP=1 Then 
SAYAC=SAYAC+1 
If SAYAC=1 Then 
SAYAC=0
SALISE=SALISE-1
If SALISE=0 Then
If SANIYE<>0 Then 
SANIYE=SANIYE-1
SALISE=100
EndIf
If SANIYE=0 Then
If DAKIKA<>0 Then 
DAKIKA=DAKIKA-1
SANIYE=59
EndIf
If DAKIKA=0 Then
If SAAT<>0 Then 
SAAT=SAAT-1
DAKIKA=59
EndIf 
EndIf 
EndIf 
EndIf
EndIf
If SALISE=0 And SANIYE=0 And DAKIKA=0 And SAAT=0 Then GoTo GERI_SAYIM 
EndIf
INTCON.2=0 
Resume 
'KESME FONKSIYONU BİTİMİ
GECIKME:
PAUSE 100
Return 
End


@ NEXYS2

fthtsdmr

Çok süre geçmiş ama devrenin proteus dosyası ve ya resmi paylaşılırsa çok sevinirim.