#include <nanoFORTH.h>
//
// Note:
// depends on how fast is your PC/browser,
// too low a refresh rate might make the display appear flickering
//
const char code[] PROGMEM =
": ini 12 FOR 1 I 1 + PIN NXT ; ini FGT ini\n" // set pin 2~13 to OUTPUT
"VAR x 8 ALO\n" // x keeps 7-seg pin patterns of 0~9
"$F360 x ! $B5F4 x 2 + ! $66D6 x 4 + !\n"
"$D770 x 6 + ! $F776 x 8 + !\n"
"VAR d 2 ALO\n" // d keeps digit control pin patterns
"$3834 d ! $2C1C d 2 + !\n"
": 7d d + C@ DUP $10C OUT $230 OUT ;\n" // ( n -- ) set output digit
"VAR vx 2 ALO\n" // vx cache pattern for 4 digits before display
": vx! 1 - vx + C! ;\n" // ( i -- ) update vx by index
": ?v 4 FOR DUP 10 MOD x + C@ I vx! 10 / NXT DRP ;\n" // ( n -- ) process number into 4-digit bit patterns
": 7s DUP 7d vx + C@ DUP $1F0 OUT $20F OUT ;\n" // ( i -- ) display i'th digit on 7-seg
"VAR i\n" // i is the 7-seg digit to display
": dsp i @ 1 + 3 AND DUP i ! 7s ;\n" // ( -- ) increment i (max 3) and display
"80 0 TMI dsp\n" // timer interrupt to update display every 5ms
"VAR cnt 0 cnt !\n" // cnt is a counter we want it value on display
": c++ cnt @ 1 + DUP 9999 > IF DRP 0 THN DUP cnt ! ?v ;\n" // ( -- ) increment the counter and cache patterns
"1000 1 TMI c++\n" // timer interrupt to update c every second
"1 TME\n"; // start counting (enable timer interrupt)
void setup() {
Serial.begin(115200);
while (!Serial);
n4_setup(code);
}
void loop() {
n4_run();
}