ÖRNEK PROGRAM: 1 LED ANiMASYONU
işe fantezi ile başlayalım ve bir LED-ANiMASYON projesi verelim. Bu projede PortA ve PortB nin tamamı kullanılarak 16 led’den oluşan bir görsel gösteri ünitesi yapacağız. Ledler değişik şekillerde yanarak bize bir gösteri sunacaklar.
Önce Şemamız;
Aslında PIC16F628 de PortA.5 (MCLR bacağı) çıkış olarak kullanılamaz. Ancak sırf görsel amaçlı olarak bu projede simulasyon olarak denedim ve çalıştığını gördüm. Gerçekte çalışmaması gerekir. Devreyi yapacaklar için kısa bir açıklama olarak vereyim istedim.
Diğer taraftan gerçek devrede Pic pinleri ile Led ler arasında 330 Ohm direnç kullanılması gerekmektedir. Aksi halde Pic bozulur. BU açıklama da devreyi fiilen yapmak isteyenler içindir.
ÖRNEK PROGRAM : 2 OTO CAM KONTROLU
ikinci örneğimiz enteresan bir örnek olacak. 16F628 de komparatör kullanımına güzel bir örnekdir. Projenin amacı otomobillerde motor kontrollu yan camların açılıp kapanmasını otomatik olarak kontrol etmekdir. Cam açma butonuna kısa süreli basılır ise cam basılan süre kadar aşağı veya yukarı hareket edecek, butona biraz uzun basılması halinde ise cam otomatik olarak açılacak veya kapanacaktır. Tabiiki nereye kadar, cam son noktada gidecek yeri olmadığı için motor sıkışacak ve normalde 2 Amper dolayında motordan çekilen akım 3 amper veya daha fazlasına yükselecektir. işte bu aşamada komparatörler devreye girerek motorun akımını keseceklerdir.
Motorun sıkışmasını simule edebilmek için çalışan motora paralel ikinci bir motor daha devreye sokulmaktadır. Bu sayede normalde 2 A dolayında olan çekilen akım iki katına çıkmaktadır ve sistem çekilen fazla amperi algılayıp motorları durdurmaktadır. Sistemin çekilen hangi amper seviyesinde durmasını sağlayacak ince ayarlar devrede bulunan 2 adet 220 Ohm ayarlı dirençler ile yapılmaktadır.
Önce şemamızı verelim;
ÖRNEK PROGRAM : 3 DTMF iLE CiHAZ KONTROLU
Bu örneğimizde Telefonla cihaz kontrol sistemini inceleyeceğiz. Kısaca DTMF kontrol ismi verilen program ile bir telefon hattına bağlayacağımız sistemimizle 5-6 adet cihazı istediğimiz zaman açıp kapatabileceğiz. Arada mesafe olduğundan yapılan işlerin onayı sesli olarak hattan verilmektedir. Bu aleti fiziki olarakda yaptım ve kullanıyorum. Bu devrede simulasyon imkanımız olmadığı için devre şeması vermekle yetineceğiz.;
Programa geçmeden kullanımla ilgili bazı açıklamalar vermek istiyorum.
Program öncelikle çalan telefon zilini saymakta ve önceden ayarlanmış adedi bulduğunda hattı otomatik olarak açmaktadır. Zilin çalma sayısı program içinden değiştirilebilmektedir.
Hat açıldıktan sonra program şifre girmenizi beklemektedir. Şifre 4 haneli bir rakam olup default olarak 1111 şeklinde ayarlanmıştır. Ayrıca birde master şifre vardır. Ana şifrenin unutulması durumunda master şifre girilerek şifrenin default şifre ye dönüştürülmesi sağlanmıştır.
Şifre girişini takiben program role kontrol bölümüne atlamaktadır. Burada ;
-önce # tuşu sonra 1-2-3-4-5 rakamlarından herhangi birisi girildiği tatirde girilen rakama karşılık gelen role çıkışı aktif edilmekte bu durum ilgili led in yanması ile anlaşılmaktadır. Açılan rolenin sayısı kadar da hatta beep sesi verilmektedir. Örneğin 2 nolu role açılmış ise Beep – Beep şeklinde 2 adet beep sesi alınmaktadır.
-Önce # tuşu ardından 8 tuşu girilir ise Zil çalma adedi değiştirilebilir. 8 rakamının hemen ardından yeni zil adedi girilmelidir. -Önce # sonra 9 rakamı girilir ise şifre değiştirilecek demektir. Burada önce eski şifre ardından yeni şifre
girilmelidir. -Önce # ve ardından 0 rakamı girilir ise sistemden çıkış yapılır. Hat kapatılır. -Önce * tuşu ve ardından 0 rakamı girilir ise açık olan tüm roleler kapatılmaktadır. -Önce * ardından 1-2-3-4-5 rakamlarından biri girilir ise ilgili rakama karşılık gelen role kapatılır.
Devrede kullanılan trafo 600/600 sarımlı telefon hat trafosudur. Eski modemlerin üzerinde bulunmaktadır.
‘****************************************************************
‘* Name : UNTITLED.BAS *
‘* Author : [E.T.E] *
‘* Notice : Copyright (c) 2005 Ete] *
‘* : All Rights Reserved *
‘* Date : 02.06.2005 *
‘* Version : 1.0 *
‘* Notes : *
‘* : *
‘****************************************************************
PORTA=0:PORTB=0
TRISB=000001 ‘PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=111111 ‘A portu tamamı çıkış yapıldı.
‘—————————————————————–
@ DEVICE pic16F628 ‘işlemci 16F628
@ DEVICE pic16F628, WDT_OFF ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF ‘MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘—————————————————————–
CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giriş çıkış
‘—————————————————————–
SIFRE VAR WORD
RAKAM var WORD
TEMP VAR WORD
BASKA VAR WORD
ZAMAN VAR WORD
SURE VAR word
SAYAC VAR BYTE
SAYI VAR BYTE
DURUM VAR BYTE
BIRLER VAR BYTE
ONLAR VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
ZIL VAR BYTE ‘ÇALACAK ZİL ADEDİ
X VAR BYTE
CIK VAR BIT
SYMBOL HAT=PORTB.0
SYMBOL CIKIS1=PORTB.1
SYMBOL CIKIS2=PORTB.2
SYMBOL CIKIS3=PORTB.3
symbol CIKIS4=PORTB.4
SYMBOL CIKIS5=PORTB.5
SYMBOL ISD =PORTB.6
SYMBOL ROLE=PORTB.7
SYMBOL VALDAT=PORTA.0
SYMBOL BUZZER=PORTA.7
‘————————————————————————–
‘DATA @ 0,1,2,3,4
‘data @ 0,255,255,255,255,255
DATA @ 16,5
PAUSE 200
CLEAR
read 0,SAYI: PAUSE 10
IF SAYI=$FF THEN
SIFRE=1234
GOSUB SIFREYAZ
endIF
READ 0,BINLER
READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER
SIFRE=BINLER*1000+YUZLER*100+ONLAR*10+BIRLER
READ 16,ZIL
IF ZIL=255 THEN
ZIL=5
WRITE 16,ZIL
ENDIF
‘————————————–ANA————————————–
BASLA: Sayac=0
‘——————————-PORTB.0=HIGH————-
ILK: IF HAT=1 THEN ILK
‘——————————PORTB.0=LOW—————
BAK: SAYAC=SAYAC+1
BIR: IF HAT=0 THEN BIR
‘——————————PORTB.0=LOW—————–
IF SAYAC=ZIL THEN
PAUSE 1800
HIGH ROLE
pause 300
GOTO BIRINCI
ENDIF
SURE=0
WHILE HAT=1
SURE=SURE+1
IF SURE=300 THEN ILK
PAUSE 1
WEND
IF SURE<100 THEN BIR
GOTO BAK
‘——————ZİL SAYMA BÖLÜMÜ BİTTİ——————
BIRINCI: :SAYAC=0:GOSUB SES1:GOSUB SES2:gosub ses1
YINE: RAKAM=0:GOSUB SIFREAL
IF CIK=1 THEN BITIR
IF RAKAM=7676 THEN
SIFRE=1234
GOSUB SES2
GOSUB SES1
GOSUB SES2:gosub ses1
GOSUB SIFREYAZ
GOTO ROLEKONTROL
ENDIF
IF RAKAM=SIFRE THEN
GOSUB SES2 : pause 50
GOSUB SES1: pause 50
GOSUB SES1:gosub ses1
GOTO ROLEKONTROL
ENDIF
SAYAC=SAYAC+1
IF SAYAC=3 THEN
ATLA: GOSUB EXIT
SLEEP 600
GOTO BASLA
ENDIF
GOSUB SES2
GOSUB SES1
GOSUB SES3
GOTO YINE
ROLEKONTROL: GOSUB ALBILGI
IF CIK=1 THEN BITIR
IF SAYI=12 THEN ACMA ‘#
IF SAYI=11 THEN KAPAT ‘*
gosub ses2
‘ GOSUB EXIT
GOTO BASLA
ACMA:
GOSUB ALBILGI
IF CIk=1 THEN BITIR
IF SAYI=0 THEN
gosub ses3
GOSUB EXIT
GOTO BASLA
ENDIF
DURUM=PORTB
IF SAYI=1 THEN
IF durum.1=0 THEN
GOSUB SES1
PORTB=DURUM | 000010
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=2 THEN
IF durum.2=0 THEN
GOSUB SES1:GOSUB SES1
PORTB=DURUM | 000100
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=3 THEN
IF durum.3=0 THEN
FOR X=1 TO 3:GOSUB SES1:NEXT
PORTB=DURUM | 001000
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=4 THEN
IF durum.4=0 THEN
FOR X=1 TO 4:GOSUB SES1:NEXT
PORTB=DURUM | 010000
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=5 THEN
IF durum.5=0 THEN
FOR X=1 TO 5:GOSUB SES1:NEXT
PORTB=DURUM | 100000 ‘#5
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=8 THEN ‘#8
GOSUB SES2
GOSUB ALBILGI
GOSUB SES1:gosub ses2
IF CIK=1 THEN BITIR
IF SAYI>0 AND SAYI<13 THEN
ZIL=SAYI:WRITE 16,ZIL: PAUSE 10
ENDIF
GOTO ROLEKONTROL
ENDIF
IF SAYI=9 THEN ‘#9
GOSUB SIFREAL
GOSUB SES1:gosub ses2
IF CIK=1 THEN BITIR
IF RAKAM=SIFRE THEN
GOSUB SES1:GOSUB SES1:GOSUB SES2
GOSUB SIFREAL
IF CIK=1 THEN BITIR
SIFRE=RAKAM
GOSUB SES1:gosub ses2
gosub SIFREYAZ
ENDIF
ENDIF
GOTO ROLEKONTROL
KAPAT: GOSUB ALBILGI
IF CIK=1 THEN BITIR
durum=PORTB
IF SAYI=0 THEN
GOSUB SES3
PORTB=DURUM & %11000001 ‘*0
ENDIF
IF SAYI=1 THEN
IF durum.1=1 THEN
GOSUB SES2
PORTB=DURUM & %11111101
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=2 THEN
IF durum.2=1 THEN
GOSUB SES2:GOSUB SES2
PORTB=DURUM & %11111011
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=3 THEN
IF durum.3=1 THEN
FOR X=1 TO 3:GOSUB SES2:NEXT
PORTB=DURUM & %11110111
goto ROLEKONTROL
ENDIF
ENDIF
IF SAYI=4 THEN
IF durum.4=1 THEN
FOR X=1 TO 4:GOSUB SES2:NEXT
PORTB=DURUM & %11101111
goto ROLEKONTROL
ENDIF
endif
IF SAYI=5 THEN
IF durum.5=1 THEN
FOR X=1 TO 5:GOSUB SES2:NEXT
PORTB=DURUM & %11011111 ‘*5
ENDIF
ENDIF
GOTO ROLEKONTROL
SIFREAL: GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=SAYI*1000
GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=RAKAM+SAYI*100
GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=RAKAM+SAYI*10
GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=RAKAM+SAYI
RETURN
ALBILGI:
SURE=0:ZAMAN=0
WHILE VALDAT=0
SURE=SURE+1
PAUSEus 270
IF SURE=65500 THEN
CIK=1:RETURN
ENDIF
WEND
SAYIAL: SAYI=0
WHILE VALDAT=1
SAYI.0=PORTA.4
SAYI.1=PORTA.3
SAYI.2=PORTA.2
SAYI.3=PORTA.1
WEND
IF SAYI=10 THEN SAYI=0
RETURN
SIFREYAZ:TEMP=SIFRE
BINLER=TEMP DIG 3
YUZLER=TEMP DIG 2
ONLAR =TEMP DIG 1
BIRLER=TEMP DIG 0
WRITE 0,BINLER: PAUSE 10
WRITE 1,YUZLER: PAUSE 10
WRITE 2,ONLAR : PAUSE 10
WRITE 3,BIRLER: PAUSE 10
RETURN
SES1: SOUND BUZZER,[110,12]: pause 30:RETURN
SES2: SOUND BUZZER,[95,12] : PAUSE 30:RETURN
SES3: SOUND BUZZER,[85,25] : PAUSE 30:RETURN
BITIR: GOSUB EXIT:GOTO BASLA:RETURN
EXIT : SURE=0
HAT=0
CIK=0
SAYAC=0
RAKAM=0
LOW ROLE
LOW ISD
gosub ses2
gosub ses2
GOSUB SES3
GOSUB SES3
RETURN
End
ÖRNEK PROGRAM : 4 ***********DiJiTAL POT (DS1868) KONTROLÜ**********
Dallas firmasının DS1868 kodlu dijital potansiyometre kullanımına ait bir örnek vermek istiyorum. Söz konusu potansiyometrenin model dosyası bulunmadığından dolayı simulasyon bir shift register kullanılarak yapılmıştır.
Neticede DS1868 in içinde bir shift register bulunmaktadır ve pot değeri bu registere yazılarak sağlanmaktadır. Önce şemamız;

‘****************************************************************
‘* Name : PIC-DIGIPOT.BAS *
‘* Author : [E.T.E] *
‘* Notice : Copyright (c) 2004 [ETE] *
‘* : All Rights Reserved *
‘* Date : 25.08.2004 *
‘* Version : 1.0 *
‘* Notes : *
‘* : *
‘****************************************************************
RAW VAR BYTE
ZAMAN VAR WORD
RST VAR PORTA.0
CLK VAR PORTA.2
BILGI VAR PORTA.1
TUSA VAR PORTB.0
TUSB var PORTB.1
KONUM VAR BYTE
I VAR BYTE
STK VAR BYTE
TRISA=000000
TRISB=000011
PORTB=0
PORTA=0
ZAMAN=0
STK=1
‘ ADCON1 = 000010 ‘AN0 VE AN1 Analog,Ref =VDD
PAUSE 500
konum=0
raw=0
I=0
BASLA:
IF TUSA=0 THEN
IF I=1 THEN BASLA
if konum=255 then basla
konum=konum+1:I=1:GOTO CIK
ENDIF
IF TUSb=0 THEN
IF I=1 THEN BASLA
if konum=0 then basla
konum=konum-1:I=1:GOTO CIK
ENDIF
IF RAW<>KONUM THEN GOSUB POTYAZ
I=0
CIK: GOTO BASLA
POTYAZ: HIGH RST: PAUSE 1
HIGH BILGI
PULSOUT CLK,1
SHIFTOUT BILGI,CLK,1,[KONUM]
SHIFTOUT BILGI,CLK,1,[KONUM]
LOW RST: PAUSE 1
RAW=KONUM
RETURN
end
ÖRNEK PROGRAM : 5 **************FREKANSMETRE – PALS SAYICI*******************
Bu örneğimizde Bir Frekansmetre yapacağız. Bu programda Pic16F628 kullanacağız. PIC16F628 de 16 bitlik TMR1 sayacını dışarıdan gelen palsleri sayacak şekilde ayarlayıp sonuçta belirli örnekleme süreleri kullanarak frekans veya pals sayacı olarak kullanacağız. Frekans ölçme aralığımız kullandığımız örnekleme süresine bağlı olarak 1 Hz ile yaklaşık 40 MHz arasında olacaktır. Teorik olarak üst sınır 65 MHz dolayındadır.
Ancak kullanılan malzemeler bu frekanslara çıkmadığı için denemelerle sabit olan ölçülebilecek maksimum frekans yaklaşık 40 MHz dolayındadır. Ancak frekans kaynağından Pic’e direkt giriş yapabilirseniz bu durumda üst sınır yükselebilmektedir. Frekansmetre’nin üst ölçüm sınırını daha da yukarı çekebilmek için arada birde 64’e bölücü (U664) kullanılmaktadır.
Bu durumda üst ölçüm sınırı 1,2 GHz ye kadar çıkabilecektir. Program PicBasicPro ile birlikte ASM nin kullanılmasına iyi bir örnekdir. BU programda frekans ölçümünde kullanılacak olan örnekleme süreleri için ASM kullanılmıştır. Zira, 1ms – 10 ms – 100 ms ve 1000 ms lik süreleri hassas olarak elde etmenin en iyi yolu ASM kullanmaktır. Temel mantık olarak düşük frekanslarda büyük süre yüksek frekanslarda ise düşük süre kullanılarak ölçüm yapılmaktadır.
Programı isis de simule edebilmek için
basit bir devre kullanıyoruz. Önce bu devremizi verelim;
Programda TMR1 kullanıldığını söylemiş idik. TMR1 şayet dışarıdan gelen pals leri sayacak ise giriş bacağı olarak yalnızca PortB.6 pini kullanılmaktadır. Dolayısıyla programda da bu bacak kullanılmıştır.
Program girilen frekansa bağlı olarak ölçüm modu (örnekleme süresi) seçimini otomatik yapmaktadır. Bunu anlayabilmek için önce bir kısa süreli ölçüm yapmakta ve bulduğu değere bağlı olarak mod seçmektedir.
işte Programımız;
‘****************************************************************
‘* Name : Frekans-Roleli.BAS *
‘* Author : [Erol Erdal] *
‘* Notice : Copyright (c) 2004 [Erolec] *
‘* : All Rights Reserved *
‘* Date : 29.11.2004 *
‘* Version : 1.6 *
‘* Notes : 10MHz Kristal ile çalışır, U664 (64'de bölücü) *
‘* : ile çalışır, Otomatik 4 Mod (0-3) seçer *
‘****************************************************************
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_off
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_ON
@ DEVICE pic16F628, HS_OSC
DEFINE OSC 10
DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
define LCD_RWREG PORTB
DEFINE LCD_RWBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 4000
DEFINE LCD_DATAUS 250
TRISA=0
TRISB=%11111000
low PORTB.1
‘——————————————————————————-
Frekans var word
FrekansL var Frekans.byte0
FrekansH var Frekans.byte1
sure VAR WORD
sureL var SURE.Byte0
sureH var SURE.Byte1
TOPLAM var word
sayac var word
counter var byte
HAS VAR BYTE
I var byte
X var bit
Z VAR BIT
ilk var bit
SEC VAR PORTB.7
‘——————————————————————————-
Z=0
CMCON=7
has=0:ilk=0
lcdout $FE,1
lcdout “***EROL ERDAL***”
lcdout $FE,$C0,”**FREKANSMETRE**”: PAUSE 300
‘******************************* FREKANSMETRE***********************************
START:
‘ gosub olc
‘ gosub modsec
‘ lcdout $FE,1,”fre:”,#frekans,” mod=”,#has,”S=”,#SEC
‘ pause 500:goto start
ATLA: IF SEC=1 THEN
HAS=4:goto birinci
else
gosub MODSEC
endif
pause 200
Birinci: SELECT CASE has
‘———-bölücüsüz ölçüm— Mode=0——-0 Hz - 65 KHz.———————-
CASE 0
gosub binms
Lcdout $FE,$80,”0-65 KHz : MOD=”,#has
if frekans<1000 then
Lcdout $FE,$C0,”Fre:”,#frekans,” Hz ”
gosub tus
goto ATLA
endif
sayac=frekans/1000:Toplam=(frekans//1000)
Lcdout $FE,$80,”0-65 KHz : MOD=”,#has
Lcdout $FE,$C0,”Fre:”,#sayac,”.”,dec3 Toplam,” Hz ”
GOSUB TUS
‘ pause 500
goto ATLA
‘——-bölücüsüz ölçümler —Mode=1——-65 KHz.- 650 KHz—————–
CASE 1
gosub yuzms
Sayac=frekans/100:Toplam=(frekans//100)
Lcdout $FE,$80,”65-650KHz: MOD=”,DEC has
Lcdout $FE,$C0,”Fre:”,#Sayac,”,”,#Toplam,” KHz ”
GOSUB TUS
‘ pause 500
GOTO ATLA
‘——BÖLÜCÜSÜZ ÖLÇÜMLER—-Mode=2——650 KHz - 6,5 MHz————–
CASE 2
gosub onms
sayac=frekans/10:Toplam=(frekans//10)
Lcdout $FE,$80,”065-6 MHz: MOD=”,#has
if sayac<1000 then
Lcdout $FE,$C0,”Fre:”,#sayac,”,”,dec3(Toplam*100),” KHz ”
gosub tus:goto ATLA
endif
toplam=sayac/1000
lcdout $fe,$C0,”Fre:”,#toplam,”,”,#(sayac//1000),” MHz ”
gosub tus
goto ATLA
‘——-BÖLÜCÜSÜZ ÖLÇÜMLER——Mode=3——6,5 MHz - 30 MHz————
CASE 3
gosub Birms
sayac=frekans
toplam=sayac/1000
Lcdout $FE,$80,”6,5-50MHz: MOD=”,#has
lcdout $fe,$C0,”Fre:”,#toplam,”,”,#(sayac//1000),” MHz ”
gosub tus
‘ pause 500
goto ATLA
‘——BÖLÜCÜ İLE ÖLÇME BÖLÜMÜ—-Mode=4——30 mhZ - 1200 mhZ——–
case 4
gosub birms
sayac=Frekans**64
frekans=div32 10
sayac=frekans/100:Toplam=(frekans//100)
Lcdout $FE,$80,”50 MHz>: MOD=”,#has
Lcdout $FE,$C0,”Fre:”,#Sayac,”,”,dec3 (Toplam*10),” MHz ”
gosub tus
‘ pause 500
Goto ATLA
‘————modların sonu ——————————————–
case 5
HAS=0:GOTO START
END SELECT
Z=0
GOTO START
‘
TUS: if PortB.3=1 then
IF Z=1 THEN CIK
has=has+1: PAUSE 1
IF has=5 THEN has=0
Z=1
RETURN
ENDIF
Z=0
CIK: RETURN
‘———————MODSEC——————————–
MODSEC: ‘pause 5:gosub olc’:return
pause 100
‘ if frekans>340 then
‘ has=4:RETURN
‘ endif
‘ if (frekans>43) and(frekans<217) then
‘ has=3:RETURN
‘ endif
gosub birms
if Frekans<66 then has=0
if frekans>65 and frekans<651 then has=1
if frekans>650 and frekans<6501 then has=2
if Frekans>6500 and Frekans<32001 then Has=3
‘ IF frekans >50000 THEN HAS=4
return
OLC:
asm
movlw 0×01
movwf _SureL
movlw 0×03
movwf _SureH
delay_0
btfss portb,6
goto tamamolc
decfsz _SureL, f
goto $+3
decfsz _SureH, f
goto Delay_0
Goto son
tamamolc
call zaman
movlw 0×01
movwf _SureL
movlw 0×01
movwf _SureH
Delay_1
decfsz _SureL, f
goto $+2
decfsz _SureH, f
goto Delay_1
goto $+1
Goto son
zaman
bcf STATUS,RP0
bcf STATUS,RP1
clrf TMR1L
clrf TMR1H
movlw 7
movwf T1CON
return
endasm
Binms:
ASM
movlw 0×20 ;19 idi
movwf _SureL
movlw 0×80 ;74 idi
movwf _SureH
movlw 0×06
movwf _Counter
delay_2
btfsc portb,6
goto tamambin
decfsz _SureL, f
goto delay_2
decfsz _SureH, f
goto $+2
decfsz _Counter, f
goto Delay_2
goto son
tamambin
call zaman
movlw 0×19 ;19 idi
movwf _SureL
movlw 0×74 ;74 idi
movwf _SureH
movlw 0×06
movwf _Counter
Delay_3
decfsz _SureL, f
goto $+2
decfsz _SureH, f
goto $+2
decfsz _Counter, f
goto Delay_3
Goto son
endasm
Yuzms:
ASM
movlw 0×4e ;4e idi
movwf _SureL
movlw 0xCa ;c4 idi
movwf _SureH
Delay_4
btfsc portb,6
goto tamamyuz
decfsz _SureL, f
goto delay_4
decfsz _SureH, f
goto $+2
goto son
tamamyuz
movlw 0×4f ;4e idi
movwf _SureL
movlw 0xC4 ;c4 idi
movwf _SureH
call zaman
Delay_5
decfsz _SureL, f
goto $+2
decfsz _SureH, f
goto Delay_5
goto $+1
Goto Son
endasm
Onms:
asm
movlw 0×86
movwf _SureL
movlw 0×20
movwf _SureH
Delay_6
btfsc portb,6
goto tamamon
decfsz _SureL, f
goto delay_6
decfsz _SureH, f
goto $+2
goto son
Tamamon
movlw 0×87
movwf _SureL
movlw 0×14
movwf _SureH
call zaman
Delay_7
decfsz _SureL, f
goto $+2
decfsz _SureH, f
goto Delay_7
goto $+1
goto son
endasm
Birms:
ASM
movlw 0xf2
movwf _SureL
movlw 0×04
movwf _SureH
Delay_8
btfsc portb,6
goto tamambir
decfsz _SureL, f
goto delay_8
decfsz _SureH, f
goto $+2
goto son
tamambir
call zaman
movlw 0xf2
movwf _SureL
movlw 0×02
movwf _SureH
Delay_9
decfsz _SureL, f
goto $+2
decfsz _SureH, f
goto Delay_9
goto $+1
son
nop
movlw 6
movwf T1CON
movf TMR1L,0
movwf _FrekansL
movf TMR1H,0
movwf _FrekansH
endasm
RETURN
END
Program içinde bazı kapatılmış bölümler vardır. Bunlar test amaçlı koyulmuştur. Gerekirse tamamını kaldırabilirsiniz.