; test05.asm ; ; Programme de test du 8031 N° 05 ; Utilisation des timers ; ; (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 compteur sur deux digits sur l'afficheur word CmdReadLCD, #E002h word CmdWriteLCD, #E000h word DataReadLCD, #E003h word DataWriteLCD, #E001h ORG 2000h ; Reset externe Restart: ljmp Begin ORG 2003h ; Interruption externe 0 reti ORG 200Bh ; Interruption timer 0 ljmp T0Int ORG 2013h ; Interruption externe 1 reti ORG 201Bh ; Interruption timer 1 reti ORG 2023h ; Interruption interface serie reti T0Int: clr TR0 ; Arret timer 0 mov TL0,#07 ;32-25 mov TH0,#56 ;256-200 setb TR0 push PSW push ACC inc R0 mov A,R0 clr C subb A,#200 jc ROk ; R0 ok car < 200 mov R0,#00h ; reset de R0 donc inc de R1 inc R1 mov A,R1 clr C subb A,#100 jc ROk ; R1 ok car < 100 mov R1,#00h ; reset de R1 ROk: pop ACC pop PSW setb EA reti Begin: mov SP,#07h ; Debut de pile en 08h lcall InitLCD lcall CurseurOFF mov R0,#00h mov R1,#00h mov TMOD,#30h ; T1 off T0 prescaler mode mov TL0,#07 ;32-25 mov TH0,#56 ;256-200 setb PT0 ; T0 de + haute priorite setb TR0 ; T0 on setb ET0 ; T0 enabelee setb EA ; Interruption enabelees Boucle: lcall HomeLCD mov A,R1 mov B,#10 div AB lcall AtoCar lcall DataLCD mov A,B lcall AtoCar lcall DataLCD ljmp Boucle ; Boucle infinie AtoCar: ; Conversion hexa -> ASCII push ACC ; ------------------------ clr C subb A,#10 jc Car0a9 subb A,#6 jc CarAaF pop ACC mov A,#2Ah ret CarAaF: pop ACC add A,#37h ret Car0a9: pop ACC add A,#30h ret 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