************************************* * ROUTINE POUR LE LCD ET * * LE THERMOMETRE (DS1620) BRANCHER * * SUR LE PORT C D'UN 68HC11 * * * * LCD THERMO * * * * PC7-> D7 | * * PC6-> D6 | * * PC5-> D5 | * * PC4-> D4 | * * PC3-> E | * * PC2-> R/W | DQ * * PC1-> RS | CLK * * PC0-> N/C | RST * ************************************* ************************************* * SOUS-ROUTINE POUR AFFICHAGE NORMAL* * * * X-> pointeur de debut de chaine * * qui doit se terminer par $04, * * si la case contient $0A il y * * a un changement de ligne * * * * Reg aff: X,CCR * ************************************* LCDTXT: PSHA LCDTXT2: LDAA ,X * Prend la valeur pointer par X INX * Incremente le pointeur CMPA #$0A * Verifie si un changement de ligne BEQ LCDTXT5 * Si oui effectue le changement de ligne CMPA #$04 * Verifie si ces la fin de la chaine BEQ LCDTXT4 * Si oui termine JSR LCDTEST * Verifie si le LCD est pret JSR LCDWDATA * Ecrit la donnee sur le LCD BRA LCDTXT2 * Prochain caractere LCDTXT4: PULA * Fin de la sous-routine RTS LCDTXT5: LDAA #$C0 * Pointe la case #1 de la ligne #2 JSR LCDTEST * Verifie si le LCD est pret JSR LCDWCTL * Envoie la nouvelle adresse BRA LCDTXT2 * Continue a ecrire sur la ligne #2 *************************************** * LCDWBYTE * * * * SOUS-ROUTINE QUI ECRIT LE CONTENU * * DE A EN HEXA SUR LE LCD EN ASCII * * * *************************************** * LCDWHBYT * * * * SOUS-ROUTINE QUI ECRIT LE CONTENU * * DE A LSB EN HEXA SUR LE LCD EN ASCII* * * * Ref Aff: CCR * *************************************** LCDWBYTE: PSHA LSRA LSRA LSRA LSRA ADDA #$30 JSR LCDTEST JSR LCDWDATA PULA LCDWHBYT: PSHA ANDA #%00001111 ADDA #$30 JSR LCDTEST JSR LCDWDATA PULA RTS *************************************** * LCDCLR * * * * SOUS-ROUTINE QUI EFFACE LE LCD * * * * Reg Aff: CCR * *************************************** LCDCLR: PSHA JSR LCDTEST LDA #$01 JSR LCDWCTL PULA RTS ************************************* * LCDCHAR * * * * SOUS-ROUTINE QUI DEFINI DES * * CHARATERE POUR LE LCD * * X-> DEBUT DE LA TABLE POUR CHAR * * A-> NUMERO DU CHAR A DEFINIRE * * * * Reg Aff: A,B,X,CCR * ************************************* LCDCHAR: LSLA LSLA LSLA ORAA #%01000000 LCDCHAR1: JSR LCDTEST JSR LCDWCTL INCA LDAB ,X INX CMPB #$FF BEQ LCDCHAR2 JSR LCDTEST PSHA TBA JSR LCDWDATA PULA BRA LCDCHAR1 LCDCHAR2: RTS ************************************* * LCDTEST * * * * Cette sous-routine attend que le * * LCD ne soit plus busy * * * * Reg Aff:CC * ************************************* LCDTEST: PSHA LCDTEST1: JSR LCDRCTL * Prend la valeur du registe de controle BMI LCDTEST1 * Si busy, Reverifie PULA * Fin de la sous-routine RTS ************************************* * LCDWDATA * * * * Ecrit 8 bit contenu dans A * * et le met dans RS = 1 * * * * Reg Aff: CC * ************************************* * LCDWCTL * * * * Ecrit 8 bit contenu dans A * * et le met dans RS = 0 * * * * Reg Aff: CC * ************************************* LCDWDATA: PSHB LDAB #%00000010 BRA LCDW LCDWCTL: PSHB LDAB #%00000000 LCDW: PSHX PSHA PSHA LDX #REGS PSHA LDAA DDRC,X * Lit la direction du PC ORAA #%11111110 * Met le PC en ecriture STAA DDRC,X * sauf le bit 0 LDAA PC,X * Lit la valeur sur le PC ANDA #%00000001 * Pour ne pas modifier le Bit 0 ABA * lors de l'ecriture TAB PULA ANDA #%11110000 * Met E a 0 et ecrit le data (4 bit) ABA STAA PC,X BSET PC,X %00001000 * Met E a 1 + Delai BCLR PC,X %00001000 * Met E a 0 + Delai PULA * Reprend A pour envoier 2eme partie ASLA * Shift pour avoir la deuxieme pratie ASLA * du data + Delai ASLA ASLA ABA STAA PC,X BSET PC,X %00001000 * Met E a 1 + Delai BCLR PC,X %00001000 * Met E a 0 + Delai PULA * Reprend A pour terminer PULX * Reprend X Pour terminer PULB RTS * Fin de la sous-routine ************************************* * LCDRDATA * * * * Lit 8 bit contenu dans RS = 1 * * et le met dans A * * * * Reg Aff: A,CC * ************************************* * LCDRCTL * * * * Lit 8 bit contenu dans RS = 0 * * et le met dans A * * * * Reg Aff: A,CC * ************************************* LCDRDATA: PSHB LDAB #%00000110 BRA LCDR LCDRCTL: PSHB LDAB #%00000100 LCDR: PSHX LDX #REGS LDAA DDRC,X * Prend la direction du PC ANDA #%00001111 * Modifie la direction du PC ORAA #%00001110 * mais pas le bit 0 STAA DDRC,X LDAA PC,X * Lit la valeur du PC ANDA #%00000001 * pour ne pas modifier la valeur ABA * du bit 0 lors de l'ecriture TAB STAB PC,X BSET PC,X %00001000 * Met E a 1 + Delai NOP LDAA PC,X * Lit le data 4 bit BCLR PC,X %00001000 * Met E a 0 + Delai PSHA STAB PC,X BSET PC,X %00001000 * Met E a 1 + Delai NOP LDAA PC,X * Lit le data 4 bit BCLR PC,X %00001000 * Met E a 0 + Delai LSRA LSRA LSRA LSRA PULB ANDB #%11110000 ABA PULX PULB RTS ************************************* * LCD4BIT * * * * Initialise le LCD en mode 4 bit * * * * Reg Aff: CC * ************************************* LCD4BIT: PSHX LDAA #%00110000 BSR LCD4B2 * Delai 16.4 ms BSR LCD4B2 BSR LCD4B2 BSR LCD4B2 BSR LCD4B1 * Fonction Set 8 bit BSR LCD4B2 * Delai 4.1 ms BSR LCD4B1 * Fonction Set 8 bit BSR LCD4B2 * Delai 4.1 ms BSR LCD4B1 * Fonction Set 8 bit BSR LCD4B2 * Delai 4.1 ms LDAA #%00100000 BSR LCD4B1 * Fonction Set 4 Bit PULX RTS LCD4B1: PSHA PSHX PSHB LDX #REGS LDAB #%11111111 * Met le DATA en ecriture STAB DDRC,X * et le reste en ecriture PULB ANDA #%11110000 STAA PC,X BCLR PC,X #%00001110 * Met E & R/W & RS a 0 BSET PC,X #%00001000 * Met E a 1 BCLR PC,X #%00001000 * Met E a 0 PULX PULA RTS LCD4B2: LDX #$0384 * Delai de 4.5 ms LCD4B21: DEX CPX #$0000 BNE LCD4B21 RTS ************************************* * LCDINI * * * * Initialise le LCD en mode * * 4 bit 2 ligne * * Display ON Cursor OFF Blinking OFF* * Clear Display * * Cursor INC, Shift OFF * * * * Reg Aff: A,CC * ************************************* LCDINIT: JSR LCDTEST LDAA #%00101000 * 4 Bit 2 Ligne JSR LCDWCTL JSR LCDTEST LDAA #%00001100 * Display ON Cursor OFF Blink OFF JSR LCDWCTL JSR LCDTEST LDAA #%00000001 * Clear display JSR LCDWCTL JSR LCDTEST LDAA #%00000110 * Cursor INC Shift OFF JSR LCDWCTL RTS