Rampz
Well-known member
Hello All
I thought best to start a new thread to do as the title says, seems to me that it nay be of interest in the first part for people that want to drive the OLED directly with a X2 picaxe, in my case the 28X2 and get the time displayed from the DS3231
I found the following code to atleast display something from the picaxe i want to use, its a 2 line in this setup i think and i want to use the 4 line, the code below is from a previous post by cpedw aug13 2021, seems to be a good starting point. I will use his post as a starting point to get the display to work and then add the clock module
I thought best to start a new thread to do as the title says, seems to me that it nay be of interest in the first part for people that want to drive the OLED directly with a X2 picaxe, in my case the 28X2 and get the time displayed from the DS3231
I found the following code to atleast display something from the picaxe i want to use, its a 2 line in this setup i think and i want to use the 4 line, the code below is from a previous post by cpedw aug13 2021, seems to be a good starting point. I will use his post as a starting point to get the display to work and then add the clock module
Code:
; AXE133 Serial LCD/OLED using PICAXE-28X2
; Emulates basic serial operation of the popular AXE033 module
; CPS, May 2011
; v2 18/01/2012
; DW Aug 2021
#picaxe 28X2
; ********************************************
; Note you must uncomment just one of these two options
; depending on whether you have an LCD or OLED module
#define use_OLED
;#define use_LCD
; ********************************************
#define use_welcome ; display the welcome message upon power up
; Supported Commands
; 0-7, 8-15 CGRAM characters
; 16-252 normal ASCII characters, according to selected character map table
; 253, X display 16 character pre-saved message from EEPROM memory, X can be 0-15
; 254, X LCD command, X can be 0 to 255
symbol line_length = 16 ; change to 20 for displays with 20 character lines
symbol baud = N2400_16 ; Serial baud rate 2400,N,8,1.
'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 RX = A.0 ; serial receive pin leg 2. Don't use with integral frequency meter
symbol enable = B.0 ; OLED/LCD enable leg 21
symbol rs = A.4 ; OLED/LCD RS leg 7
; OLED/LCD data pins are on C.0 to C.7
; Store the 16 character user defined messages in EEPROM data memory
; First two messages are optionally used as welcome message
; If using a display with 20 characters you will need to edit
; the start addresses to be multiples of 20 (currently at 16)
; and add 4 characters to each message.
; Please remember 4 line displays always use the strange 1-3-2-4 layout.
#ifdef use_OLED
EEPROM $00, ("Serial OLED 28X2") ; store msg in the EEPROM memory
#else
EEPROM $00, (" Serial LCD 28X2") ; store msg in the EEPROM memory
#endif
EEPROM $10, (" picaxe display ") ; store msg in the EEPROM memory
EEPROM $20, ("This is msg 2 ") ; store msg in the EEPROM memory
EEPROM $30, ("This is msg 3 ") ; store msg in the EEPROM memory
EEPROM $40, ("This is msg 4 ") ; store msg in the EEPROM memory
EEPROM $50, ("This is msg 5 ") ; store msg in the EEPROM memory
EEPROM $60, ("This is msg 6 ") ; store msg in the EEPROM memory
EEPROM $70, ("This is msg 7 ") ; store msg in the EEPROM memory
EEPROM $80, ("This is msg 8 ") ; store msg in the EEPROM memory
EEPROM $90, ("This is msg 9 ") ; store msg in the EEPROM memory
EEPROM $A0, ("This is msg 10 ") ; store msg in the EEPROM memory
EEPROM $B0, ("This is msg 11 ") ; store msg in the EEPROM memory
EEPROM $C0, ("This is msg 12 ") ; store msg in the EEPROM memory
EEPROM $D0, ("This is msg 13 ") ; store msg in the EEPROM memory
EEPROM $E0, ("This is msg 14 ") ; store msg in the EEPROM memory
EEPROM $F0, ("This is msg 15 ") ; store msg in the EEPROM memory
;initialise OLED/LCD
SETFREQ M4
init:
gosub LCD_init ; initialise LCD
; display welcome message if desired
#ifdef use_welcome
low rs ; command mode
let pinsC = 128 ; move to line 1
pulsout enable,1 ; pulse the enable pin to send data.
high rs ; character mode again
let b1 = 0 ; message 0 on top line
gosub msg ; do it
low rs ; command mode
let pinsC = 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 pinsC = 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 pinsC = 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 Disable the spare outputs
' 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
goto main
; power on LCD initialisation sub routine
LCD_init:
let dirsA = %00010000 ; PortA 4 output
let dirsB = %00000001 ; PortB 0 output
let dirsC = %11111111 ; PortC all outputs
#ifdef use_OLED
; 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 pinsC = %00111000 ; 8 bit, 2 line, 5x8 , English_Japanese table
let pinsC = %00111001 ; 8 bit, 2 line, 5x8 , Western_European table1
;let pinsC = %00111010 ; 8 bit, 2 line, 5x8 , English_Russian table
;let pinsC = %00111011 ; 8 bit, 2 line, 5x8 , Western_European table2
pulsout enable,1 ;
let pinsC = %00001100 ; Display on, no cursor, no blink
pulsout enable,1
let pinsC = %00000001 ; Display Clear
pulsout enable,1
pause 7 ; Allow 6.2ms to clear display
setfreq m16 ; now change to 16Mhz
let pinsC = %00000010 ; Return Home
pulsout enable,1
let pinsC = %00000110 ; Entry Mode, ID=1, SH=0
pulsout enable, 1
#else
; Standard LCD Module Initialisation
pause 15 ; Wait 15ms for LCD to reset.
let pinsC = %00110000 ; 8 bit, 2 line
pulsout enable,1 ; Send data by pulsing enable
pause 5 ; Wait 5 ms
pulsout enable,1 ; Send data 48 again
pulsout enable,1 ; Send data 48 again
setfreq m16 ; now change to 16Mhz
let pinsC = %00111000 ; LCD - 8 bit, 2 line, 5x8
pulsout enable,1
let pinsC = %00000001 ; Clear Display
pulsout enable,1
pause 8 ; 8 = 2ms at 16MHz
let pinsC = %00000010 ; return home
pulsout enable,1
let pinsC = %00000110 ; Entry mode
pulsout enable,1
pause 1
let pinsC = %00001100 ; Display on, no cursor, no blink
pulsout enable,1
#endif
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 * line_length
; EEPROM start address is 0 to 15 multiplied by 16
let b3 = b2 + line_length - 1 ; end address is start address + (line_length - 1)
for b4 = b2 to b3 ; for 16 times
read b4,b1 ; read next character from EEPROM data memory into b1
let pinsC = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
next b4 ; next loop
return
; Check end user has defined just one type of display
#ifndef use_OLED
#ifndef use_LCD
#error "Oops - no OLED / LCD type defined at top of program!"
#endif
#endif
#ifdef use_OLED
#ifdef use_LCD
#error "Oops - both OLED / LCD types defined at top of program!"
#endif
#endif