; Indicatif F4HLA ; Copyright: Gilou-2002 ; ; Ce programme affiche des caracteres sur un ensemble 6*6 de diodes. ; Les principes utilises sont ; 1/Le multiplexage, ce qui permet de controler 36 leds a l'aide de seulement 12 pins. Malheureusement, ; cela ne permet d'allumer qu'une led a la fois (ou un ensemble de leds alignees) ; 2/La persistance retinienne : si on allume successivement des leds de facon assez rapide,on a l'impression ; qu'elles sont allumees en meme temps ; ; Pour afficher un texte personel, modifiez la partie "TEXTE" et pensez a creer les caracteres ; necessaires dans la zone "DESSIN" ; TITLE "Valentin" LIST P=16F84, R=DEC ; 16F84 a 4 MHz errorlevel 0,-305 INCLUDE "p16f84.inc" ;############################################################################################# ;# CONSTANTES ;############################################################################################# #define CMPTMAX 7 RAMBASE EQU 0CH ;############################################################################################# ;# MACRO ;############################################################################################# ; Saute l'instruction suivante si la Carry est nulle SKIPCC MACRO BTFSC STATUS,C ENDM ;############################################################################################# ;# RAM (variable) ;############################################################################################# CBLOCK RAMBASE cmpT ;compteur pr savoir a kelle "lettre" on en est (dans texte) timr0 ;compteur pr la tempo (affichage d'une lettre) timr1 ;compteur pr la tempo (affichage d'une lettre) PTRTXT ;ptr sur le texte a afficher (en fait la sequence de LED a allumer) Sav_W ; Sauvegarde W lors d'une interruption Sav_S ; Sauvegarde Status lors d'une interruption Sav_Pc ; Sauvegarde PCLATH lors d'une interruption ENDC ;############################################################################################# ;# CONFIGURATION ;############################################################################################# PAGE __CONFIG _CP_OFF & _RC_OSC & _PWRTE_ON & _WDT_OFF ; le WatchDog est OFF ;############################################################################################# ;# CODE PRINCIPAL ;############################################################################################# ;********** START ************* ORG 0 GOTO INIT ;********** INT *************** ORG 4 RETFIE ;pas d'interruption ;***************************************************************************************** ;* LED * ;***************************************************************************************** ; Allume la LED de coordonees Ligne*Colone et l'eteint juste apres ; 00=bas droite ; DLigne*Col D00 MOVLW B'10000001' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D01 MOVLW B'10000010' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D02 MOVLW B'10000100' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D03 MOVLW B'10001000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D04 MOVLW B'10010000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D05 MOVLW B'10100000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D10 MOVLW B'01000001' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D11 MOVLW B'01000010' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D12 MOVLW B'01000100' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D13 MOVLW B'01001000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D14 MOVLW B'01010000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D15 MOVLW B'01100000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D20 MOVLW B'11000001' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001110' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D21 MOVLW B'11000010' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001110' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D22 MOVLW B'11000100' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001110' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D23 MOVLW B'11001000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001110' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D24 MOVLW B'11010000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001110' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D25 MOVLW B'11100000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001110' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D30 MOVLW B'11000001' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001101' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D31 MOVLW B'11000010' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001101' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D32 MOVLW B'11000100' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001101' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D33 MOVLW B'11001000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001101' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D34 MOVLW B'11010000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001101' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D35 MOVLW B'11100000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001101' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D40 MOVLW B'11000001' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001011' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D41 MOVLW B'11000010' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001011' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D42 MOVLW B'11000100' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001011' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D43 MOVLW B'11001000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001011' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D44 MOVLW B'11010000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001011' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D45 MOVLW B'11100000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00001011' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D50 MOVLW B'11000001' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D51 MOVLW B'11000010' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D52 MOVLW B'11000100' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D53 MOVLW B'11001000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D54 MOVLW B'11010000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN D55 MOVLW B'11100000' ;1) 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'00001111' ; 1 sur col => eteint MOVWF PORTA MOVLW B'11000000' ; 0 sur ligne => eteint MOVWF PORTB RETURN ;***************************************************************************************** ;* DESSIN (ou caracteres) * ;***************************************************************************************** ;Les dessins a realiser ;(un caractere est un dessin) Table ADDWF PCL,F Tbase equ $ ; Dessin point POINT equ $-Tbase GOTO C0 ; Dessin petit coeur PETITC equ $-Tbase GOTO C1 ; Dessin de coeur COEUR equ $-Tbase GOTO C2 ; Z CZ equ $-Tbase GOTO C3 ; I CI equ $-Tbase GOTO C4 ; B CB equ $-Tbase GOTO C5 ; O CO equ $-Tbase GOTO C6 ; U CU equ $-Tbase GOTO C7 ; X CX equ $-Tbase GOTO C8 ;point C0 CALL D22 ;delais pr etre sur de laisser une image DECFSZ timr0,F GOTO C0 DECFSZ timr1,F GOTO C0 RETURN ;petit coeur C1 CALL D12 CALL D21 CALL D31 CALL D22 CALL D33 CALL D23 ;delais pr etre sur de laisser une image DECFSZ timr0,F GOTO C1 DECFSZ timr1,F GOTO C1 RETURN ;coeur C2 CALL D02 CALL D11 CALL D20 CALL D30 CALL D41 CALL D32 CALL D43 CALL D34 CALL D24 CALL D13 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C2 DECFSZ timr1, F GOTO C2 RETURN ;z C3 CALL D43 CALL D42 CALL D41 CALL D40 CALL D31 CALL D22 CALL D13 CALL D03 CALL D02 CALL D01 CALL D00 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C3 DECFSZ timr1, F GOTO C3 RETURN ;i C4 CALL D42 CALL D32 CALL D22 CALL D12 CALL D02 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C4 DECFSZ timr1, F GOTO C4 RETURN ;b C5 CALL D43 CALL D33 CALL D23 CALL D13 CALL D03 CALL D02 CALL D01 CALL D00 CALL D10 CALL D21 CALL D22 CALL D31 CALL D42 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C5 DECFSZ timr1, F GOTO C5 RETURN ;o C6 CALL D42 CALL D41 CALL D30 CALL D20 CALL D10 CALL D01 CALL D02 CALL D13 CALL D23 CALL D33 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C6 DECFSZ timr1, F GOTO C6 RETURN ;u C7 CALL D43 CALL D40 CALL D30 CALL D20 CALL D10 CALL D01 CALL D02 CALL D13 CALL D23 CALL D33 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C7 DECFSZ timr1, F GOTO C7 RETURN ;x C8 CALL D44 CALL D33 CALL D22 CALL D11 CALL D00 CALL D40 CALL D31 CALL D13 CALL D04 ;delais pr etre sur de laisser une image DECFSZ timr0, F GOTO C8 DECFSZ timr1, F GOTO C8 RETURN ;***************************************************************************************** ;* INITIALISATION * ;***************************************************************************************** INIT BSF STATUS,RP0 ; on adresse la bank 1 des registres MOVLW B'00000' MOVWF TRISA ; RA4=s RA3=s RA2=s RA1=s RA0=s MOVLW B'00000000' ; port B en sortie MOVWF TRISB BCF STATUS,RP0 ; on adresse la bank 0 pour la suite du programme CLRF cmpT CLRF timr0 CLRF timr1 ;***************************************************************************************** ;* PROGRAMME PRINCIPAL * ;***************************************************************************************** MAIN ; INIT MOVLW B'11100000' ; 0 sur ligne => eteint MOVWF PORTB MOVLW B'00000111' ; 1 sur col => eteint MOVWF PORTA START MOVLW B'01010000' MOVWF timr0 MOVWF timr1 MOVLW HIGH Texte MOVWF PCLATH MOVF cmpT,W CALL Texte MOVWF PTRTXT MOVLW HIGH Table MOVWF PCLATH MOVF PTRTXT,W CALL Table INCF cmpT,F MOVF cmpT,W ADDLW -(FTexte-DTexte); comparaison à la longueur du texte SKIPCC CLRF cmpT GOTO START ;***************************************************************************************** ;* DONNEES DES TEXTES (ou enchainement de caracteres) * ;***************************************************************************************** Texte ADDWF PCL,F DTexte equ $ RETLW POINT RETLW PETITC RETLW COEUR RETLW CZ RETLW CI RETLW CB RETLW CO RETLW CU RETLW CX FTexte equ $ END