HIPI is a small touch-screen box on a Raspberry Pi Pico 2 (RP2350) that sits on the HP-IL loop of an HP-41, HP-71 or HP-75 and acts as a whole set of classic HP peripherals at once:
| HIPI acts as… | Original HP device | Loop name |
|---|---|---|
| Video display | HP 82163 Video Interface, or HP 92198 80-column (a setting) | TFDISPLAY |
| Cassette drive | HP 82161A Digital Cassette Drive | TFDRIVE |
| Plotter | HP 7470A | TFPLOT |
| Thermal printer (7" view) | HP 82162A Thermal Printer | TFPRINT |
| Any I2C chip / sensor | — | TFI2C |
| LEDs and colour pixels | — | TFLEDS, TFPIXEL |
| Link to a PC (e.g. pyILPER) | PIL-Box | PILBOX |
| Terminal over USB | — | TFTERM |
Cassettes are LIF image files on a micro-SD card. Besides the device views (display, plotter, tape drive, printer) there is an HP-IL analyzer, a loop map, an HP-IL signal view, screen savers, screen dumps, and a mirror of the screen to a PC for recording videos.
The project started as a C++17 port of J. Chilla's MicroPython project
JCILD (HP 82163 video display and HP 82161 drive emulator), including its
RA8875 display driver (HIPI's first, 5" panel; after 1.3.0 HIPI has only
the 7" LT7683 panel).
| Document | For | Contents |
|---|---|---|
| User Manual | Users | Getting started, views, menus, devices, settings, troubleshooting |
| User & Developer Guide | Developers | Setting up, building, flashing, USB interfaces, adding your own HP-IL device |
| pcb/README.md | Builders | The circuit board and choice of display; BOM, schematics |
| tools/hipiview | Users | Showing and recording the screen on a PC |
| tools/ilctrl | Users | A command-line HP-IL controller for the PC (PIL-Box CON mode) |
| Part | |
|---|---|
| MCU | Raspberry Pi Pico 2 / Pico 2 W (RP2350) |
| Display | 7", 1024 × 600, LT7683, FT5316 touch |
| Storage | micro-SD card (FAT32 recommended, exFAT works) |
| USB | 4 serial ports (console, PILBOX, terminal, display mirror) and the SD card as a USB drive — see GUIDE § 7 |
Display SPI wiring (same as the original share.py):
| Function | GPIO |
|---|---|
| SPI0 SCK | GP2 |
| SPI0 MOSI | GP3 |
| SPI0 MISO | GP0 |
| CS (low) | GP1 |
| RST | not wired — the module has its own power-on reset |
The build makes build/hipi_7_pico.uf2. The details, including the PicoLED library, are in
GUIDE.md § 1–3.
- Install the Raspberry Pi Pico extension.
- pico-sdk 2.2.0: if the extension hasn't installed it, clone it and
point
PICO_SDK_PATHat it:git clone -b master https://github.com/raspberrypi/pico-sdk.git ~/pico-sdk cd ~/pico-sdk && git submodule update --init export PICO_SDK_PATH=$HOME/pico-sdk # or $HOME/.pico-sdk/sdk/2.2.0
- Import the project — not File → Open Folder, but
Ctrl+Shift+P→ Raspberry Pi Pico: Import Project, pick the folder withCMakeLists.txt, and board pico2 (or pico2_w). - Build with the Build button in the status bar or
Ctrl+Shift+B. The first build takes a minute or two.
export PICO_SDK_PATH=$HOME/.pico-sdk/sdk/2.2.0 # or ~/pico-sdk
cmake -G Ninja -B build -S .
cmake --build buildHold BOOTSEL while plugging in (or resetting) the Pico 2 and drop the
.uf2 onto the drive that appears — or use picotool:
picotool load -f build/hipi_7_pico.uf2Later updates can be started from the menu: More → System → Bootsel mode.
Everything the SD card needs is in HIPI-SD-card.zip in the project
folder (and with every release):
- Format a micro-SD card as FAT32 (exFAT works too).
- Unzip
HIPI-SD-card.ziponto it, keeping the folders. - Put your own cassettes (
.dator.liffiles) inlif/.
The card then holds:
README.txt what's what
resources/ Tape view pictures: hp82161a.bmp, tape-in.bmp, open.bmp, leds.bmp, reels.bmp
Printer view pictures: hp82162a.bmp, prtparts.bmp
lif/ cassettes (*.dat or *.lif, LIF) — one example to start with
CONFIG.TXT settings — created by HIPI on first start
screenshots/ screen dumps — created by the first Screendump
text/ the display's text (display_<n>.txt) — created by the first "Save as text"
logs/ analyzer logs — created by the first "Log to file"
The zip is made by sdcard/make_sd_card.py and remade by the build
whenever one of its files changes. The script can also copy straight onto
a mounted card: sdcard/make_sd_card.py --to /media/$USER/HIPI. To change
what's on the card, edit sdcard/ (README, example cassettes) or the
pictures in resources/.
The button strip and the logo are built into the firmware, so HIPI starts and its menus work without an SD card.
The User Manual has the full story; these are the essentials.
Buttons. Touch the right edge of the screen to slide in the button strip (it hides again after 5 s):
| Button | Menu closed | In the menu | After Shift |
|---|---|---|---|
| OK | Opens the menu | Chooses | EXIT — closes the menu |
| ▲ / ▼ | Scrolls the text back / forward one line | Moves up / down | One page |
| X | Back to the live text | Back one level | CLR — clears the screen |
Touch. Top-left corner: info box. Bottom-left corner: the devices on the loop and their addresses. Swipe left/right: next/previous device view.
Menus. OK opens the menu of the view on the screen (e.g. Clear plotter in the Plotter view). Its last row, More, leads to HIPI's own menu:
More >
├── Go to view > Display · Plotter · Tape · Analyzer · Loop map · HP-IL signals
├── Settings > Screen · Screen saver · Devices · PC link
└── System > Connect to PC · Loopback test · Hardware test · Demo · Character table ·
About · Bootsel mode
While a menu is open HIPI keeps working: nothing the HP-41 sends is lost, and the view underneath is up to date when the menu closes.
Settings are saved at once to CONFIG.TXT on the SD card as
key=value lines; unknown keys are ignored, so old files keep working. All
keys are listed in the
User Manual § 12.
Characters. The display font (hp82163_font.hpp) is an 8×16 font with
the HP-41 characters plus Å Ä Ö å ä ö. txtWrite() decodes UTF-8, so a
string like "Fänge" in the source code shows correctly.
CMakeLists.txt build: the firmware (hipi_7_pico)
include/, src/ the firmware (below)
lib/ no-OS-FatFS (SD card), vendored, unmodified
PicoLED/ WS2812 library for TFPIXEL, vendored
resources/ artwork: Tape and Printer view pictures (SD card), buttons and logo (built in)
sdcard/ the SD card: README.txt, example cassette in lif/, make_sd_card.py
HIPI-SD-card.zip everything for a new SD card (made by the build)
scripts/ build/flash helpers, bmp_to_rgb565.py (turns BMPs into C++)
tools/ PC programs: hipiview (display mirror), ilctrl (HP-IL controller), pixeltest,
printertest; images/ (how the Printer view pictures are made)
documents/ USER_MANUAL.md, GUIDE.md, images
pcb/ hardware: README, BOM, schematics, PCB
The firmware, by area (.h/.hpp in include/, .cpp in src/):
| Area | Files | |
|---|---|---|
| Start-up | pico_main, hipi, boot_service, hipi_features.h |
Boot sequence and main loop; creates the HP-IL devices; build switches |
| HP-IL | hpil, hpil.pio, device |
Frames, the PIO physical layer, the CDevice base class |
| HP-IL devices | display, drive + tape, plotter, printer, illeds, ilpixels, terminal, pilbox, ili2c |
TFDISPLAY (HP 82163 or HP 92198), TFDRIVE (LIF on SD), TFPLOT (HP-GL), TFPRINT (HP 82162A), TFLEDS, TFPIXEL, TFTERM, PILBOX, TFI2C (any I2C chip: temperature, pressure, distance, clock ...) |
| Display driver | LT7683, *Transport, display_config.h |
The 7" panel's controller; SPI on the Pico (or spidev on Linux) |
| Text display | Screen, hp82163_font.hpp, video80 |
HP 82163 emulation: text buffer, escape codes, scroll-back; the HP 92198's 80-column screen |
| Views | views, plotterview, analyzer, loopmap, hpil_diag (+ .pio), chartable |
Display / Tape / Printer views and switching (views), the Plotter view (plotterview); analyzer, loop map, HP-IL signals, character table |
| User interface | boardui, uidialog.hpp, ui_buttons.hpp, touch, bootscreen |
Button strip, menus, info box, device list, touch, start-up screen |
| Screen extras | backlight, clock, rtc, saver_anim, screendump |
Backlight and screen savers, DS3231 clock, screen dumps |
| Display mirror | display_mirror, mirror_*.h(pp) |
The screen mirrored to a PC (tools/hipiview) |
| Settings & files | config.hpp, sd_paths.h, bmp_loader.hpp, lif_info.hpp, hw_config |
CONFIG.TXT, SD folders, BMP loading, LIF directories, SD card wiring |
| USB | usb_serial.h, usb_msc, my_descriptors.c, tusb_config.h |
Serial ports, the SD card as a USB drive, descriptors |
| Hardware drivers | leds, pixels, bmp280, i2c_device, i2c_ident, i2c_chips |
LEDs, NeoPixels, pressure sensor, I2C; what's on the I2C bus (chips described in sdcard/i2c/*.txt) |
| Fonts & pictures | *_font*.cpp, glyph_font, buttons_image.cpp, logo_image.cpp |
Generated data (see scripts/) |
| Other | display_test.hpp, display_boot_test.hpp, linux_main |
Optional diagnostics; a Linux demo (off by default) |
- Global state from
share.pybecame constructor arguments. DisplayTransportis a virtual SPI/GPIO interface, so the platform is easy to swap (PicoSpiTransport,LinuxSpiDevTransport).delayMs()replacestime.sleep();_write_reg/_write_reg16became the publicwriteReg/writeReg16.- The display runs in 16-bit RGB565 instead of 8-bit RGB332.
- New: the touch UI, persistent settings, the extra HP-IL devices and views, the LT7683 (7") driver, and the Swedish characters.
The HP-41 sends compact command strings to TFLEDS, for example
"1B0:100:900" (LED 1 blinks forever, 100 ms on, 900 ms off). A command is
<leds><command>[<parameters>]; several commands are separated by spaces.
LEDs: 1–5 select single LEDs and can be combined (135 = LEDs 1, 3
and 5); 0 selects all.
| Command | Parameters | Meaning | Example |
|---|---|---|---|
O |
— | On | 12O |
C |
— | Off | 345C |
B |
none, or n |
Blink n times, 200 ms on/off (none or 0 = forever) |
15B5 |
B |
n:ms |
Blink n times, ms on and off |
3B10:150 |
B |
n:on:off |
Blink n times, on ms on, off ms off |
3B10:100:400 |
S |
n |
Brightness n % (0–100) | 1S75 |
F+ |
t |
Fade on over t ms | 2F+800 |
F- |
t |
Fade off over t ms | 2F-500 |
F |
n:t |
Fade to n % over t ms | 4F30:600 |
01 LBL "TEST"
02 3
03 SELECT
04 "1B0:100:900"
05 OUTA
More examples:
"0C" all LEDs off
"12O 345C" LEDs 1 and 2 on, LEDs 3, 4 and 5 off
"0S50 0F+2000" all LEDs: brightness 50 %, then fade on over 2 s
"1B3:100:200 2F+500" LED 1 blinks 3 times; LED 2 fades on over 0.5 s
- Put a space between commands when a number is followed by the next
LED digit:
"1B5 23C", not"1B523C"(that is LED 1 blinking 523 times). \n,;orflush()also end the last command.Sand theFcommands need PWM (CLED_NO_PWMnot defined, seeleds.h); without it, brightness does nothing and fades switch at once.
- MicroPython
share.py+RA8875.py: J. Chilla, March 2026 - HP 82163A video interface for the HP-41
- HP-IL interface specification: https://literature.hpcalc.org/community/hp82166-is-en.pdf
- Control the world with HP-IL: https://literature.hpcalc.org/community/control-with-hp-il.pdf
- RA8875 (CircuitPython driver): https://github.com/adafruit/Adafruit_CircuitPython_RA8875
- 7" panel (LT7683): https://www.buydisplay.com/spi-7-inch-tft-lcd-dislay-module-1024x600-ra8876-optl-touch-screen-panel
- pico-sdk: https://github.com/raspberrypi/pico-sdk
- Pico VS Code extension: https://github.com/raspberrypi/pico-vscode