Een collega gebruikte Picaxe voor zijn projecten. Hij is nu een tijdje met pensioen en er werd me gevraagd om zijn job over te nemen. Aangezien er een hoop Picaxe controllers voor handen zijn ben ik ermee aan de slag gegaan om een realytester te ontwikkelen. Ik ben enkele jaren een Arduino-gebruiker en dus niet echt vertrouwd met Basic.
Ik wil eenvoudigweg een LCD-display aansturen en zoals gebruikelijk test ik een code uit met de bekende woorden "Hello World". De voorbeeldprogramma's maken gebruik van een seriële of een I2C communicatie. Maar zo'n display hebben we dan weer niet voorradig. Nu gebruik ik een courante LCD met HD44780 controller die ik steeds met mijn Arduino gebruik. Het display wordt met 4 databits aangestuurd. De microcontroller is een picaxe20x2 of een picaxe20m2 (ik probeer ze alletwee) Het eindresultaat is geen Hello World op het display maar 2 volledige lijnen met blokjes van 5*8 dots met daartussen een lijn met blokjes van 5*3. Ik heb in de initialisatie cyclus al verschillende instellingen gewijzigd, maar het resultaat blijft hetzelfde. Het lijkt of het LCD blokjes van 5*11 wil weergeven. (BTW het LCD is 20 characters bij 4 lijnen)
Hieronder het programmaatje dat ik heb geschreven. Hopelijk is er iemand die mijn fout opmerkt
pic basic code:
'driving a 20*4 LCD with HD44780 controller
symbol EN = B.2 ;controlsignals
symbol RS = B.3
symbol db4 = B.4 ;databits LSB
symbol db5 = B.5
symbol db6 = B.6
symbol db7 = B.7 ;databits MSB
;symbol rscmdmask = %00000000
;symbol rsdatmask = %00000100
symbol chars = b0
symbol LCDdata = b1
symbol rsbit = b2
DirsB = %11111100
'EEPROM value and text
' Nibble command - to initialize 4bit mode
EEPROM 0, ($33);($33) ;%0011---- %0011----
EEPROM 1, ($32);($32) ;%0011---- %0010----
'Byte command to configure LCD
'initialisation
EEPROM 2, (%00100000) ;%001L NF00 Display format
;L : 0 = 4bit mode 1 = 8bit mode
;N : 0 = 1 line 1 = 2 lines
;F : 0 = 5*8 dots 1 = 5*11 dots
EEPROM 3, (%00001111) ;%0000 1DCB Display On
;D : 0 = display off 1 = display on
;C : 0 = cursor off 1 = cursor on
;B : 0 = no blink 1 = blink
EEPROM 4, (%00000110) ;%0000 01IS Cursor move
;I : 0 = decrement 1 = increment
;S : 0 = cursor move 1 = display shift
EEPROM 5, ($01);($01) ; clear screen
'Messages
EEPROM 6, ("Hello")
EEPROM 11, ("World")
PowerOnReset:
gosub InitLCD
Main:
LCDdata = %00001111 ;Display on
clearscreen:
LCDdata = %01
gosub SendCmdByte
MoveCursorToStartOfFirstLine:
LCDdata = $80
Gosub SendCmdByte
DisplayTopLine:
For chars = 6 to 10
Read chars, LCDdata
Gosub SendDataByte
Next
MoveCursorToStartOfSecondLine:
LCDdata = $94
Gosub SendCmdByte
DisplayBottomLine:
For chars = 11 to 16
read chars, LCDdata
gosub SendDataByte
Next
wait 5 ;wait 5 seconds
LCDdata = %00001011 ;display off
gosub SendCmdByte
wait 1
goto main
End
InitLCD:
for chars = 0 to 5
read chars, LCDdata ;read data from eeprom and store
;in LCDdata
gosub sendInitCmdByte ;send command to display
next
Return
SendInitCmdByte:
Pause 150
SendCmdByte:
RSbit = $00 ; RS is set for command
SendDataByte:
PinsB = LCDdata & %11110000 | RSbit ;put MSB out first
pulsout EN, 150 ;Give 10msec pulse on Enable
pause 150
PinsB = LCDdata * %00010000 | RSbit ;put LSB out second
Pulsout EN, 150
RSbit = $04 ;send to dataregiter next
Return