home *** CD-ROM | disk | FTP | other *** search
-
- ; Modele de micro-contrôleur: 80C31
- Model 31
- ;
- ;---------------------------------------------------------------------------
- ; Définition des constantes
- ;
- V24SPD EQU 243
- t10msH EQU 0D8h
- t10msL EQU 0F0h
- EEPROM EQU 10100000b
- TypeSW_EEPROM EQU 20h
- AlarmSW_EEPROM EQU 40h
-
- ; Adresse de commande des sorties:
- ;
- ; Triac1 EQU 000
- ; Triac2 EQU 001
- ; Triac3 EQU 002
- ; Triac4 EQU 003
- ; Triac5 EQU 004
- ; Triac6 EQU 005
- ; Triac7 EQU 006
- ; Triac8 EQU 007
- ; Triac9 EQU 008
- ; Triac10 EQU 009
- ; Triac11 EQU 010
- ; Triac12 EQU 011
- ; Triac13 EQU 012
-
- Grad1 EQU 013
- Grad2 EQU 014
- Grad3 EQU 015
-
- ; Relais1 EQU 016
- ; Relais2 EQU 017
- ; Relais3 EQU 018
- ; Relais4 EQU 019
- ;
- ; Les entrées se font sur le port P1
- ; Les bits de 0 à 5 servent pour le codage des B.P.
- ; Le P1.6 est l'entrée d'alarme (Entrée +12V quand alarme non active)
- ;
- ;---------------------------------------------------------------------------
- ; Définition des diverses zones de stockage en RAM interne
- ; Mémoire pour état des sorties (en RAM interne)
- ;
- ORG 0020h ; debut zone adressable par bit (0-7F)
- DS 1 ; Réserve bytes de stockage
- Flag1 EQU 000h ; Adresse 1er bit
- Flag2 EQU 001h ; Adresse 2eme bit
- Flag3 EQU 002h ; Adresse 3eme Bit
- TMP DS 1 ; Variable TMP
- Last_Code DS 1 ; Dernier code lu
- DPL_232 DS 1
- DPH_232 DS 1
- EOT EQU 003h ; End Of Transmit (! Bit = 20.3h !)
-
- MemoOut DS 20 ; Memoire etat sortie
- TypeSW DS 20 ; Type de SWITCH (Interrupteur / BP)
- ; ( 00 / FF )
-
- ;
- ;---------------------------------------------------------------------------
- ; Programme
- ;
- ORG 0000
- LJMP Debut
-
- ORG 000Bh
- LJMP IntrT0
-
- ORG 0023h
- LJMP IntrSerie
- DM "ADAM E. 1996"
- LJMP 0100h
-
- ORG 0100h
-
- Debut CLR Flag1
- CLR Flag2
- MOV Last_Code,#0
- LCALL InitIntr
- LCALL InitTimer0
- LCALL InitRS232 ; initialisation du port RS232
- MOV DPTR,#Welcome ; } envoi du message de connection.
- LCALL SendTxt ; }
- LCALL InitTypeSW ; Initialise le type de sortie
- LCALL InitSorties ; Initialise les sorties
- ; LCALL ResetSorties ; Place les sorties à 0 (1 pour relais)
- AJMP $
-
-
- ;
- ;---------------------------------------------------------------------------
- ; Initialise des interruptions
- ; All (80h) ; Série (10h) ; Timer 0 (02h)
- InitIntr MOV IP,#02H
- MOV IE,#92H
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Initialise le port série à 4800 bauds, 8 bits, pas de parité et 1 stop bit
- ;
- InitRS232 MOV PSW,#0 ; reset register banks
- MOV PCON,#080H ; SMOD=1
- MOV TMOD,#22H ; modes are timer
- MOV TH1,#V24SPD ; preload value
- MOV TL1,#V24SPD
- MOV TMOD,#21H
- SETB TCON.6 ; start counter
- MOV SCON,#050H ; mode 1 , Enable receiver=10H
- SETB EOT ; Positionne Flag End Of Transmit
- RET
-
- ;----------------------------------------------------------------------------
- ; Initialisation du Timer 0 (Tempo de 10 ms)
- ;
- InitTimer0 MOV TH0,#t10msH
- MOV TL0,#t10msL
- SETB TR0
- RET
-
- ;---------------------------------------------------------------------------
- ; Envoi la valeur de l'accu (00->99) par le port série
- ;
- Send_Val PUSH ACC ; Empile l'accu
- MOV B,#10 ; } Divise par 10
- DIV AB ; }
- ADD A,#'0'
- MOV SBUF,A
- JNB TI,$
- CLR TI
- MOV A,B
- ADD A,#'0'
- MOV SBUF,A
- JNB TI,$
- CLR TI
- LCALL Send_CRLF
- POP ACC
- RET
- ;
- ;---------------------------------------------------------------------------
- ; envoi d'un CR et d'un LF par le port série
- ;
- Send_CRLF PUSH DPL ; Sauve le DPL tâche principale
- PUSH DPH ; IDEM
- JNB EOT,$ ; Attend End of Transmit
- CLR EOT
- MOV DPTR,#Txt_CRLF ; Pointe chaîne CRLF
- MOV DPL_232,DPL ; } Sauve le DPTR pour le port série
- MOV DPH_232,DPH ; }
- SETB TI ; Lance l'écriture série
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Envoi d'un texte présent en ROM (DPTR pointe sur la chaîne)
- ;
- SendTxt JNB EOT,$ ; Attend End Of Transmit
- CLR EOT
- MOV DPL_232,DPL
- MOV DPH_232,DPH
- SETB TI ; Lance l'écriture par RS232
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Coupe toutes les sorties
- ;
- ResetSorties MOV A,#0
- MOV R0,#16
- MOV DPTR,#0
- RstOut1 MOVX @DPTR,A
- INC DPTR
- DJNZ R0,RstOut1
- MOV A,#0FFh
- MOV R0,#4
- RstOut2 MOVX @DPTR,A
- INC DPTR
- DJNZ R0,RstOut2
-
- MOV R0,#16 ; Init 16 sorties
- MOV R1,#MemoOut ; R1 pointe sur MemoOut
- RstOut3 MOV @R1,#0 ; Ecrit des 0
- INC R1 ; Passe sortie suivante
- DJNZ R0,RstOut3 ; Décremente R0
- MOV R0,#4 ; Init 4 sorties
- RstOut4 MOV @R1,#0FFh ; Ecrit FFh (Pour les relais)
- INC R1 ; Passe sortie suivante
- DJNZ R0,RstOut4 ; Décrement R0
-
- RET
-
- ;---------------------------------------------------------------------------
- ; Gestion de l'interruption série
- ;
- IntrSerie JB RI,IntrReceive ; si RI = 1 on continue
- LJMP IntrSend ; Sinon Gestion Envoi par Série
-
- IntrReceive EQU $ ; Coupe l'interruption serie
- CLR RI ; Efface le RI
- PUSH ACC ; Sauve l'accu
- MOV A,SBUF ; Lecture du caractère recu
-
- CJNE A,#'?',SerieCase1
- MOV DPTR,#TextHelp ;}
- LCALL SendTxt2 ;} Envoi du texte d'aide
- AJMP FinIntr ; Fin d'interruption
-
- SerieCase1 CJNE A,#'a',SerieCase2
- ; LCALL LectChanel
- ; LCALL ON_Sortie
- AJMP FinIntr
-
- SerieCase2 CJNE A,#'e',SerieCase3
- ; LCALL LectChanel
- ; LCALL OFF_Sortie
- AJMP FinIntr
-
- SerieCase3 CJNE A,#'t',SerieCase4
- LCALL LectChanel
- LCALL TOG_Sortie
- AJMP FinIntr
-
- SerieCase4 CJNE A,#'s',SerieCase5
- LCALL LectChanel
- LCALL ChangeTypeSW
- AJMP FinIntr
-
- SerieCase5 CJNE A,#'d',SerieCase6
- LCALL LectChanel
- LCALL DefSortieAlarm
- AJMP FinIntr
-
- SerieCase6 CJNE A,#'v',FinIntr
- ; LCALL AffTypeSW
-
- FinIntr MOV DPTR,#Prompt
- LCALL SendTxt2
- POP ACC
- SETB ET0 ; Active les interruptions
- RETI
- ;
- ;---------------------------------------------------------------------------
- ; Routine d'envoi d'un texte présent en ROM (Appellé par Intr)
- ;
- IntrSend PUSH ACC ; Empile l'Accu
- PUSH DPL ; Empile le DPL
- PUSH DPH ; Bien tu as deviné !
- CLR TI ; Efface le bit TI
- MOV DPL,DPL_232 ; Restaure le pointeur pour RS232
- MOV DPH,DPH_232 ; IDEM
- MOV A,#0
- MOVC A,@A+DPTR ; Lecture du caractère à afficher
- JZ FinSndTxt ; Si 0 Termine
- MOV SBUF,A
- INC DPTR
- MOV DPL_232,DPL ; Sauve le pointeur pour RS232
- MOV DPH_232,DPH ; IDEM
- AJMP NextSnd
- FinSndTxt SETB EOT ; SET End Of Transmit
-
- NextSnd POP DPH ; Restaure le DPH tâche principale
- POP DPL ; IDEM
- POP ACC ; Restaure l'acccu tâche principale
- RETI ; Termine gestion intr Send RS232
-
- ;---------------------------------------------------------------------------
- ; Routine d'envoi d'un texte présent en ROM
- ;
- SendTxt2 MOV A,#0
- MOVC A,@A+DPTR ; Lecture du caractère à afficher
- JZ FinSnd2 ; Si 0 Termine
- MOV SBUF,A
- JNB TI,$
- CLR TI ; Efface le bit TI
- INC DPTR
- AJMP SendTxt2
- FinSnd2 SETB EOT ; SET End Of Transmit
- RET ; Termine Routine Send RS232 sans
- ; les interruptions
- ;
- ;
- ;---------------------------------------------------------------------------
- ; Gestion de l'interruption Timer 0
- ;
- IntrT0 CLR TR0 ; Stop Timer 0
- CPL Flag1 ; Complemente le Flag 10 ms ecoule
- MOV TL0,#t10msL
- MOV TH0,#t10msH
- SETB TR0
- CPL P3.5 ; sortie de Flag1 sur T1 (Pin 15)
- PUSH ACC
- PUSH DPL
- PUSH DPH
- MOV A,P1
- CJNE A,#255,Intr_1
- CLR Flag2
- MOV Last_Code,#255
- LCALL Stop_Grad
- AJMP Fin_IntrT0
-
- Intr_1 JB Flag2,Intr_2
- SETB Flag2
- AJMP Fin_IntrT0
-
- Intr_2 JNB P1.6,Intr_Alarm
- LCALL Gestion_BP
- AJMP Fin_IntrT0
-
- Intr_Alarm LCALL Alarm
-
- Fin_IntrT0 POP DPH
- POP DPL
- POP ACC
- RETI
- ;
- ;---------------------------------------------------------------------------
- ; Gestion des boutons poussoirs
- ;
- Gestion_BP MOV A,P1
- ANL A,#03Fh
- MOV TMP,A
- CJNE A,Last_Code,Gestion_1
-
- AJMP Fin_Gestion
-
- Gestion_1 MOV A,#0
- MOV DPTR,#Tab_Code
-
- Gestion_2 PUSH ACC
- MOVC A,@A+DPTR
- CJNE A,TMP,Gestion_4
-
- POP ACC
- INC A
- LCALL TOG_Sortie
- MOV Last_Code,TMP
- AJMP Fin_Gestion
-
- Gestion_4 POP ACC
- CJNE A,#19,Gestion_5
- AJMP Fin_Gestion
-
- Gestion_5 INC A
- AJMP Gestion_2
-
- Fin_Gestion RET
-
- ;
- ;--------------------------------------------------------------------------
- ; Alarm
- ;
- Alarm EQU $
- LCALL StartI2C
- MOV A,#EEPROM
- LCALL SendByteI2C
- MOV A,#AlarmSW_EEPROM
- MOV R5,#20 ; Lit les 20 sorties
- MOV DPTR,#0
- LCALL SendByteI2C ; Envoi adresse 1ere sortie
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM+1
- LCALL SendByteI2C ; Envoi adresse EEPROM (RD)
-
- Alarm_Bcl LCALL RecByteI2C ; Lecture de la sorrtie
- LCALL AckI2C ; Acquitte la lecture
- MOVX @DPTR,A ; Ecriture sur la sortie
- INC DPTR
- DJNZ R5,Alarm_Bcl
-
- LCALL RecByteI2C
- LCALL StopI2C
-
- Alarm_Wait MOV A,P1
- JNB ACC.6,Alarm_Wait
- LCALL InitSorties
-
- RET
-
- ;
- ; --------------------------------------------------------------------------
- ; Routine de tempo d'anti-rebond (basé sur timer 0 et Flag 1)
- ;
- Wait JNB Flag1,$ ; Attend au minimum 10 mS
- JB Flag1,$ ; Et au Maximum 30 mS
- JNB Flag1,$
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Routine de lecture du n° de canal (en sortie A = n° canal)
- ;
- LectChanel EQU $
- MOV DPTR,#TextChanel
- LCALL SendTxt2
- MOV R3,#0
- LECTCH0 JNB RI,$
- CLR RI
- MOV A,SBUF
- CJNE A,#13,LECTCh1
- MOV A,R3
- RET
-
- LECTCh1 MOV SBUF,A
- JNB TI,$
- CLR TI
- SUBB A,#'0'
- JC LECTCH0
- MOV R4,A
- SUBB A,#10
- JNC LECTCH0
- MOV A,R3
- MOV B,#10
- MUL AB
- ADD A,R4
- MOV R3,A
- AJMP LECTCH0
-
- ;---------------------------------------------------------------------------
- ; Routine Toggel Sortie Change l'état de la sortie n° A
- ;
- TOG_Sortie EQU $
- DEC A ; Convertion N° sortie -> Adr
- MOV R1,A
-
- ADD A,#TypeSW
- MOV R0,A
- MOV A,@R0
-
- CJNE A,#0FFh,Tog_1
- MOV DPL,R1
- MOV DPH,#00
- MOV A,#0FFh
- MOVX @DPTR,A
- LJMP Fin_Tog
-
- Tog_1 LCALL Stop_Grad
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM
- LCALL SendByteI2C ; Adresse EEPROM
- MOV A,R1
- LCALL SendByteI2C ; Envoi Adresse (N° Sortie)
- MOV A,R1
- ADD A,#MemoOut ; Calcul Ptr sur Memo sortie
- MOV R0,A ; Place Ptr dans R0
- MOV A,@R0 ; Lit l'état actuel
- CPL A ; Complemente l'état
- MOV @R0,A ; Sauvegarde nouvel état
- MOV DPH,#00 ;
- MOV DPL,R1 ; Prépare Ptr pour écriture
- MOVX @DPTR,A ; Ecrit nouvelle état
- LCALL SendByteI2C ; Ecrit état sortie / I2C
- LCALL StopI2C ; Stop I2C
- Fin_Tog RET
-
-
- Stop_Grad PUSH ACC
- PUSH DPL
- PUSH DPH
- MOV R0,#TypeSW
- Stop_Grad1 MOV A,@R0
- CJNE A,#0FFh,Stop_Grad2
- MOV A,R0
- SUBB A,#TypeSW
- MOV DPL,A
- MOV DPH,#00
- MOV A,#00
- MOVX @DPTR,A
- Stop_Grad2 INC R0
- CJNE R0,#TypeSW+20,Stop_Grad1
- POP DPH
- POP DPL
- POP ACC
- RET
-
-
-
- ON_Sortie RET
-
- OFF_Sortie RET
-
- DefSortieAlarm DEC A
- MOV R1,A
- MOV DPTR,#Txt_DefAlarm
- LCALL SendTxt2
-
- DefAlarm1 JNB RI,$ ; Attent touche
- CLR RI
- MOV A,SBUF ; Lecture touche
- CJNE A,#'a',DefAlarm2
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM
- LCALL SendByteI2C ; Adresse EEPROM
- MOV A,R1
- ADD A,#AlarmSW_EEPROM ; Adresse en EEPROM de TypeSW
- LCALL SendByteI2C ; Envoi Adresse (N° Sortie)
- MOV A,#0FFh
- LCALL SendByteI2C ; Ecriture du type (00 = Int)
- LCALL StopI2C
- AJMP Fin_DefAlarm
-
- DefAlarm2 CJNE A,#'n',DefAlarm1
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM
- LCALL SendByteI2C ; Adresse EEPROM
- MOV A,R1
- ADD A,#AlarmSW_EEPROM ; Adresse en EEPROM de TypeSW
- LCALL SendByteI2C ; Envoi Adresse (N° Sortie)
- MOV A,#00
- LCALL SendByteI2C ; Ecriture du type (00 = Int)
- LCALL StopI2C
-
- Fin_DefAlarm RET
- ;
- ;---------------------------------------------------------------------------
- ; Change le type de sortie (Interrupteur 00 ou Poussoir FFh )
- ;
- ChangeTypeSW DEC A ; Convertion Canal -> adresse
- MOV R1,A
- MOV DPTR,#Txt_TypeSW
- LCALL SendTxt2
-
- ChType1 JNB RI,$ ; Attent touche
- CLR RI
- MOV A,SBUF ; Lecture touche
- CJNE A,#'i',ChType2
- MOV A,#TypeSW
- ADD A,R1
- MOV R0,A
- MOV A,#00
- MOV @R0,A
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM
- LCALL SendByteI2C ; Adresse EEPROM
- MOV A,R1
- ADD A,#TypeSW_EEPROM ; Adresse en EEPROM de TypeSW
- LCALL SendByteI2C ; Envoi Adresse (N° Sortie)
- MOV A,#00
- LCALL SendByteI2C ; Ecriture du type (00 = Int)
- LCALL StopI2C
- AJMP Fin_ChType
-
- ChType2 CJNE A,#'p',ChType1
- MOV A,#TypeSW
- ADD A,R1
- MOV R0,A
- MOV A,#0FFh
- MOV @R0,A
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM
- LCALL SendByteI2C ; Adresse EEPROM
- MOV A,R1
- ADD A,#TypeSW_EEPROM ; Adresse en EEPROM de TypeSW
- LCALL SendByteI2C ; Envoi Adresse (N° Sortie)
- MOV A,#0FFh
- LCALL SendByteI2C ; Ecriture du type (00 = Int)
- LCALL StopI2C
-
- Fin_ChType RET
- ;
- ;---------------------------------------------------------------------------
- ; Initialise les sorties en fonction de l'EEPROM (I2C)
- ;
- InitSorties LCALL StartI2C ; Start bus I2C
- MOV A,#EEPROM ; Adresse de l'EEPROM
- LCALL SendByteI2C ; Envoi
- MOV A,#00
- MOV R5,#20 ; Lit les 20 sorties
- MOV DPTR,#0
- MOV R0,#MemoOut
- LCALL SendByteI2C ; Envoi adresse 1ere sortie
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM+1
- LCALL SendByteI2C ; Envoi adresse EEPROM (RD)
-
- Init_Bcl LCALL RecByteI2C ; Lecture de la sorrtie
- LCALL AckI2C ; Acquitte la lecture
- MOV @R0,A ; Sauve l'état de la sortie
- MOVX @DPTR,A ; Ecriture sur la sortie
- INC R0
- INC DPTR
- DJNZ R5,Init_Bcl
-
- LCALL RecByteI2C
- LCALL StopI2C
- RET
- ;
- ;---------------------------------------------------------------------------
- ; initialise le type de sortie
- ;
- InitTypeSW LCALL StartI2C ; Start bus I2C
- MOV A,#EEPROM ; Adresse de l'EEPROM
- LCALL SendByteI2C ; Envoi
- MOV A,#TypeSW_EEPROM
- MOV R5,#20 ; Lit les 20 sorties
- MOV DPTR,#0
- MOV R0,#TypeSW
- LCALL SendByteI2C ; Envoi adresse 1ere sortie
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM+1
- LCALL SendByteI2C ; Envoi adresse EEPROM (RD)
-
- Init_Type LCALL RecByteI2C ; Lecture de la sorrtie
- LCALL AckI2C ; Acquitte la lecture
- MOV @R0,A ; Sauve l'état de la sortie
- MOVX @DPTR,A ; Ecriture sur la sortie
- INC R0
- INC DPTR
- DJNZ R5,Init_Type
-
- LCALL RecByteI2C
- LCALL StopI2C
- RET
-
- ;---------------------------------------------------------------------------
- ; Lecture des type de SW et envoi par série
-
- AffTypeSW MOV R1,#20
- MOV R0,#TypeSW
- CLR TI
- AffTyp1 MOV A,@R0
- CJNE A,#00,AffTyp2
- MOV SBUF,#'I'
- AJMP AffTyp3
- AffTyp2 MOV SBUF,#'P'
- AffTyp3 JNB TI,$
- CLR TI
- MOV SBUF,#10
- JNB TI,$
- CLR TI
- MOV SBUF,#13
- JNB TI,$
- CLR TI
- INC R0
- DJNZ R1,AffTyp1
- RET
-
-
-
- ;---------------------------------------------------------------------------
- #include "L:I2C.LIB"
- ;---------------------------------------------------------------------------
- ; Messages Messages Messages Messages Messages Messages Messages
- ;---------------------------------------------------------------------------
- ;
- Welcome DM "Connection a 4800 bauds, 8 bits, pas de parite, 1 stop"
- DB 10,13,10,13
- DM "Centrale d'eclairage AE-120. Copywrite ADAM E. 1996"
- DB 10,13,10,13
- DM "En attende de commande. (? = aide)"
- DB 10,13
- DM "AE-120>"
- DB 0
-
- TextHelp DM "Aide des commande de la centrale d'eclairage"
- DB 10,13,10,13
- ; DM "a = Allume une sortie"
- ; DB 10,13
- ; DM "e = Etteint une sortie"
- ; DB 10,13
- DM "s = Type de sortie (Interrupteur / Bouton poussoir)"
- DB 10,13
- DM "d = Programmation pour alarme"
- DB 10,13
- DM "t = Change l'etat d'une sortie"
- DB 10,13,0
-
- Prompt DB 10,13
- DM "AE-120>"
- DB 0
-
- TextChanel DB 10,13
- DM "Canal n.: (1-20)"
- DB 0
-
- Txt_CRLF DB 10,13,0
-
- Txt_Alarm DM " ! ALARM ! "
- DB 10,13,0
-
- Txt_TypeSW DB 10,13
- DM "i = Interrupteur p = bouton Poussoir"
- DB 10,13,0
-
- Txt_DefAlarm DB 10,13
- DM "a = ON si alarm n = OFF si alarm"
- DB 10,13,0
-
- Tab_Code EQU $
- BP1 DB 00000111b
- BP2 DB 00001011b
- BP3 DB 00001101b
- BP4 DB 00001110b
- BP5 DB 00010110b
- BP6 DB 00010011b
- BP7 DB 00010101b
- BP8 DB 00011001b
- BP9 DB 00011010b
- BP10 DB 00011100b
- BP11 DB 00100011b
- BP12 DB 00100101b
- BP13 DB 00100110b
- BP14 DB 00101001b
- BP15 DB 00101010b
- BP16 DB 00101100b
- BP17 DB 00110001b
- BP18 DB 00110010b
- BP19 DB 00110100b
- BP20 DB 00111000b
-
- END
-