This post will explain everything I've figured out about controlling the handset via serial data commands (on pin 5 of the RJ45 cord, inverted UART at 800 baud). Refer to
this Google Docs spreadsheet for a complete list/description of all commands (second sheet/tab named "Transceiver -> Handset").
All commands will be referenced in this post by their numeric hexadecimal value.
The handset is dumb and will not do anything on its own in response to any button presses, and it knows nothing about the current "state" of the phone. It must be explicitly told to do everything. This is actually a good thing for me, because I want complete control of the handset.
Display Layout
There are two main portions of the display: text and status indicators.
The status indicators are pretty straightforward: they can each be on or off. The 6 bars in the top right of the display are the signal strength indicator, and each bar can be individually controlled. Also interesting is that the "NO SVC" indicator is actually two separately controllable indicators ("NO" and "SVC"), even though they are always used together as a single indicator.
The text portion of the display is 2 rows of 7 characters. Each character is 5x7 pixels. Some commands can individually address each character position. The above photo shows the hexadecimal index of each position. The end of the bottom row is the starting point (index 0), increasing index to the left, then wrapping to the top row.
Backlight
Both the LCD screen and the buttons have backlighting. All backlighting is turned on/off together with the following commands:
Status Indicators
All of the status indicators can be individually turned on and off. There are also commands to turn ALL indicators on/off together.
Indicator | On | Off |
---|
ROAM | 80 | 81 |
PWR | 82 | 83 |
FCN | 84 | 85 |
HORN | 86 | 87 |
MUTE | 88 | 89 |
NO | 8A | 8B |
SVC | 8E | 8F |
Signal strength bar #1 | 90 | 91 |
Signal strength bar #2 | 92 | 93 |
Signal strength bar #3 | 94 | 95 |
Signal strength bar #4 | 96 | 97 |
Signal strength bar #5 | 98 | 99 |
Signal strength bar #6 | 9A | 9B |
IN USE | 9C | 9D |
All Indicators | BC | BD |
The signal strength indicator can also be set more conveniently in terms of a strength value from 0-6 (number of bars to display) using commands E0-E6. These commands appropriately turn all the signal strength indicators on/off to show the correct number of bars.
Signal Strength | Command |
---|
0 bars | E0 |
1 bar | E1 |
2 bars | E2 |
3 bars | E3 |
4 bars | E4 |
5 bars | E5 |
6 bars | E6 |
LCD Display Angle
The "display angle" of the text portion of the display is adjustable for optimal contrast depending on whether you are looking at the display with it facing directly toward you, or if the display is tilted more "up"/"away" from you. There are 8 possible angles, presented to the user as angles 1-8, where 8 is best for looking directly at the display, and lower values are better as you tilt the display further "up"/"away".
Commands for setting the display angle are C8-CF, but the order of angles is opposite of what is presented to the user. The raw numeric angle ranges from 0-7:
- [numeric angle] = 8 - [angle displayed to user]
- [angle displayed to user] = 8 - [numeric angle]
- Command to set angle = C8 + [numeric angle]
Clear/Fill Text Display
The normal method of clearing the text display is to send the ASCII "DEL" character (7F).
There is also a pair of commands for turning all pixels of the text display area on/off:
- All pixels on: BA
- All pixels off: BB
It's unclear whether there is any practical difference between using 7F and BB for clearing text, but 7F should probably be generally preferred because that's what the transceiver always uses.
Printing Text ("normal" printing)
Any "printable" character that is sent to the handset will be printed to the text display at the end of the second row (index 0), pushing all previously printed characters to the left (to a higher index), wrapping up onto the second row. If you print more than 14 characters to the display, then the first printed characters will be "pushed off" the beginning of the top row.
Printable characters include:
- All standard ASCII printable characters (20-7E), but with the following deviations:
- \ (5C) prints as ¥ (yen symbol)
- ` (60) prints as α (Greek alpha)
- ~ (7E) prints as → (right arrow)
- Special symbols (C0-C7):
- C0: Small up arrow (outline)
- C1: Small down arrow (outline)
- C2: Small up arrow (filled)
- C3: Small down arrow (filled)
- C4: Large up arrow (filled)
- C5: Large down arrow (filled)
- C6: Solid rectangle
- C7: Horizontal striped rectangle
Special printable characters (C0-C7):
Printing a Character to a Specific Location
The commands 01-0E will cause the next printable character to be printed at a specific index of the text display.
Command: 01 + [index]
For example, the command sequence 08 33 will cause an exclamation point to be printed at the end of the top row.
If that index lands within a section of text that was printed the "normal" way, then it replaces the previous character at that index and will continue to behave as normal printed text (will be pushed left along with surrounding characters as more text is printed "normally").
If that index lands beyond where "normal printing" has reached, then the precisely positioned character will remain at its specified index as more text is printed normally, until the normally printed text reaches the precisely positioned character. The precisely positioned character is then overwritten by the normally printed text.
Enable/Disable Text Display
The text portion of the display can be turned on/off. This can be useful if you need to print several characters to the display at once, and you don't want the user to see the display update with each new character: disable the text display, print all character, then enable the text display, so the user will see only one update. It is also overall quicker to write many characters while the text display is disabled.
- Text display on: B6
- Text display off: B7
NOTE: While the text display is off, there is nothing displayed in the text area (not even the text that was previously displayed), so the user may still notice a flicker of empty display between the old text and new text.
Blinking Text
A blinking option can be enabled that causes the entire text display to continuously blink on/off.
- Blinking on: B8
- Blinking off: B9
Note: The text display cannot be disabled while blinking is enabled. The blinking behavior will automatically re-enable the text display.
Blinking Cursor
Warning: This is a bit buggy/awkward, but could be used with care and workarounds.
A blinking cursor can be positioned at any index of the text display using commands D0-DD (D0 + [index]).
The blinking cursor alternates between a solid rectangle and whatever character is currently printed at the same index.
Any of the following will remove/disable the blinking cursor:
- Command DE (seems to be explicit command for disabling the cursor).
- Printing any character to the screen in any way.
- Clearing the text display.
- Disabling the text display.
Bug #1: After flashing cursor position is set higher than 6 (D7-DD), positioning of the blinking cursor seems to become corrupted in very strange ways until a character is printed to the display. You can initially reliably position/reposition the cursor anywhere in the 0-6 index range as much as you want, but you can only reliably position the cursor in the 7-D range once. And afterward it is also impossible to position the blinking cursor in the 0-6 range without printing a character to the display first.
Bug #2: If no text has been printed to the display yet since the last clearing of text, then the cursor cannot be placed at indexes 0-6. The cursor can be placed at indexes 7-D in this situation, but then Bug #1 applies, and there's still no way to move the cursor into any index 0-6.
Audio Control
The ear speaker, loud speaker, and microphone can all be individually turned on/off. There is also a "master" audio enable/disable that must be on in order for any of the individual items to actually be enabled.
The on/off status of each individual item is retained while the master audio enable is off.
Note: There is only one source of analog audio going into the handset. These audio controls must be used to control which speaker the audio is sent to.
Audio Item | On | Off |
---|
Master audio enable | B4 | B5 |
Microphone | BE | BF |
Loud speaker | EB | EC |
Ear speaker | ED | EE |
Initial Conditions
When the handset initially powers on, it has the following initial conditions:
- Backlight is off.
- All status indicators are off.
- Text display is clear.
- Text display is enabled (any printed characters will appear immediately).
- Display angle numeric value is 0 (what is normally presented to the user as angle 8).
- Blinking text is disabled.
- Blinking cursor is disabled.
- All audio is off.
Observed Patterns
Here's some patterns I observed about how the original transceiver sends commands to the handset:
- When connected to an external power supply, the backlight and master audio remain on continuously.
- When running on battery power, the backlight and master audio turn on with each button press, then remain on for 10 seconds after the last button press.
- Assumed to be a compromise between reduced power consumption and instant/clear response for audio. A quick button press will often fail to beep if the master audio is being switched on at the same time, and enabling master audio can produce a "pop" sound.
- The backlight and master audio remain on the entire time the handset is off-hook, even when on battery power.
- There's a lot of simplicity/laziness in how commands are crafted. For example, every button press causes the commands to turn the backlight and master audio on, turn the ear speaker and microphone off, and turn the loudspeaker on, even if everything is already in that state.
- When the user is typing a number, each new digit is simply printed to the display, allowing the normal printing behavior to push previously typed digits to the left.
- When the user uses the CLR button to "backspace" (delete the last digit), the entire text display is cleared (7F) and all digits are re-printed to the display, except for the last digit that was deleted.