; AXE131 Serial 8x2 OLED using PICAXE-18M2
; http://www.picaxeforum.co.uk/showthread.php?30788-AXE131Y-firmware
; Only works on AXE131Y 8x2
; Thrown together in a rush from -
; AXE133 Serial LCD/OLED using PICAXE-18M2
; Emulates basic serial operation of the popular AXE033 module
; CPS, May 2011
; v2 18/01/2012
#picaxe 18M2
; Supported Commands
; 0-7, 8-15 CGRAM characters
; 16-252 normal ASCII characters, according to selected character map table
; 253, X display 8 character pre-saved message from EEPROM memory, X can be 0-15
; 254, X LCD command, X can be 0 to 255
; 255, X control outputs C.2, C.1, C.0 (via lower 3 bits of X)
; So, if using a backlit LCD with the active low transistor driver
; on output C.2, then 255,%000 switches backlight on and 255,%100 switches off
#define use_welcome ; display the welcome message upon power up
symbol baud = N2400_16 ; Serial baud rate 2400,N,8,1. Note main program runs at 16MHz
symbol spare0 = C.0 ; spare output 0
symbol spare1 = C.1 ; spare output 1
symbol spare2 = C.2 ; spare output 2 (or optional backlight)
symbol backlight = C.2 ; optional backlight control for backlit LCDs, active low
symbol RX = C.5 ; serial receive pin
symbol enable = C.6 ; LCD enable
symbol rs = C.7 ; LCD RS
; LCD data pins are on B.0 to B.7
; Store the 8 character user defined messages in EEPROM data memory
; First two messages are optionally used as welcome message
; 12345678
EEPROM $00, ("Top Line") ; Msg 0
EEPROM $08, ("Bot Line") ; Msg 1
EEPROM $10, ("Msg 2 ")
EEPROM $18, ("Msg 3 ")
EEPROM $20, ("Msg 4 ")
EEPROM $28, ("Msg 5 ")
EEPROM $30, ("Msg 6 ")
EEPROM $38, ("Msg 7 ")
EEPROM $40, ("Msg 8 ")
EEPROM $48, ("Msg 9 ")
EEPROM $50, ("Msg 10 ")
EEPROM $58, ("Msg 11 ")
EEPROM $60, ("Msg 12 ")
EEPROM $68, ("Msg 13 ")
EEPROM $70, ("Msg 14 ")
EEPROM $78, ("Msg 15 ")
;initialise LCD
init:
gosub LCD_init ; initialise LCD
; display welcome message if desired
#ifdef use_welcome
let b1 = 0 ; message 0 on top line
gosub msg ; do it
low rs ; command mode
let pinsB = 192 ; move to line 2, instruction 192
pulsout enable,1 ; pulse the enable pin to send data.
high rs ; character mode again
let b1 = 1 ; message 1 on bottom line
gosub msg ; do it
#endif
; main program loop, runs at 16MHz
main:
serin RX,baud,b1 ; wait for the next byte
; NB keep character mode test as first item in this list to optimise speed
if b1 < 253 then
let pinsB = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
goto main ; quickly loop back to top
else if b1 = 254 then
low rs ; change to command mode for next character
serin RX,baud,b1 ; wait for the command byte
let pinsB = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
high rs ; back to character mode
goto main ; quickly loop back to top
else if b1 = 253 then
serin RX,baud,b1 ; wait for the next byte
gosub msg ; do the 16 character message
goto main ; back to top
else ; must be 255
serin RX,baud,b1 ; wait for the next byte
let pinsC = b1 & %00000111 | %10000000
; output the data on C.0 to C.1, keep RS high
goto main ; back to top
end if
; power on LCD initialisation sub routine
LCD_init:
let dirsC = %11000111 ; PortC 0,1,2,6,7 all outputs
let dirsB = %11111111 ; PortB all outputs
; Winstar OLED Module Initialisation
; according to WS0010 datasheet (8 bit mode)
pause 500 ; Power stabilistation = 500ms
; Function set - select only one of these 4 character table modes
;let pinsB = %00111000 ; 8 bit, 2 line, 5x8 , English_Japanese table
let pinsB = %00111001 ; 8 bit, 2 line, 5x8 , Western_European table1
;let pinsB = %00111010 ; 8 bit, 2 line, 5x8 , English_Russian table
;let pinsB = %00111011 ; 8 bit, 2 line, 5x8 , Western_European table2
pulsout enable,1 ;
let pinsB = %00001100 ; Display on, no cursor, no blink
pulsout enable,1
let pinsB = %00000001 ; Display Clear
pulsout enable,1
pause 7 ; Allow 6.2ms to clear display
setfreq m16 ; now change to 16Mhz
let pinsB = %00000010 ; Return Home
pulsout enable,1
let pinsB = %00000110 ; Entry Mode, ID=1, SH=0
pulsout enable, 1
high rs ; Leave in character mode
return
; display message from EEPROM sub routine
; message number 0-15 must be in b1 when called
; uses (alters) b1, b2, b3, b4
msg:
let b2 = b1 & %00001111 * 8
; EEPROM start address is 0 to 15 multiplied by 16
let b3 = b2 + 8 - 1 ; end address is start address + (line_length - 1)
for b4 = b2 to b3 ; for 8 times
read b4,b1 ; read next character from EEPROM data memory into b1
let pinsB = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
next b4 ; next loop
return