#include <eForth1.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 =
"CREATE x $F360 , $B5F4 , $66D6 , $D770 , $F776 ,\n" // x keeps 7-seg pin patterns of 0~9
"CREATE d $E0$D0 , $B007 ,\n" // d keeps digit control
": 7d d + C@ DUP $30F ;\n" // ( n -- ) set output digit
"VARIABLE vx 2 ALLOT\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 / NEXT DROP ;\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
"VARIABLE di\n" // i is the 7-seg digit to display
": dsp di @ 1 + 3 AND DUP di ! 7s ;\n" // ( -- ) increment i (max 3) and display
"' dsp 80 0 TMISR\n" // timer interrupt to update display every 5ms
"CREATE cnt 0 ,\n" // cnt is a counter we want it value on display
": c++ cnt @ 1+ DUP 9999 > IF DROP 0 THEN DUP cnt ! ?v ;\n" // ( -- ) increment the counter and cache patterns
"' c++ 1000 1 TMISR\n"; // timer interrupt to update c every second
void setup() {
Serial.begin(115200);
while (!Serial);
for (int i=4; i<=11; i++) pinMode(i, OUTPUT);
for (int i=14; i<=19; i++) pinMode(i, OUTPUT);
ef_setup(code);
}
void loop() {
ef_run();
}