-
Notifications
You must be signed in to change notification settings - Fork 66
STM8 eForth Board Character IO
Many cheap STM8 boards feature 7S-LED displays and keys. STM8 eForth supports these through vectored I/O as I/O devices. The behavior is similar to a I/O redirection in PC operating systems.
Keys are read as a bit pattern by the word BKEY
(typically implemented in boardcore.inc
), and then translated to ASCII characters by a simple mapping.
The word ?KEYB
does a simple translation of the key bit-field value to ASCII codes. The translation is defined by BKEYCHAR
in boardcore.inc
.
As an example, the W1209 thermostat boardcore.inc
maps the 3 keys as follows:
Key | ?KEYB | BKEY |
---|---|---|
"SET" | "A" (0x41) | 0x01 |
"+" | "B" (0x42) | 0x02 |
"-" | "D" (0x44) | 0x04 |
Pressing multiple keys leads to an ASCII code corresponding to the value of the bit-field (e.g. "SET" and "-" result in the code 0x45 (ASCII "E").
LED displays appear as right-aligned digit groups (e.g. boards W1219 2x 3-digits, or W1401 3x 2-digits) that each work similar to the display of a pocket calculator:
-
CR
moves the cursor to the first (leftmost, upper) 3-digit group without blanking it -
SPACE
after another printable character moves the cursor to the next group, and blanks it -
.
is rendered as DP without shifting characters to the left -
,
is rendered as a blank
Emitting more than the characters of a group won't spill into the next group (23..,5
is rendered as 3. 5
).
The I/O word E7S
sends an ASCII char to the LED pattern buffer, and on the lower level the word P7S
can be used to display an 8bit LED pattern:
\ display 0º on the 7S-LED display (48 is ASCII for "0")
48 E7S $63 P7S
Using vectored I/O it's possible to redirect console I/O to the 7S-LED display:
' E7S 'EMIT !
However, the 3 digits are just enough for showing ok
(the EMIT
vector can be restored with ' TX! 'EMIT !
).
On supported boards with 7S-LED displays (e.g. W1209, W1219, or W1401) the background task displays data on the 7S-LED display: E7S
is used through vectored I/O.
This makes displaying measured data very simple. The following code displays different data (all scaled to a range of 0..99) on the 3x2 digit 7S-LED groups of the board W1401
:
: timer TIM 655 / ;
: ain 5 ADC! ADC@ 100 1023 */ ;
: show timer . ain . BKEY . CR ;
' show bg !
The word show
displays the values scaled to 0..99 from the BG
timer, the sensor analog input, and the board key bitmap BKEY
followed by a CR
(new line). When the word show
runs in the background, it displays the ticker on the left yellow 7S-LED group, ain
on the middle red LEDs, and the board key bitmap on the right yellow group.
In a background task the ?KEY
vector is assigned to ?KEYB
for reading board keys in the same way as ?RX
does in the foreground task for reading characters from the serial interface.
When ?KEYB
is used in a background task it performs key repetition (with initial delay). This makes implementing simple "+/- editors" with "hold to change" easy. The code in W1209 pulse generator provides an example.