; test04.asm ; ; Programme de test du 8031 N° 04 ; Utilisation des interruptions ; ; (C) CHAMOUARD 1993 ; (Libre de droits pour utilisation non ; commerciale et à vos propres risques) ; ; Matériel requis : ; carte 8031 base 1, programme chargé en 2000h ; afficheur LCD 2*16 aux adresses spécifiées ci-dessous ; Bibliothèques requises : ; aucune ; Sortie : ; affichage d'un des 4 messages et changement lorsque l'on ; met la broche 12 du 8031 (P32 ou /IT0) à la masse word CmdReadLCD, #E002h word CmdWriteLCD, #E000h word DataReadLCD, #E003h word DataWriteLCD, #E001h ORG 2000h ; Reset externe Restart: ljmp Begin ORG 2003h ; Interruption externe 0 ljmp Ext0int ORG 200Bh ; Interruption timer 0 reti ORG 2013h ; Interruption externe 1 reti ORG 201Bh ; Interruption timer 1 reti ORG 2023h ; Interruption interface serie reti Ext0int: inc B anl B,#03h ; Masque pour 4 messages lcall RazLCD mov A,B cjne A,#00h,Mes24 mov DPTR,#Mes1 ; Message 1 lcall MesLCD reti Mes24: cjne A,#01h,Mes34 mov DPTR,#Mes2 ; Message 2 lcall MesLCD reti Mes34: cjne A,#02h,Mes44 mov DPTR,#Mes3 ; Message 3 lcall MesLCD reti Mes44: mov DPTR,#Mes4 ; Message 4 lcall MesLCD reti Begin: mov SP,#07h ; Debut de pile en 08h lcall InitLCD mov DPTR,#Mes1 lcall MesLCD lcall CurseurOFF mov B,#00h ; Indicateur du message 1 setb PX0 ; Int 0 de + haute priorite setb IT0 ; Int 0 sur front descendant setb EX0 ; Int 0 enabelee setb EA ; Interruption enabelees Boucle: ljmp Boucle ; Boucle infinie Mes1: DB "Message numero 1",0 Mes2: DB "Message numero 2",0 Mes3: DB "Message numero 3",0 Mes4: DB "Message numero 4 (et dernier)",0 InitLCD: ; Initialisation de l'afficheur LCD mov A,#38h ; --------------------------------- lcall CmdLCD ; Init afficheur mov A,#01h lcall CmdLCD ; Effacement afficheur mov A,#0Fh lcall CmdLCD ; Curseur ON ret RazLCD: ; Effacement de l'afficheur LCD mov A,#01h ; ----------------------------- ljmp CmdLCD HomeLCD: ; Repositionnement de l'afficheur LCD mov A,#02h ; ----------------------------------- ljmp CmdLCD CurseurON: ; Visualisation du curseur de l'afficheur LCD mov A,#0Fh ; ------------------------------------------- ljmp CmdLCD CurseurOFF: ; Disparition du curseur de l'afficheur LCD mov A,#0Ch ; ----------------------------------------- ljmp CmdLCD CmdLCD: ; Ecriture d'une commande a l'afficheur LCD push DPH ; ----------------------------------------- push DPL push ACC CmdLCDloop: mov DPTR,#CmdReadLCD movx A,@DPTR ; Lecture status de l'afficheur anl A,#80h jnz CmdLCDloop ; Boucle si LCD busy pop ACC mov DPTR,#CmdWriteLCD movx @DPTR,A ; Ecriture de la commande a l'afficheur pop DPL pop DPH ret StatLCD: ; Lecture du status de l'afficheur LCD push DPH ; ------------------------------------ push DPL push ACC StatLCDloop: mov DPTR,#CmdReadLCD movx A,@DPTR ; Lecture du status de l'afficheur anl A,#80h jnz StatLCDloop ; Boucle si LCD busy pop ACC mov DPTR,#CmdReadLCD movx A,@DPTR ; Lecture du status de l'afficheur pop DPL pop DPH ret DataLCD: ; Ecriture d'une donnee a l'afficheur LCD push DPH ; --------------------------------------- push DPL push ACC DataLCDloop: mov DPTR,#CmdReadLCD movx A,@DPTR ; Lecture status de l'afficheur anl A,#80h jnz DataLCDloop ; Boucle si LCD busy pop ACC mov DPTR,#DataWriteLCD movx @DPTR,A ; Ecriture de la donnee a l'afficheur pop DPL pop DPH ret MesLCD: ; Ecriture d'un message a l'afficheur LCD lcall StatLCD ; --------------------------------------- clr C ; Debut DPTR fin si 0 subb A,#10h jc PosOK ; Curseur entre 0 et 15 donc OK subb A,#30h jc Recale ; Curseur entre 15 et 63 donc recallage a 64 subb A,#10h jc PosOK ; Curseur entre 64 et 79 donc OK mov A,#80h ; Curseur > 80 donc recallage lcall CmdLCD sjmp PosOK Recale: mov A,#0C0h lcall CmdLCD PosOK: movx A,@DPTR jz MesLCDfin ; Si 0 sortie lcall DataLCD inc DPTR sjmp MesLCD MesLCDfin: ret