program pic16f628_step
const stepValue as byte[4]=($08,$04,$02,$01)
const MAX_DELAY=100
const MIN_DELAY=20
const TIMER0_VALUE=$01
const KEY_UP = 1
const KEY_DOWN = 2
const KEY_DIR = 3
const KEY_WORK = 4
const KEY_NOTHING = 0
const DIR_CCW=1
const DIR_CW=2
const RUN_START=1
const RUN_STOP=2
dim delayCoeff as byte
dim prevKey as byte
dim keyChecked as byte
dim doKey as byte
dim stepDir as byte
dim isRunning as byte
'----------Kesme servisi
sub procedure Interrupt
clearBit(INTCON,TMR0)
if INTCON.TMR0IF = 1 then
ClearBit(INTCON,TMR0IF)
TMR0=TIMER0_VALUE
if PORTA.0= 1 then
Inc(keyChecked)
prevKey = KEY_UP
end if
if PORTA.1= 1 then
Inc(keyChecked)
prevKey = KEY_DOWN
end if
if PORTA.2= 1 then
Inc(keyChecked)
prevKey = KEY_DIR
end if
if PORTA.3= 1 then
Inc(keyChecked)
prevKey = KEY_WORK
end if
if keyChecked> $FE then
dokey = 1
end if
end if
setBit(INTCON,GIE)
end sub
'------------------Ana Program-------------
sub procedure Init_Main
TRISA=$FF
PORTA=0
TRISB=0
PORTB=0
OPTION_REG=$C8 'ESKİ DURUM $C8
TMR0=TIMER0_VALUE
INTCON=$A0 'ESKİ DURUM $A0
delayCoeff= MAX_DELAY
prevKey = 0
keyChecked=0
stepDir=DIR_CW
isRunning=1
end sub
'-------Gecikme ayarları-------------
sub procedure Delay_Step(dim delTime as byte)
dim i as byte
i = 0
while i<delTime
Delay_500us
Inc(i)
wend
end sub
'-----------clock palslerinin latch e gönderilmesi----
sub procedure Ping(dim byref port as byte)
SetBit(port,4)
ClearBit(port,4)
end sub
'------------bir step döngüsü-------------
sub procedure Do_Step(dim byref port as byte)
dim ii as byte
if isRunning=RUN_START then
if (stepDir=DIR_CW) then
ii=0
while (ii<4)
port=stepValue[ii]
Ping(port)
Delay_Step(delayCoeff)
Inc(ii)
wend
else
ii=0
while (ii<4)
port=stepValue[3-ii]
Ping(port)
Delay_Step(delaycoeff)
Inc(ii)
wend
end if
end if
end sub
'-------butonların taranması----
sub procedure Do_key
if doKey=1 then
doKey=0
keyChecked=0
select case prevKey
case KEY_DOWN
if (delayCoeff>MIN_DELAY) then
Dec(delayCoeff)
end if
case KEY_UP
if (delayCoeff<MAX_DELAY) then
Inc(delayCoeff)
end if
case KEY_DIR
stepDir=3-stepDir
case KEY_WORK
isRunning=3-isRunning
end select
prevKey=KEY_NOTHING
end if
end sub
'------ana prosedure----
main:
Init_Main
while 1=1
Do_Key
Do_Step(PORTB)
wend
end.
(BU PROGRAM BETİ EASYPIC KİTABINDAN ALINTIDIR)