| Custom Characters for the ByVac 20x4 IASI-2 | |
|
The code below shows how to program a character with PicAxe Basic (in this example, character 0x03) and display it
;===========================================
;Custom characters for the ByVac 20x4 IASI-2
;===========================================
;The following is adapted from code by 'hippy' at http://www.picaxeforum.co.uk/
SYMBOL abyte = b0
SYMBOL nibble = b1
hsersetup B9600_4, %10000 ;Minimum rate is 9600
hserout 0, (13) : pause 100 ;so use hserout not serout.
hserout 0, (13) : pause 100 ;Get auto-baud rate (2 x cr)
hserout 0, ("ac1", 13) : pause 500 ;and initialize LCD
;The ByVac IASI-2-LCD serial BV4108 module uses a 'terminal-friendly' syntax using
;(predominantly) ASCII-printable/keyboard-accessible characters for its commands and data formats.
;
;As the module can support multiple devices on the same serial connection, the first byte
;of any command or data is the address of the device. The default address is $61 (keyboard char 'a').
;
;The second byte determines whether we are sending a command ('c') or data ('d'). So, sending the
;string,"adA", 13 will send the literal ASCII characters $61 $64 $41, $0d as data 'A' to the display.
;
;Confusingly, commands are sent slightly differently. They begin with "ac" (where 'a' is the device
;address and 'c' means a command is to follow) but the actual command value has to be in the form of an
;ASCII hexadecimal text string.
;
;Commands typed at the keyboard or 'hard-coded' in Picaxe code (such as "acc0", 13) will work correctly
;but,in cases where the command value is more easily calculated on the fly and needs to be assigned to a
;Picaxe variable, the required ASCII text value of each HEX character needs to be calculated and sent
;on the fly as well.
;
;Although PICAXE BASIC has the '#' variable prefix to print the contents of a byte as if it were an
;ASCII decimal numeric string (instead of printing the literal ASCII character that is represented by
;the variable's value), it doesn't have a similar facility to print a byte as an ASCII Hex numeric string.
;SendCmdByte - very slightly adapted from code by 'hippy' on the Picaxe forums - does just that.
abyte = 3 * 8 OR $40 ;programmable characters start at $40. Each
;character occupies 8 bytes. So char 3 starts
;at CGRAM address 3 * 8 OR $40 (= $58)
gosub SendCmdByte ;Set LCD address pointer to CGRAM address $58
;Create custom character
abyte = %111111 : gosub SendDataByte ; #####
abyte = %110101 : gosub SendDataByte ; #-#-#
abyte = %111111 : gosub SendDataByte ; #####
abyte = %111111 : gosub SendDataByte ; #####
abyte = %101010 : gosub SendDataByte ; -#-#-
abyte = %101010 : gosub SendDataByte ; -#-#-
abyte = %111011 : gosub SendDataByte ; ##-##
abyte = %100000 : gosub SendDataByte ;
;Reset display to start of Line 1
hserout 0,("ac80", 13) ;in normal DDRAM.
main:
pause 1000
abyte = $03 + 8 ;Display User Defined Character 3.
;Some values between 0 - 8 are used for LCD
;system-wide commands so use the character's
;"twin" at CGRAM position + 8
gosub SendDataByte
goto main
SendDataByte:
hserout 0,("ad", abyte, 13)
return
SendCmdByte:
;The following is adapted from 'hippy' at http://www.picaxeforum.co.uk/
;It converts the single character address byte ($58 in this case) into two ASCII hex text characters
;as required by the ByVac Controller. Here, it sends "ac", "5" followed by "8", 13 instead
;of simply sending 'X' - the ASCII representation of $58
nibble = abyte / $10 + "0"
if nibble > "9" then : nibble = nibble + 7 : endif
hserout 0, ("ac", nibble) ;Send. No 'cr' yet as we still need to
;convert and send the low nibble.
nibble = abyte & $0F + "0"
if nibble > "9" then : nibble = nibble + 7 : endif
hserout 0, (nibble, 13)
return
| |