mainTitle = "définition mots pinMode, digitalRead et digtalWrite en FORTH"; 
$this->asideSection = "Définition en langage FORTH des mots pinMode, digitalRead et digtalWrite " 
. "qui existent en langage C pour Arduino"; 
 
?> 
\ ****************************************************************************** 
\ définition mots pinMode, digitalRead et digtalWrite en FORTH 
\ 
\ Forth version: Flash Forth (http://flashforth.com/)  
\ author: M PETREMANN 
\ Creation:     24 mai 2019 
\ Modification: -- ----- ---- 
\ ****************************************************************************** 
 
decimal 
flash                \ selection mémoire FLASH 
-readwrite           \ supprime les précédentes définitions crées après -readwrite 
marker -readwrite    \ définit le marqueur -readwrite 
decimal 
 
\ les PORTS B, C et D sont présents sur toutes les cartes Arduino 
\ PORTB 
37 constant PORTB	\ Port B Data Register 
36 constant DDRB	\ Port B Data Direction Register 
35 constant PINB	\ Port B Input Pins 
 
\ PORTC 
\ 40 constant PORTC	\ Port C Data Register 
\ 39 constant DDRC	\ Port C Data Direction Register 
\ 38 constant PINC	\ Port C Input Pins 
 
\ PORTD 
43 constant PORTD	\ Port D Data Register 
42 constant DDRD	\ Port D Data Direction Register 
41 constant PIND	\ Port D Input Pins 
 
\ les ports E, F, G, H, J, K, L sont spécifiques à certaines cartes Arduino 
\ PORTE 
46 constant PORTE	\ Data Register, Port E 
45 constant DDRE	\ Data Direction Register, Port E 
44 constant PINE	\ Input Pins, Port E 
 
\ PORTF 
49 constant PORTF	\ Data Register, Port F 
48 constant DDRF	\ Data Direction Register, Port F 
47 constant PINF	\ Input Pins, Port F 
 
\ PORTG 
52 constant PORTG	\ Data Register, Port G 
51 constant DDRG	\ Data Direction Register, Port G 
50 constant PING	\ Input Pins, Port G 
 
\ PORTH 
258 constant PORTH	\ PORT H Data Register 
257 constant DDRH	\ PORT H Data Direction Register 
256 constant PINH	\ PORT H Input Pins 
 
\ PORTJ 
261 constant PORTJ	\ PORT J Data Register 
260 constant DDRJ	\ PORT J Data Direction Register 
259 constant PINJ	\ PORT J Input Pins 
 
\ PORTK 
264 constant PORTK	\ PORT K Data Register 
263 constant DDRK	\ PORT K Data Direction Register 
262 constant PINK	\ PORT K Input Pins 
 
\ PORTL 
267 constant PORTL	\ PORT L Data Register 
266 constant DDRL	\ PORT L Data Direction Register 
265 constant PINL	\ PORT L Input Pins 
 
: defPin: ( PORTx mask ---  |  --- mask port) 
    create 
        c, c,           \ compile PORT et masque du pin à définir 
    does> 
        dup c@          \ empile masque du pin 
        swap 1+ c@      \ empile PORT du pin 
    ; 
 
$ff constant OUTPUT 
$00 constant INPUT 
 
\ exemple  
\ PORTB $80 defPin: pin13 
 
: pinMode (  state ---) 
    0= if 
        1- dup c@       \ récupère valeur DDR 
        rot $ff xor     \ XOR logique avec $ff 
        and swap c!     \ ET logique avec résultat, remet valeur dans DDR 
    else 
        1- dup c@       \ récupère valeur DDR 
        rot or          \ OU logique avec mask 
        swap c!         \ remet valeur dans DDR 
    then    
; 
 
\ Exemple:  
\ pin13 OUTPUT pinMode 
\ pin13 INPUT  pinMode 
 
: digitalRead (  --- fl) 
    1- 1- c@ and        \ récupère valeur registre PIN, fait un AND logique 
    if      true        \ si valeur pas nulle, empile TRUE     
    else    false       \ si valeur nulle, empile FALSE 
    then ; 
 
\ Exemple: 
\ pin13 digitalRead 
 
true  constant ON 
false constant OFF 
 
: digitalWrite (  fl ---) 
    0= if 
        dup c@          \ récupère valeur registre PORT 
        rot $ff xor and \ fait un XOR sur masque suivi de AND  
        swap c!         \ met résultat dans registre 
    else 
        dup c@          \ récupère valeur registre PORT 
        rot or          \ fait un OR logique 
        swap c!         \ met résultat dans registre 
    then ; 
 
\ Exemple: 
\ pin13 ON digitalWrite 
 
 
-pins 
marker -pins 
 
\ définition pinXX 
PORTB $80 defPin: pin13 
PORTB $40 defPin: pin12 
PORTB $20 defPin: pin11 
PORTB $10 defPin: pin10 
 
PORTH $20 defPin: pin09 
PORTH $10 defPin: pin08 
PORTH $08 defPin: pin07 
PORTH $04 defPin: pin06 
 
: pin13-on ( ---) 
    pin13 ON digitalWrite ; 
: pin13-off ( ---) 
    pin13 OFF digitalWrite ; 
: pin12-on ( ---) 
    pin12 ON digitalWrite ; 
: pin12-off ( ---) 
    pin12 OFF digitalWrite ; 
: pin11-on ( ---) 
    pin11 ON digitalWrite ; 
: pin11-off ( ---) 
    pin11 OFF digitalWrite ; 
 
: init-feux ( ---) 
    pin11 OUTPUT pinMode 
    pin12 OUTPUT pinMode 
    pin13 OUTPUT pinMode ; 
 
: feu-vert ( n ---) 
    pin11-on 
    ms              \ n est la valeur du délai d'allumage en millisecondes 
    pin11-off ; 
 
: feu-orange ( n ---) 
    pin12-on 
    ms              \ n est la valeur du délai d'allumage en millisecondes 
    pin12-off ; 
 
: feu-rouge ( n ---) 
    pin13-on 
    ms              \ n est la valeur du délai d'allumage en millisecondes 
    pin13-off ; 
 
: feux-tricolore ( ---) 
    3000 feu-vert 
    500  feu-orange 
    3000 feu-rouge ;