home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 December / Chip_2000-12_cd1.bin / internet / pic / semafor / semafor1.asm < prev    next >
Assembly Source File  |  2000-09-24  |  12KB  |  361 lines

  1. ;*****************************************************************
  2. ;* semafor                               10.09.2000   26.09.2000 *
  3. ;* 2x3 LED diod + 2x2 LED diody + 3 tlacitka                     *
  4. ;*****************************************************************
  5. ;*             http://www.mujweb.cz/pocitace/doveda              *
  6. ;*****************************************************************
  7. ;*                                                               *
  8. ;*                         -----\/-----                          *
  9. ;*      chodec 2 cervena  -|RA2    RA1|-  chodec 1 zelena        *
  10. ;*      chodec 2 zelena   -|RA3    RA0|-  chodec 1 cervena       *
  11. ;*         tlac R / A     -|RA4ck osc1|-  \ Crystal 3,2768MHz    *
  12. ;*              Vdd       -|MCLR  osc2|-  /                      *
  13. ;*             ground     -|Vss    Vdd|-  +5V                    *
  14. ;*     semafor 1 cervena  -|RB0int RB7|- tlac chodec 2 ( neni )  *
  15. ;*     semafor 1 oranzova -|RB1    RB6|- tlac chodec 1 ( neni )  *
  16. ;*     semafor 1 zelena   -|RB2    RB5|- semafor 2 zelena        *
  17. ;*     semafor 2 cervena  -|RB3    RB4|- semafor 2 oranzova      *
  18. ;*                         ------------                          *
  19. ;*                                       DOVEDA BOYS c 1997-2000 *
  20. ;*****************************************************************
  21. ;         --------------------------                       ----
  22. ; 1C    -----                          -----------------------
  23. ;       --                        --                     --
  24. ; 1O     ---  ------------------------  ---------------------  ----
  25. ;    ---                            ---------------------
  26. ; 1Z       ----------------------------                     ------
  27. ;          |          T1           |           T2           |
  28.  
  29. ;    -------                      ---------------------------
  30. ; 2C           ----------------------                           -
  31. ;         --                    --                         --
  32. ; 2O    -----  --------------------  -------------------------  -
  33. ;           --------------------                             -
  34. ; 2Z    -------                    -----------------------------
  35. ;          |          T1           |           T2           |
  36.  
  37. ;       ----------------------------               -----------
  38. ; 1C    ---                            ---------------
  39. ;    ---                            ---------------
  40. ; 1Z       ----------------------------               -----------
  41. ;    -------               --------------------------------
  42. ; 2C           ---------------                                ---
  43. ;           ---------------                                ---
  44. ; 2Z    -------               --------------------------------
  45. ;          |          T1           |           T2           |
  46. ;    MAIN1            MAIN2            MAIN1
  47.  
  48. list p=16f84
  49. include "p16f84.inc"
  50.  
  51. TIMER        equ    0x0C    ; pro preruseni
  52. SEKUNDA        equ    0x0D    ; prerusena 1s
  53. PRERUS        equ    0x15
  54. BAK_W        equ    0x16
  55. BAK_S        equ    0x17
  56.  
  57. TMP0        equ    18h
  58. TMP1        equ    19h
  59. TMP2        equ    1Ah
  60. TMP3        equ    1Bh
  61. TMP4        equ    1Ch
  62. CAS_1        equ    1Dh
  63. CAS_2        equ    1Eh
  64. CAS_OR        equ    1Fh
  65.  
  66. #define    CHOD1_R    PORTA,0        ;
  67. #define    CHOD1_Z    PORTA,1        ;
  68. #define    CHOD2_R    PORTA,2        ;
  69. #define    CHOD2_Z    PORTA,3        ;
  70. #define    TLAC    PORTA,4        ; prepinani semafor / oranzova
  71.  
  72. #define    LED1_R    PORTB,0        ;
  73. #define    LED1_O    PORTB,1        ;
  74. #define    LED1_Z    PORTB,2        ;
  75.  
  76. #define    LED2_R    PORTB,3        ;
  77. #define    LED2_O    PORTB,4        ;
  78. #define    LED2_Z    PORTB,5        ;
  79.  
  80. #define    TLAC1    PORTB,6        ;
  81. #define    TLAC2    PORTB,7        ;
  82.  
  83.     org    0x2007        ; adresa konfigurace PIC16F84
  84.     dw _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
  85.  
  86.     org    0        ; zacatek programu
  87.     goto    INIT        ; skok na poΦßteΦnφ inicalizaci
  88.  
  89.     org    4        ; vektor p°eruÜenφ
  90.     movwf    BAK_W        ; ulozit W
  91.     movf    STATUS,W
  92.     movwf    BAK_S        ; ulozit STATUS
  93.  
  94.     bcf    INTCON,T0IF    ; vynulovat priznak preruseni
  95.     decfsz    TIMER,F        ; dekrementovat TIMER
  96.     goto    $+4        ; pri docitani k nule
  97.     bsf    SEKUNDA,0    ; nastavit priznak preruseni
  98.     movf    PRERUS,W    ; preteceni TIMERU kazdou 1,0s
  99.     movwf    TIMER
  100.  
  101.     movf    BAK_S,W
  102.     movwf    STATUS        ; obnova STATUS
  103.     swapf    BAK_W,F
  104.     swapf    BAK_W,W        ; obnova W
  105.     retfie
  106. ;*************************************************************
  107. INIT    movlw    b'00000'
  108.     movwf    PORTA        ; p°ednastavenφ PORTu A
  109.     movlw    b'00000000'
  110.     movwf    PORTB        ; p°ednastavenφ PORTu B
  111.  
  112.     bsf    STATUS,RP0    ; nastaveni BANKY 1
  113.     movlw    b'11010110'    ; PULL-UPy OFF, delic 1:128
  114.     movwf    OPTION_REG
  115.     movlw    b'10000'    ; portA 4-0 1vstup, 4vystupu
  116.     movwf    TRISA
  117.     movlw    b'11000000'    ; portB 7-0, 2vstupy, 6vystupu
  118.     movwf    TRISB
  119.     bcf    STATUS,RP0    ; nastaveni BANKY 0
  120. ;*************************************************************
  121. ;    Zde muzete zadat hodnoty pro casovani semaforu
  122.  
  123.     movlw    .10        ; semafor 1 cervena ( 10s - 240s )
  124.     movwf    CAS_1
  125.  
  126.     movlw    .10        ; semafor 2 cervena ( 10s - 240s )
  127.     movwf    CAS_2
  128.  
  129.     movlw    .2        ; delka svitu oranzove ( 2s )
  130.     movwf    CAS_OR
  131. ;*************************************************************
  132. MAIN    call    DIS_INT        ; zakazat preruseni
  133.  
  134.     movlw    b'00000'    ; zhasni vsechna svetla
  135.     movwf    PORTA
  136.     movlw    b'00000000'    ; zhasni vsechna svetla
  137.     movwf    PORTB
  138.  
  139.     call    TL_PUST
  140.  
  141.     movlw    .25        ; preruseni 40ms * konstanta (.25) -> 1,0s
  142.     movwf    PRERUS
  143.     call    SET_TMR        ; povolit preruseni
  144.  
  145.     bsf    LED2_Z        ; semafor 2 - rozsviti zelenou
  146. ;*************************************************************
  147. MAIN1    bcf    CHOD1_Z        ; chodci 1 - zhasne zelenou
  148.     bsf    CHOD1_R        ; chodci 1 - rozsviti cervenou
  149.  
  150.     bcf    LED1_Z        ; semafor 1 - zhasne zelenou
  151.     bsf    LED1_O        ; semafor 1 - rozsviti oranzovou
  152.  
  153.     movf    CAS_OR,W    ; delka oranzove
  154.     movwf    TMP3
  155.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  156.     call    TL_TISK        ; osetri stisknute tlacitko
  157.     btfss    SEKUNDA,0
  158.     goto    $-3        ; jeste neni sekunda
  159.     clrf    SEKUNDA
  160.     decfsz    TMP3,F
  161.     goto    $-6
  162. ;-------------------------------
  163.     bcf    LED1_O        ; semafor 1 - zhasne oranzovou
  164.     bsf    LED1_R        ; semafor 1 - rozsviti cervenou
  165.  
  166.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  167.     call    TL_TISK        ; osetri stisknute tlacitko
  168.     btfss    SEKUNDA,0
  169.     goto    $-3        ; jeste neni sekunda
  170.     clrf    SEKUNDA
  171. ;-------------------------------
  172.     bsf    LED2_O        ; semafor 2 - rozsviti oranzovou
  173.  
  174.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  175.     call    TL_TISK        ; osetri stisknute tlacitko
  176.     btfss    SEKUNDA,0
  177.     goto    $-3        ; jeste neni sekunda
  178.     clrf    SEKUNDA
  179. ;-------------------------------
  180.     bcf    LED2_O        ; semafor 2 - zhasne oranzovou
  181.     bcf    LED2_R        ; semafor 2 - zhasne cervenou
  182.     bsf    LED2_Z        ; semafor 2 - rozsviti zelenou
  183.  
  184.     bcf    CHOD2_R        ; chodci 2 - zhasne cervenou
  185.     bsf    CHOD2_Z        ; chodci 2 - rozsviti zelenou
  186.  
  187.     movf    CAS_OR,W
  188.     subwf    CAS_1,W        ; W = cas_1 - cas_oranzova
  189.     movwf    TMP3
  190.  
  191.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  192.     call    TL_TISK        ; osetri stisknute tlacitko
  193.     btfss    SEKUNDA,0
  194.     goto    $-3        ; jeste neni sekunda
  195.     clrf    SEKUNDA
  196.     decfsz    TMP3,F
  197.     goto    $-6
  198. ;-------------------------------
  199. MAIN2    bcf    CHOD2_Z        ; chodci 2 - zhasne zelenou
  200.     bsf    CHOD2_R        ; chodci 2 - rozsviti cervenou
  201.  
  202.     bcf    LED2_Z        ; semafor 2 - zhasne zelenou
  203.     bsf    LED2_O        ; semafor 2 - rozsviti oranzovou
  204.  
  205.     movf    CAS_OR,W    ; delka oranzove
  206.     movwf    TMP3
  207.  
  208.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  209.     call    TL_TISK        ; osetri stisknute tlacitko
  210.     btfss    SEKUNDA,0
  211.     goto    $-3        ; jeste neni sekunda
  212.     clrf    SEKUNDA
  213.     decfsz    TMP3,F
  214.     goto    $-6
  215. ;-------------------------------
  216.     bcf    LED2_O        ; semafor 2 - zhasne oranzovou
  217.     bsf    LED2_R        ; semafor 2 - rozsviti cervenou
  218.  
  219.     bsf    LED1_O        ; semafor 1 - rozsviti oranzovou
  220.  
  221.     movf    CAS_OR,W    ; delka oranzove
  222.     movwf    TMP3
  223.  
  224.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  225.     call    TL_TISK        ; osetri stisknute tlacitko
  226.     btfss    SEKUNDA,0
  227.     goto    $-3        ; jeste neni sekunda
  228.     clrf    SEKUNDA
  229.     decfsz    TMP3,F
  230.     goto    $-6
  231. ;-------------------------------
  232.     bcf    LED1_O        ; semafor 1 - zhasne oranzovou
  233.     bcf    LED1_R        ; semafor 1 - zhasne cervena
  234.     bsf    LED1_Z        ; semafor 1 - rozsviti zelena
  235.  
  236.     bcf    CHOD1_R        ; chodci 1 - zhasne cervenou
  237.     bsf    CHOD1_Z        ; chodci 1 - rozsviti zelenou
  238.  
  239.     movf    CAS_OR,W
  240.     subwf    CAS_2,W        ; W = cas_2 - cas_oranzova
  241.     movwf    TMP3
  242.  
  243.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  244.     call    TL_TISK        ; osetri stisknute tlacitko
  245.     btfss    SEKUNDA,0
  246.     goto    $-3        ; jeste neni sekunda
  247.     clrf    SEKUNDA
  248.     decfsz    TMP3,F
  249.     goto    $-6
  250. ;-------------------------------
  251.     goto    MAIN1
  252. ;*************************************************************
  253. BLIK    call    DIS_INT        ; zakazat preruseni
  254.  
  255.     movlw    b'00000'    ; zhasni vsechna svetla
  256.     movwf    PORTA
  257.     movlw    b'00000000'    ; zhasni vsechna svetla
  258.     movwf    PORTB
  259.  
  260.     call    TL_PUST
  261.  
  262.     movlw    .20        ; preruseni 40ms * konstanta (.20) -> 0,8s
  263.     movwf    PRERUS
  264.     call    SET_TMR        ; povolit preruseni
  265. ;-------------------------------
  266. BLIK1    bsf    LED1_O        ; semafor 1 - rozsviti oranzovou
  267.     bsf    LED2_O        ; semafor 2 - rozsviti oranzovou
  268.  
  269.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  270.     call    TL_BLIK        ; osetri stisknute tlacitko
  271.     btfss    SEKUNDA,0
  272.     goto    $-3        ; jeste neni sekunda
  273.     clrf    SEKUNDA
  274. ;-------------------------------
  275.     bcf    LED1_O        ; semafor 1 - zhasne oranzovou
  276.     bcf    LED2_O        ; semafor 2 - zhasne oranzovou
  277.  
  278.     btfss    TLAC        ; stisknuti tlacitka 1 -> 0
  279.     call    TL_BLIK        ; osetri stisknute tlacitko
  280.     btfss    SEKUNDA,0
  281.     goto    $-3        ; jeste neni sekunda
  282.     clrf    SEKUNDA
  283.  
  284.     goto    BLIK1
  285. ;*************************************************************
  286. TL_TISK    movlw    0x20        ; tlacitko se testuje 32x po sobe
  287.     movwf    TMP4        ; hlidan stav 1 -> 0
  288. ;-------------------------------
  289.     movf    PORTA,W        ; po precteni PORTu A
  290.     iorlw    b'11101111'    ; nas zajima jen 4bit
  291.     sublw    b'11101111'    ; odecist
  292.     btfss    STATUS,Z
  293.     retlw    0x00        ; neshoda tlacitko kmita
  294.     decfsz    TMP4,F        ; shoda
  295.     goto    $-6        ; dalsi porovnani
  296.     goto    BLIK        ; test stisknuti prosel OK
  297. ;*************************************************************
  298. TL_BLIK    movlw    0x20        ; tlacitko se testuje 32x po sobe
  299.     movwf    TMP4        ; hlidan stav 1 -> 0
  300. ;-------------------------------
  301.     movf    PORTA,W        ; po precteni PORTu A
  302.     iorlw    b'11101111'    ; nas zajima jen 4bit
  303.     sublw    b'11101111'    ; odecist
  304.     btfss    STATUS,Z
  305.     retlw    0x00        ; neshoda tlacitko kmita
  306.     decfsz    TMP4,F        ; shoda
  307.     goto    $-6        ; dalsi porovnani
  308.     goto    MAIN        ; test stisknuti prosel OK
  309. ;*************************************************************
  310. TL_PUST    movlw    0x20        ; tlacitko se testuje 32x po sobe
  311.     movwf    TMP4        ; hlidan stav 0 -> 1
  312. ;-------------------------------
  313.     movf    PORTA,W        ; po precteni PORTu A
  314.     iorlw    b'11101111'    ; nas zajima jen 4bit
  315.     sublw    b'11111111'    ; odecist
  316.     btfss    STATUS,Z
  317.     goto    $-4        ; neshoda tlacitko kmita
  318.     decfsz    TMP4,F        ; shoda
  319.     goto    $-6        ; dalsi porovnani
  320.     return            ; tlacitko pusteno a nekmita
  321. ;*************************************************************
  322. SET_TMR clrf    TMR0        ; nulovat TMR0 (i jeho p°edd∞liΦ)
  323.     clrf    SEKUNDA        ; vynulovat vÜechny p°φznaky
  324.     movf    PRERUS,W    ; preteceni TIMERU kazdou 1,0s
  325.     movwf    TIMER        ; p°ednastavit TIMER
  326.     movlw    b'10100000'    ; povolit p°eruÜenφ od p°eteΦenφ TMR0
  327.     movwf    INTCON
  328.     return
  329. ;*************************************************************
  330. DIS_INT    bcf    INTCON,GIE    ; zakßzat vÜechna p°eruÜenφ
  331.     btfsc    INTCON,GIE    ; jeÜt∞ se o tom p°esv∞dΦit
  332.     goto    DIS_INT
  333.     clrf    INTCON
  334.     return
  335. ;*************************************************************
  336. CEK1s    movlw    .10        ; TMP2 = 10  cekej 1 sekundu
  337.     movwf    TMP2
  338.     goto    LOOP1
  339. ;-------------------------------
  340. CEK500m    movlw    .5        ; TMP2 = 5   cekej 500 milisekund
  341.     movwf    TMP2
  342.     goto    LOOP1
  343. ;-------------------------------
  344. CEK100m    movlw    .1        ; TMP2 = 1   cekej 100 milisekund
  345.     movwf    TMP2
  346.     goto    LOOP1
  347. ;-------------------------------
  348. LOOP1    movlw    .123        ; vloz do TMP1
  349.     movwf    TMP1
  350. LOOP2    movlw    .221        ; vloz do TMP0
  351.     movwf    TMP0
  352. LOOP3    decfsz    TMP0,F
  353.     goto    LOOP3
  354.     decfsz    TMP1,F
  355.     goto    LOOP2
  356.     decfsz    TMP2,F
  357.     goto    LOOP1
  358.     retlw    00h
  359. ;*************************************************************
  360.     end
  361.