home *** CD-ROM | disk | FTP | other *** search
/ 8051 Assembly Language Programming / easm51.iso / AE-120.ASM next >
Encoding:
Assembly Source File  |  1996-09-25  |  14.2 KB  |  524 lines

  1.  
  2. ;       Modele de micro-contrôleur: 80C31
  3.     Model 31
  4. ;
  5. ;---------------------------------------------------------------------------
  6. ; Définition des constantes
  7. ;
  8. V24SPD          EQU     243
  9. t10msH          EQU     0D8h
  10. t10msL          EQU     0F0h
  11. EEPROM        EQU    10100000b
  12. ;       Adresse de commande des sorties:
  13. ;
  14. ; Triac1          EQU     000
  15. ; Triac2          EQU     001
  16. ; Triac3          EQU     002
  17. ; Triac4          EQU     003
  18. ; Triac5          EQU     004
  19. ; Triac6          EQU     005
  20. ; Triac7          EQU     006
  21. ; Triac8          EQU     007
  22. ; Triac9          EQU     008
  23. ; Triac10         EQU     009
  24. ; Triac11         EQU     010
  25. ; Triac12         EQU     011
  26. ; Triac13         EQU     012
  27.  
  28.  Grad1           EQU     013
  29.  Grad2           EQU     014
  30.  Grad3           EQU     015
  31.  
  32. ; Relais1         EQU     016
  33. ; Relais2         EQU     017
  34. ; Relais3         EQU     018
  35. ; Relais4         EQU     019
  36. ;
  37. ;       Les entrées se font sur le port P1
  38. ;       Les bits de 0 à 5 servent pour le codage des B.P.
  39. ;       Le P1.6 est l'entrée d'alarme (Entrée +12V quand alarme non active)
  40. ;
  41. ;---------------------------------------------------------------------------
  42. ;       Définition des diverses zones de stockage en RAM interne
  43. ;       Mémoire pour état des sorties (en RAM interne)
  44. ;
  45.         ORG     0020h           ; debut zone adressable par bit (0-7F)
  46.         DS      1               ; Réserve bytes de stockage
  47. Flag1           EQU     000h            ; Adresse 1er bit
  48. Flag2           EQU     001h            ; Adresse 2eme bit
  49. Flag3        EQU    002h        ; Adresse 3eme Bit
  50. TMP             DS      1               ; Variable TMP
  51. Last_Code       DS      1               ; Dernier code lu
  52. MemoOut         DS      20              ; Memoire etat sortie
  53.  
  54.         ORG     0040h
  55. DPL_232         DS      1
  56. DPH_232         DS      1
  57. EOT             EQU     003h            ; End Of Transmit  (! Bit = 20.3h !)
  58. ;
  59. ;---------------------------------------------------------------------------
  60. ; Programme
  61. ;
  62.     ORG     0000
  63.     LJMP    Debut
  64.  
  65.     ORG     000Bh
  66.     LJMP    IntrT0
  67.  
  68.     ORG     0023h
  69.     LJMP    IntrSerie
  70.     DM    "ADAM E. 1996"
  71.     LJMP    0100h
  72.     
  73.     ORG     0100h
  74.  
  75. Debut   CLR     Flag1
  76.     CLR     Flag2
  77.     MOV     Last_Code,#0
  78.     LCALL   InitIntr
  79.     LCALL   InitTimer0
  80.     LCALL   InitRS232               ; initialisation du port RS232
  81.     MOV     DPTR,#Welcome           ; } envoi du message de connection.
  82.     LCALL   SendTxt                 ; }
  83.     LCALL    InitSorties        ; Initialise les sorties
  84. ;    LCALL   ResetSorties            ; Place les sorties à 0 (1 pour relais)
  85.     AJMP    $
  86.  
  87.     
  88. ;        
  89. ;---------------------------------------------------------------------------
  90. ; Initialise des interruptions  
  91. ; All (80h) ; Série (10h) ; Timer 0 (02h)
  92. InitIntr        MOV     IP,#02H      
  93.         MOV     IE,#92H
  94.         RET
  95. ;
  96. ;---------------------------------------------------------------------------
  97. ; Initialise le port série à 4800 bauds, 8 bits, pas de parité et 1 stop bit
  98. ;
  99. InitRS232       MOV     PSW,#0          ; reset register banks
  100.         MOV     PCON,#080H      ; SMOD=1
  101.         MOV     TMOD,#22H       ; modes are timer
  102.         MOV     TH1,#V24SPD     ; preload value
  103.         MOV     TL1,#V24SPD
  104.         MOV     TMOD,#21H
  105.         SETB    TCON.6          ; start counter
  106.         MOV     SCON,#050H      ; mode 1 , Enable receiver=10H
  107.         SETB    EOT             ; Positionne Flag End Of Transmit
  108.         RET
  109.  
  110. ;----------------------------------------------------------------------------
  111. ; Initialisation du Timer 0 (Tempo de 10 ms)
  112. ;
  113. InitTimer0      MOV     TH0,#t10msH
  114.         MOV     TL0,#t10msL
  115.         SETB    TR0
  116.         RET
  117.     
  118. ;---------------------------------------------------------------------------
  119. ; Envoi la valeur de l'accu (00->99) par le port série
  120. ;
  121. Send_Val        PUSH    ACC             ; Empile l'accu
  122.         MOV     B,#10           ; } Divise par 10
  123.         DIV     AB              ; }
  124.         ADD     A,#'0'
  125.         MOV     SBUF,A
  126.         JNB     TI,$
  127.         CLR     TI
  128.         MOV     A,B
  129.         ADD     A,#'0'
  130.         MOV     SBUF,A
  131.         JNB     TI,$
  132.         CLR     TI
  133.         LCALL   Send_CRLF
  134.         POP     ACC
  135.         RET
  136. ;                
  137. ;---------------------------------------------------------------------------
  138. ; envoi d'un CR et d'un LF par le port série
  139. ;
  140. Send_CRLF       PUSH    DPL             ; Sauve le DPL tâche principale
  141.         PUSH    DPH             ; IDEM
  142.         JNB     EOT,$           ; Attend End of Transmit
  143.         CLR     EOT
  144.         MOV     DPTR,#Txt_CRLF  ; Pointe chaîne CRLF
  145.         MOV     DPL_232,DPL     ; } Sauve le DPTR pour le port série
  146.         MOV     DPH_232,DPH     ; }
  147.         SETB    TI              ; Lance l'écriture série
  148.         RET
  149. ;
  150. ;---------------------------------------------------------------------------
  151. ; Envoi d'un texte présent en ROM (DPTR pointe sur la chaîne)
  152. ;
  153. SendTxt         JNB     EOT,$           ; Attend End Of Transmit
  154.         CLR     EOT
  155.         MOV     DPL_232,DPL
  156.         MOV     DPH_232,DPH
  157.         SETB    TI              ; Lance l'écriture par RS232
  158.         RET
  159. ;
  160. ;---------------------------------------------------------------------------
  161. ; Coupe toutes les sorties
  162. ;
  163. ResetSorties    MOV     A,#0
  164.         MOV     R0,#16
  165.         MOV     DPTR,#0
  166. RstOut1         MOVX    @DPTR,A              
  167.         INC     DPTR
  168.         DJNZ    R0,RstOut1
  169.         MOV     A,#0FFh
  170.         MOV     R0,#4
  171. RstOut2         MOVX    @DPTR,A
  172.         INC     DPTR
  173.         DJNZ    R0,RstOut2
  174.         
  175.         MOV     R0,#16                  ; Init 16 sorties
  176.         MOV     R1,#MemoOut             ; R1 pointe sur MemoOut                      
  177. RstOut3         MOV     @R1,#0                  ; Ecrit des 0
  178.         INC     R1                      ; Passe sortie suivante
  179.         DJNZ    R0,RstOut3              ; Décremente R0
  180.         MOV     R0,#4                   ; Init 4 sorties
  181. RstOut4         MOV     @R1,#0FFh               ; Ecrit FFh (Pour les relais)
  182.         INC     R1                      ; Passe sortie suivante 
  183.         DJNZ    R0,RstOut4              ; Décrement R0
  184.         
  185.         RET
  186.  
  187. ;---------------------------------------------------------------------------
  188. ; Gestion de l'interruption série
  189. ;
  190. IntrSerie       JB      RI,IntrReceive  ; si RI = 1 on continue
  191.         LJMP    IntrSend        ; Sinon Gestion Envoi par Série
  192.  
  193. IntrReceive     EQU $                   ; Coupe l'interruption serie
  194.         CLR     RI              ; Efface le RI
  195.         PUSH    ACC             ; Sauve l'accu
  196.         MOV     A,SBUF          ; Lecture du caractère recu
  197.         
  198.         CJNE    A,#'?',SerieCase1
  199.         MOV     DPTR,#TextHelp  ;} 
  200.         LCALL   SendTxt2         ;} Envoi du texte d'aide
  201.         AJMP    FinIntr         ; Fin d'interruption
  202.  
  203. SerieCase1      CJNE    A,#'a',SerieCase2
  204.         LCALL   LectChanel
  205.         LCALL   ON_Sortie
  206.         AJMP    FinIntr
  207.  
  208. SerieCase2      CJNE    A,#'e',SerieCase3
  209.         LCALL   LectChanel
  210.         LCALL   OFF_Sortie
  211.         AJMP    FinIntr
  212.  
  213. SerieCase3      CJNE    A,#'t',FinIntr
  214.         LCALL   LectChanel
  215.         LCALL   TOG_Sortie
  216.         AJMP    FinIntr
  217.  
  218. FinIntr         MOV     DPTR,#Prompt
  219.         LCALL   SendTxt2
  220.         POP     ACC
  221.         SETB    ET0                    ; Active les interruptions
  222.         RETI
  223. ;
  224. ;---------------------------------------------------------------------------                
  225. ; Routine d'envoi d'un texte présent en ROM (Appellé par Intr)
  226. ;
  227. IntrSend        PUSH    ACC             ; Empile l'Accu
  228.         PUSH    DPL             ; Empile le DPL
  229.         PUSH    DPH             ; Bien tu as deviné !
  230.         CLR     TI              ; Efface le bit TI
  231.         MOV     DPL,DPL_232     ; Restaure le pointeur pour RS232
  232.         MOV     DPH,DPH_232     ; IDEM
  233.         MOV     A,#0            
  234.         MOVC    A,@A+DPTR       ; Lecture du caractère à afficher
  235.         JZ      FinSndTxt       ; Si 0 Termine
  236.         MOV     SBUF,A
  237.         INC     DPTR
  238.         MOV     DPL_232,DPL     ; Sauve le pointeur pour RS232
  239.         MOV     DPH_232,DPH     ; IDEM
  240.         AJMP    NextSnd
  241. FinSndTxt       SETB    EOT             ; SET End Of Transmit
  242.     
  243. NextSnd         POP     DPH             ; Restaure le DPH tâche principale
  244.         POP     DPL             ; IDEM
  245.         POP     ACC             ; Restaure l'acccu tâche principale
  246.         RETI                    ; Termine gestion intr Send RS232
  247.  
  248. ;---------------------------------------------------------------------------                
  249. ; Routine d'envoi d'un texte présent en ROM 
  250. ;
  251. SendTxt2        MOV     A,#0            
  252.         MOVC    A,@A+DPTR       ; Lecture du caractère à afficher
  253.         JZ      FinSnd2         ; Si 0 Termine
  254.         MOV     SBUF,A
  255.         JNB     TI,$
  256.         CLR     TI              ; Efface le bit TI
  257.         INC     DPTR
  258.         AJMP    SendTxt2
  259. FinSnd2         SETB    EOT             ; SET End Of Transmit
  260.         RET                     ; Termine Routine Send RS232 sans
  261.                     ; les interruptions
  262. ;
  263. ;
  264. ;---------------------------------------------------------------------------
  265. ; Gestion de l'interruption Timer 0
  266. ;
  267. IntrT0          CLR     TR0             ; Stop Timer 0
  268.         CPL     Flag1           ; Complemente le Flag 10 ms ecoule
  269.         MOV     TL0,#t10msL
  270.         MOV     TH0,#t10msH
  271.         SETB    TR0
  272.         CPL    P3.5        ; sortie de Flag1 sur T1 (Pin 15)
  273.         PUSH    ACC
  274.         PUSH    DPL
  275.         PUSH    DPH        
  276.         MOV    A,P1
  277.         CJNE    A,#255,Intr_1
  278.         CLR    Flag2
  279.         MOV    Last_Code,#255
  280.         LCALL    Stop_Grad
  281.         AJMP    Fin_IntrT0
  282.         
  283. Intr_1        JB    Flag2,Intr_2    
  284.         SETB    Flag2
  285.         AJMP    Fin_IntrT0
  286.                 
  287. Intr_2        JNB    P1.6,Intr_Alarm
  288.         LCALL    Gestion_BP
  289.         AJMP    Fin_IntrT0
  290.                 
  291. Intr_Alarm    LCALL    Alarm
  292.  
  293. Fin_IntrT0    POP    DPH
  294.         POP    DPL
  295.         POP    ACC
  296.         RETI
  297. ;
  298. ;---------------------------------------------------------------------------
  299. ; Gestion des boutons poussoirs
  300. ;
  301. Gestion_BP    MOV    A,P1
  302.         ANL    A,#03Fh
  303.         MOV    TMP,A
  304.         CJNE    A,Last_Code,Gestion_1
  305.         
  306.         AJMP    Fin_Gestion
  307.  
  308. Gestion_1    MOV    A,#0
  309.         MOV    DPTR,#Tab_Code
  310.  
  311. Gestion_2    PUSH    ACC
  312.         MOVC    A,@A+DPTR
  313.         CJNE    A,TMP,Gestion_4
  314.         
  315.         POP    ACC
  316.         INC    A
  317.         LCALL    TOG_Sortie
  318.         MOV    Last_Code,TMP
  319.         AJMP    Fin_Gestion
  320.         
  321. Gestion_4    POP    ACC
  322.         CJNE    A,#19,Gestion_5
  323.         AJMP    Fin_Gestion
  324.  
  325. Gestion_5    INC    A
  326.         AJMP    Gestion_2
  327.  
  328. Fin_Gestion    RET
  329.  
  330. ;
  331. ;--------------------------------------------------------------------------
  332. ; Alarm
  333. ;
  334. Alarm        RET
  335.  
  336. ;
  337. ; --------------------------------------------------------------------------
  338. ; Routine de tempo d'anti-rebond (basé sur timer 0 et Flag 1)
  339. ;
  340. Wait            JNB     Flag1,$         ; Attend au minimum 10 mS
  341.         JB      Flag1,$         ; Et au Maximum 30 mS
  342.         JNB     Flag1,$
  343.         RET
  344. ;
  345. ;---------------------------------------------------------------------------
  346. ; Routine de lecture du n° de canal (en sortie A = n° canal)
  347. ;
  348. LectChanel      EQU     $
  349.         MOV     DPTR,#TextChanel
  350.         LCALL   SendTxt2
  351.         MOV     R3,#0
  352. LECTCH0         JNB     RI,$
  353.         CLR     RI
  354.         MOV     A,SBUF
  355.         CJNE    A,#13,LECTCh1
  356.         MOV     A,R3
  357.         RET
  358.  
  359. LECTCh1         MOV     SBUF,A
  360.         JNB     TI,$
  361.         CLR     TI
  362.         SUBB    A,#'0'
  363.         JC      LECTCH0
  364.         MOV     R4,A
  365.         SUBB    A,#10
  366.         JNC     LECTCH0
  367.         MOV     A,R3
  368.         MOV     B,#10
  369.         MUL     AB
  370.         ADD     A,R4
  371.         MOV     R3,A
  372.         AJMP    LECTCH0
  373.  
  374. ;---------------------------------------------------------------------------
  375. ; Routine Toggel Sortie Change l'état de la sortie n° A
  376. ;
  377. TOG_Sortie      EQU     $
  378.         DEC     A                       ; Convertion N° sortie -> Adr
  379.         CJNE    A,#Grad1,Tog_1
  380.         MOV    DPTR,#Grad1
  381.         MOV    A,#1
  382.         MOVX    @DPTR,A
  383.         LJMP    Fin_Tog        
  384.  
  385. Tog_1        CJNE    A,#Grad2,Tog_2
  386.         MOV    DPTR,#Grad2
  387.         MOV    A,#1
  388.         MOVX    @DPTR,A
  389.         LJMP    Fin_Tog        
  390.  
  391. Tog_2        CJNE    A,#Grad3,Tog_3
  392.         MOV    DPTR,#Grad3
  393.         MOV    A,#1
  394.         MOVX    @DPTR,A
  395.         LJMP    Fin_Tog        
  396.  
  397. Tog_3        MOV     R1,A                    ; Sauve N° sortie dans R1
  398.         LCALL    Stop_Grad
  399.         LCALL    StartI2C        ; Start I2C
  400.         MOV    A,#EEPROM
  401.         LCALL    SendByteI2C        ; Adresse EEPROM
  402.         MOV    A,R1
  403.         LCALL    SendByteI2C        ; Envoi Adresse (N° Sortie)
  404.         MOV    A,R1
  405.         ADD     A,#MemoOut              ; Calcul Ptr sur Memo sortie
  406.         MOV     R0,A                    ; Place Ptr dans R0
  407.         MOV     A,@R0                   ; Lit l'état actuel
  408.         CPL     A                       ; Complemente l'état
  409.         MOV     @R0,A                   ; Sauvegarde nouvel état
  410.         MOV     DPH,#00                 ; 
  411.         MOV     DPL,R1                  ; Prépare Ptr pour écriture 
  412.         MOVX    @DPTR,A                 ; Ecrit nouvelle état
  413.         LCALL    SendByteI2C        ; Ecrit état sortie / I2C
  414.         LCALL    StopI2C            ; Stop I2C
  415. Fin_Tog        RET
  416.  
  417.  
  418. Stop_Grad    PUSH    ACC
  419.         PUSH    DPL
  420.         PUSH    DPH
  421.         MOV    A,#0
  422.         MOV    DPTR,#Grad1
  423.         MOVX    @DPTR,A
  424.         INC    DPTR
  425.         MOVX    @DPTR,A
  426.         INC    DPTR
  427.         MOVX    @DPTR,A
  428.         POP    DPH
  429.         POP    DPL
  430.         POP    ACC
  431.         RET
  432.         
  433.         
  434.  
  435. ON_Sortie    RET
  436. OFF_Sortie      RET
  437.  
  438. InitSorties    LCALL    StartI2C        ; Start bus I2C
  439.         MOV    A,#EEPROM        ; Adresse de l'EEPROM
  440.         LCALL    SendByteI2C        ; Envoi
  441.         MOV    A,#00
  442.         MOV    R5,#20            ; Lit les 20 sorties        
  443.         MOV    DPTR,#0
  444.         MOV    R0,#MemoOut
  445.         LCALL    SendByteI2C        ; Envoi adresse 1ere sortie
  446.         LCALL    StartI2C        ; Start I2C
  447.         MOV    A,#EEPROM+1
  448.         LCALL    SendByteI2C        ; Envoi adresse EEPROM (RD)
  449.  
  450.         
  451. Init_Bcl    LCALL    RecByteI2C        ; Lecture de la sorrtie 
  452.         LCALL    AckI2C            ; Acquitte la lecture
  453.         MOV    @R0,A            ; Sauve l'état de la sortie
  454.         MOVX    @DPTR,A            ; Ecriture sur la sortie
  455.         INC    R0
  456.         INC    DPTR
  457.         DJNZ    R5,Init_Bcl
  458.         
  459.         LCALL    RecByteI2C
  460.         LCALL    StopI2C
  461.         RET
  462.         
  463.         
  464. #include "L:I2C.LIB"
  465.  
  466. ;---------------------------------------------------------------------------
  467. ; Messages   Messages   Messages   Messages   Messages   Messages  Messages
  468. ;---------------------------------------------------------------------------
  469. ;
  470. Welcome         DM      "Connection a 4800 bauds, 8 bits, pas de parite, 1 stop"
  471.         DB      10,13,10,13
  472.         DM      "Centrale d'eclairage AE-120.  Copywrite ADAM E. 1996"
  473.         DB      10,13,10,13
  474.         DM      "En attende de commande. (? = aide)"
  475.         DB      10,13
  476.         DM      "AE-120>"
  477.         DB      0
  478.  
  479. TextHelp        DM      "Aide des commande de la centrale d'eclairage"
  480.         DB      10,13,10,13
  481.         DM      "a   =   Allume une sortie"
  482.         DB      10,13
  483.         DM      "e   =   Etteint une sortie"   
  484.         DB      10,13
  485.         DM      "t   =   Change l'etat d'une sortie"
  486.         DB      10,13,0
  487.  
  488. Prompt          DB      10,13
  489.         DM      "AE-120>"
  490.         DB      0
  491.  
  492. TextChanel      DB      10,13
  493.         DM      "Canal n.: (1-20)"
  494.         DB      0
  495.  
  496. Txt_CRLF        DB      10,13,0
  497.  
  498. Txt_Alarm    DM    " ! ALARM ! "
  499.         DB    10,13,0
  500.  
  501. Tab_Code        EQU     $
  502. BP1     DB      00000111b
  503. BP2     DB      00001011b
  504. BP3     DB      00001101b
  505. BP4     DB      00001110b
  506. BP5     DB      00010110b
  507. BP6     DB      00010011b
  508. BP7     DB      00010101b
  509. BP8     DB      00011001b
  510. BP9     DB      00011010b
  511. BP10    DB      00011100b
  512. BP11    DB      00100011b
  513. BP12    DB      00100101b
  514. BP13    DB      00100110b
  515. BP14    DB      00101001b
  516. BP15    DB      00101010b
  517. BP16    DB      00101100b
  518. BP17    DB      00110001b
  519. BP18    DB      00110010b
  520. BP19    DB      00110100b
  521. BP20    DB      00111000b
  522.  
  523.     END
  524.