home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2000 December
/
Chip_2000-12_cd1.bin
/
internet
/
pic
/
semafor
/
semafor1.asm
< prev
next >
Wrap
Assembly Source File
|
2000-09-24
|
12KB
|
361 lines
;*****************************************************************
;* semafor 10.09.2000 26.09.2000 *
;* 2x3 LED diod + 2x2 LED diody + 3 tlacitka *
;*****************************************************************
;* http://www.mujweb.cz/pocitace/doveda *
;*****************************************************************
;* *
;* -----\/----- *
;* chodec 2 cervena -|RA2 RA1|- chodec 1 zelena *
;* chodec 2 zelena -|RA3 RA0|- chodec 1 cervena *
;* tlac R / A -|RA4ck osc1|- \ Crystal 3,2768MHz *
;* Vdd -|MCLR osc2|- / *
;* ground -|Vss Vdd|- +5V *
;* semafor 1 cervena -|RB0int RB7|- tlac chodec 2 ( neni ) *
;* semafor 1 oranzova -|RB1 RB6|- tlac chodec 1 ( neni ) *
;* semafor 1 zelena -|RB2 RB5|- semafor 2 zelena *
;* semafor 2 cervena -|RB3 RB4|- semafor 2 oranzova *
;* ------------ *
;* DOVEDA BOYS c 1997-2000 *
;*****************************************************************
; -------------------------- ----
; 1C ----- -----------------------
; -- -- --
; 1O --- ------------------------ --------------------- ----
; --- ---------------------
; 1Z ---------------------------- ------
; | T1 | T2 |
; ------- ---------------------------
; 2C ---------------------- -
; -- -- --
; 2O ----- -------------------- ------------------------- -
; -------------------- -
; 2Z ------- -----------------------------
; | T1 | T2 |
; ---------------------------- -----------
; 1C --- ---------------
; --- ---------------
; 1Z ---------------------------- -----------
; ------- --------------------------------
; 2C --------------- ---
; --------------- ---
; 2Z ------- --------------------------------
; | T1 | T2 |
; MAIN1 MAIN2 MAIN1
list p=16f84
include "p16f84.inc"
TIMER equ 0x0C ; pro preruseni
SEKUNDA equ 0x0D ; prerusena 1s
PRERUS equ 0x15
BAK_W equ 0x16
BAK_S equ 0x17
TMP0 equ 18h
TMP1 equ 19h
TMP2 equ 1Ah
TMP3 equ 1Bh
TMP4 equ 1Ch
CAS_1 equ 1Dh
CAS_2 equ 1Eh
CAS_OR equ 1Fh
#define CHOD1_R PORTA,0 ;
#define CHOD1_Z PORTA,1 ;
#define CHOD2_R PORTA,2 ;
#define CHOD2_Z PORTA,3 ;
#define TLAC PORTA,4 ; prepinani semafor / oranzova
#define LED1_R PORTB,0 ;
#define LED1_O PORTB,1 ;
#define LED1_Z PORTB,2 ;
#define LED2_R PORTB,3 ;
#define LED2_O PORTB,4 ;
#define LED2_Z PORTB,5 ;
#define TLAC1 PORTB,6 ;
#define TLAC2 PORTB,7 ;
org 0x2007 ; adresa konfigurace PIC16F84
dw _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
org 0 ; zacatek programu
goto INIT ; skok na poΦßteΦnφ inicalizaci
org 4 ; vektor p°eruÜenφ
movwf BAK_W ; ulozit W
movf STATUS,W
movwf BAK_S ; ulozit STATUS
bcf INTCON,T0IF ; vynulovat priznak preruseni
decfsz TIMER,F ; dekrementovat TIMER
goto $+4 ; pri docitani k nule
bsf SEKUNDA,0 ; nastavit priznak preruseni
movf PRERUS,W ; preteceni TIMERU kazdou 1,0s
movwf TIMER
movf BAK_S,W
movwf STATUS ; obnova STATUS
swapf BAK_W,F
swapf BAK_W,W ; obnova W
retfie
;*************************************************************
INIT movlw b'00000'
movwf PORTA ; p°ednastavenφ PORTu A
movlw b'00000000'
movwf PORTB ; p°ednastavenφ PORTu B
bsf STATUS,RP0 ; nastaveni BANKY 1
movlw b'11010110' ; PULL-UPy OFF, delic 1:128
movwf OPTION_REG
movlw b'10000' ; portA 4-0 1vstup, 4vystupu
movwf TRISA
movlw b'11000000' ; portB 7-0, 2vstupy, 6vystupu
movwf TRISB
bcf STATUS,RP0 ; nastaveni BANKY 0
;*************************************************************
; Zde muzete zadat hodnoty pro casovani semaforu
movlw .10 ; semafor 1 cervena ( 10s - 240s )
movwf CAS_1
movlw .10 ; semafor 2 cervena ( 10s - 240s )
movwf CAS_2
movlw .2 ; delka svitu oranzove ( 2s )
movwf CAS_OR
;*************************************************************
MAIN call DIS_INT ; zakazat preruseni
movlw b'00000' ; zhasni vsechna svetla
movwf PORTA
movlw b'00000000' ; zhasni vsechna svetla
movwf PORTB
call TL_PUST
movlw .25 ; preruseni 40ms * konstanta (.25) -> 1,0s
movwf PRERUS
call SET_TMR ; povolit preruseni
bsf LED2_Z ; semafor 2 - rozsviti zelenou
;*************************************************************
MAIN1 bcf CHOD1_Z ; chodci 1 - zhasne zelenou
bsf CHOD1_R ; chodci 1 - rozsviti cervenou
bcf LED1_Z ; semafor 1 - zhasne zelenou
bsf LED1_O ; semafor 1 - rozsviti oranzovou
movf CAS_OR,W ; delka oranzove
movwf TMP3
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
decfsz TMP3,F
goto $-6
;-------------------------------
bcf LED1_O ; semafor 1 - zhasne oranzovou
bsf LED1_R ; semafor 1 - rozsviti cervenou
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
;-------------------------------
bsf LED2_O ; semafor 2 - rozsviti oranzovou
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
;-------------------------------
bcf LED2_O ; semafor 2 - zhasne oranzovou
bcf LED2_R ; semafor 2 - zhasne cervenou
bsf LED2_Z ; semafor 2 - rozsviti zelenou
bcf CHOD2_R ; chodci 2 - zhasne cervenou
bsf CHOD2_Z ; chodci 2 - rozsviti zelenou
movf CAS_OR,W
subwf CAS_1,W ; W = cas_1 - cas_oranzova
movwf TMP3
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
decfsz TMP3,F
goto $-6
;-------------------------------
MAIN2 bcf CHOD2_Z ; chodci 2 - zhasne zelenou
bsf CHOD2_R ; chodci 2 - rozsviti cervenou
bcf LED2_Z ; semafor 2 - zhasne zelenou
bsf LED2_O ; semafor 2 - rozsviti oranzovou
movf CAS_OR,W ; delka oranzove
movwf TMP3
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
decfsz TMP3,F
goto $-6
;-------------------------------
bcf LED2_O ; semafor 2 - zhasne oranzovou
bsf LED2_R ; semafor 2 - rozsviti cervenou
bsf LED1_O ; semafor 1 - rozsviti oranzovou
movf CAS_OR,W ; delka oranzove
movwf TMP3
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
decfsz TMP3,F
goto $-6
;-------------------------------
bcf LED1_O ; semafor 1 - zhasne oranzovou
bcf LED1_R ; semafor 1 - zhasne cervena
bsf LED1_Z ; semafor 1 - rozsviti zelena
bcf CHOD1_R ; chodci 1 - zhasne cervenou
bsf CHOD1_Z ; chodci 1 - rozsviti zelenou
movf CAS_OR,W
subwf CAS_2,W ; W = cas_2 - cas_oranzova
movwf TMP3
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_TISK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
decfsz TMP3,F
goto $-6
;-------------------------------
goto MAIN1
;*************************************************************
BLIK call DIS_INT ; zakazat preruseni
movlw b'00000' ; zhasni vsechna svetla
movwf PORTA
movlw b'00000000' ; zhasni vsechna svetla
movwf PORTB
call TL_PUST
movlw .20 ; preruseni 40ms * konstanta (.20) -> 0,8s
movwf PRERUS
call SET_TMR ; povolit preruseni
;-------------------------------
BLIK1 bsf LED1_O ; semafor 1 - rozsviti oranzovou
bsf LED2_O ; semafor 2 - rozsviti oranzovou
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_BLIK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
;-------------------------------
bcf LED1_O ; semafor 1 - zhasne oranzovou
bcf LED2_O ; semafor 2 - zhasne oranzovou
btfss TLAC ; stisknuti tlacitka 1 -> 0
call TL_BLIK ; osetri stisknute tlacitko
btfss SEKUNDA,0
goto $-3 ; jeste neni sekunda
clrf SEKUNDA
goto BLIK1
;*************************************************************
TL_TISK movlw 0x20 ; tlacitko se testuje 32x po sobe
movwf TMP4 ; hlidan stav 1 -> 0
;-------------------------------
movf PORTA,W ; po precteni PORTu A
iorlw b'11101111' ; nas zajima jen 4bit
sublw b'11101111' ; odecist
btfss STATUS,Z
retlw 0x00 ; neshoda tlacitko kmita
decfsz TMP4,F ; shoda
goto $-6 ; dalsi porovnani
goto BLIK ; test stisknuti prosel OK
;*************************************************************
TL_BLIK movlw 0x20 ; tlacitko se testuje 32x po sobe
movwf TMP4 ; hlidan stav 1 -> 0
;-------------------------------
movf PORTA,W ; po precteni PORTu A
iorlw b'11101111' ; nas zajima jen 4bit
sublw b'11101111' ; odecist
btfss STATUS,Z
retlw 0x00 ; neshoda tlacitko kmita
decfsz TMP4,F ; shoda
goto $-6 ; dalsi porovnani
goto MAIN ; test stisknuti prosel OK
;*************************************************************
TL_PUST movlw 0x20 ; tlacitko se testuje 32x po sobe
movwf TMP4 ; hlidan stav 0 -> 1
;-------------------------------
movf PORTA,W ; po precteni PORTu A
iorlw b'11101111' ; nas zajima jen 4bit
sublw b'11111111' ; odecist
btfss STATUS,Z
goto $-4 ; neshoda tlacitko kmita
decfsz TMP4,F ; shoda
goto $-6 ; dalsi porovnani
return ; tlacitko pusteno a nekmita
;*************************************************************
SET_TMR clrf TMR0 ; nulovat TMR0 (i jeho p°edd∞liΦ)
clrf SEKUNDA ; vynulovat vÜechny p°φznaky
movf PRERUS,W ; preteceni TIMERU kazdou 1,0s
movwf TIMER ; p°ednastavit TIMER
movlw b'10100000' ; povolit p°eruÜenφ od p°eteΦenφ TMR0
movwf INTCON
return
;*************************************************************
DIS_INT bcf INTCON,GIE ; zakßzat vÜechna p°eruÜenφ
btfsc INTCON,GIE ; jeÜt∞ se o tom p°esv∞dΦit
goto DIS_INT
clrf INTCON
return
;*************************************************************
CEK1s movlw .10 ; TMP2 = 10 cekej 1 sekundu
movwf TMP2
goto LOOP1
;-------------------------------
CEK500m movlw .5 ; TMP2 = 5 cekej 500 milisekund
movwf TMP2
goto LOOP1
;-------------------------------
CEK100m movlw .1 ; TMP2 = 1 cekej 100 milisekund
movwf TMP2
goto LOOP1
;-------------------------------
LOOP1 movlw .123 ; vloz do TMP1
movwf TMP1
LOOP2 movlw .221 ; vloz do TMP0
movwf TMP0
LOOP3 decfsz TMP0,F
goto LOOP3
decfsz TMP1,F
goto LOOP2
decfsz TMP2,F
goto LOOP1
retlw 00h
;*************************************************************
end