1+ ' HD44780 - Text LCD
2+ ' ==================
3+ '
4+ ' This example demonstrates how to use the alphanumeric
5+ ' dot matrix liquid crystal display HD44780.
6+ '
7+ ' Connect the LCD to the IOIO-OTG board:
8+ '
9+ ' ------- ------ 1 (GND)
10+ ' IOIO | |HD44780 |
11+ ' PIN 41|-------|11 (DB4) ---
12+ ' PIN 42|-------|12 (DB5) | |
13+ ' PIN 43|-------|13 (DB6) |10K|<---3 (VEE)
14+ ' PIN 44|-------|14 (DB7) | |
15+ ' GND |-------| 5 (RW) ---
16+ ' PIN 45|-------| 6 (E) |
17+ ' PIN 46|-------| 4 (RS) 2 (VIN)
18+ ' GND |-------| 1 (GND)
19+ ' 5V |-------| 2 (VIN)
20+ '-------- --------
21+
22+ ' A potentiometer needs to be connected to the display
23+ ' to control the contrast of the display. If the display
24+ ' has a background light, connect power according to the
25+ ' data sheet to the pins 15 and 16.
26+ '
27+ ' Code based on https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
28+
29+
30+ '#########################################################
31+ '# Constant definition #
32+ '#########################################################
33+
34+ const LCD_CLEAR_DISPLAY = 0 x01
35+ const LCD_CURSOR_HOME = 0 x02
36+
37+ const LCD_SET_ENTRY = 0 x04
38+ const LCD_ENTRY_DECREASE = 0 x00
39+ const LCD_ENTRY_INCREASE = 0 x02
40+ const LCD_ENTRY_NOSHIFT = 0 x00
41+ const LCD_ENTRY_SHIFT = 0 x01
42+
43+ const LCD_SET_DISPLAY = 0 x08
44+ const LCD_DISPLAY_OFF = 0 x00
45+ const LCD_DISPLAY_ON = 0 x04
46+ const LCD_CURSOR_OFF = 0 x00
47+ const LCD_CURSOR_ON = 0 x02
48+ const LCD_BLINKING_OFF = 0 x00
49+ const LCD_BLINKING_ON = 0 x01
50+
51+ const LCD_SET_SHIFT = 0 x10
52+ const LCD_CURSOR_MOVE = 0 x00
53+ const LCD_DISPLAY_SHIFT = 0 x08
54+ const LCD_SHIFT_LEFT = 0 x00
55+ const LCD_SHIFT_RIGHT = 0 x04
56+
57+ const LCD_SET_FUNCTION = 0 x20
58+ const LCD_FUNCTION_4BIT = 0 x00
59+ const LCD_FUNCTION_8BIT = 0 x10
60+ const LCD_FUNCTION_1LINE = 0 x00
61+ const LCD_FUNCTION_2LINE = 0 x08
62+ const LCD_FUNCTION_5X7 = 0 x00
63+ const LCD_FUNCTION_5X10 = 0 x04
64+
65+ const LCD_SOFT_RESET = 0 x30
66+
67+ const LCD_SET_CGADR = 0 x40
68+
69+ const LCD_DDADR_LINE1 = 0 x00
70+ const LCD_DDADR_LINE2 = 0 x40
71+ const LCD_DDADR_LINE3 = 0 x10
72+ const LCD_DDADR_LINE4 = 0 x50
73+
74+ const LCD_GC_CHAR0 = 0
75+ const LCD_GC_CHAR1 = 1
76+ const LCD_GC_CHAR2 = 2
77+ const LCD_GC_CHAR3 = 3
78+ const LCD_GC_CHAR4 = 4
79+ const LCD_GC_CHAR5 = 5
80+ const LCD_GC_CHAR6 = 6
81+ const LCD_GC_CHAR7 = 7
82+
83+ const LCD_SET_DDADR = 0 x80
84+
85+ '#########################################################
86+ '# Main program #
87+ '#########################################################
88+
89+ import ioio
90+
91+ Print "Connect to HD44780"
92+ RS = ioio.openDigitalOutput( 46 )
93+ E = ioio.openDigitalOutput( 45 )
94+ DB4 = ioio.openDigitalOutput( 41 )
95+ DB5 = ioio.openDigitalOutput( 42 )
96+ DB6 = ioio.openDigitalOutput( 43 )
97+ DB7 = ioio.openDigitalOutput( 44 )
98+ ioio.waitForConnect( 10 )
99+ Print "Connection established"
100+
101+
102+ Init()
103+ LCD_Write( " Hello World" )
104+ LCD_Locate( 1 , 2 )
105+ LCD_Write( "-= SmallBASIC =-" )
106+ print "Done"
107+
108+
109+ end
110+
111+ '#########################################################
112+ '# Functions and subs #
113+ '#########################################################
114+
115+ sub Init()
116+
117+ RS.write( 0 )
118+ E.write( 0 )
119+ DB4.write( 0 )
120+ DB5.write( 0 )
121+ DB6.write( 0 )
122+ DB7.write( 0 )
123+
124+ delay( 50 )
125+
126+ ' Send soft-reset 3 time to initialize LCD
127+ Send4Bit(LCD_SOFT_RESET)
128+ delay( 5 )
129+ SendEnable()
130+ delay( 1 )
131+ SendEnable()
132+ delay( 1 )
133+
134+ ' Set 4-bit mode
135+ Send4Bit(LCD_SET_FUNCTION BOR LCD_FUNCTION_4BIT)
136+ delay( 5 )
137+
138+ ' 2 lines and 5x7 pixel in 4 bit mode
139+ SendCommand(LCD_SET_FUNCTION BOR LCD_FUNCTION_4BIT BOR LCD_FUNCTION_2LINE BOR LCD_FUNCTION_5X7)
140+ ' Display on, cursor off and blinking off
141+ SendCommand(LCD_SET_DISPLAY BOR LCD_DISPLAY_ON BOR LCD_CURSOR_OFF BOR LCD_BLINKING_OFF)
142+ ' Cursor increment no scrolling
143+ SendCommand(LCD_SET_ENTRY BOR LCD_ENTRY_INCREASE BOR LCD_ENTRY_NOSHIFT )
144+
145+ LCD_Cls()
146+ end
147+
148+ sub LCD_Write(Text)
149+ ' Write characters to lcd
150+ local length, t
151+ length = len(Text)
152+
153+ for i = 1 to length
154+ t = asc(mid(text, i, 1 ))
155+ SendData(t)
156+ next
157+ end
158+
159+ sub LCD_Cls()
160+ SendCommand(LCD_CLEAR_DISPLAY)
161+ SendCommand(LCD_CURSOR_HOME)
162+ end
163+
164+ sub LCD_Off()
165+ SendCommand(LCD_SET_DISPLAY BOR LCD_DISPLAY_OFF)
166+ end
167+
168+ sub LCD_On()
169+ SendCommand(LCD_SET_DISPLAY BOR LCD_DISPLAY_ON)
170+ end
171+
172+ sub LCD_Locate(x, y)
173+ local dat
174+
175+ if (x < 1 ) then x == 1
176+
177+ select case y
178+ case 1 ' 1. line
179+ dat = LCD_SET_DDADR + LCD_DDADR_LINE1 + x - 1
180+ case 2 ' 2. line
181+ dat = LCD_SET_DDADR + LCD_DDADR_LINE2 + x - 1
182+ case 3 ' 3. line
183+ dat = LCD_SET_DDADR + LCD_DDADR_LINE3 + x - 1
184+ case 4 ' 4. line
185+ dat = LCD_SET_DDADR + LCD_DDADR_LINE4 + x - 1
186+ case else
187+ return
188+ end select
189+
190+ SendCommand(dat)
191+ end
192+
193+ sub SendCommand(cmd)
194+ RS.write( 0 )
195+ SendByte(cmd)
196+ end
197+
198+ sub SendData(dat)
199+ RS.write( 1 )
200+ SendByte(dat)
201+ end
202+
203+ sub SendEnable()
204+ E.write( 1 )
205+ delay( 1 )
206+ E.write( 0 )
207+ delay( 1 )
208+ end
209+
210+ sub SendByte( byte )
211+ Send4Bit( byte ) ' Send high bits first
212+ Send4Bit( byte lshift 4 ) ' Send low bits
213+ end
214+
215+ sub Send4Bit( byte )
216+ DB7.write(GetBit( byte , 7 ))
217+ DB6.write(GetBit( byte , 6 ))
218+ DB5.write(GetBit( byte , 5 ))
219+ DB4.write(GetBit( byte , 4 ))
220+ SendEnable()
221+ end
222+
223+ func GetBit(value, bit)
224+ return (value rshift bit) BAND 1
225+ end
0 commit comments