-
Notifications
You must be signed in to change notification settings - Fork 0
/
ATL_I2C_LCD16X2.Z80
333 lines (286 loc) · 7.4 KB
/
ATL_I2C_LCD16X2.Z80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
;------------------------------------
;SERIAL LCD 16X2
;// COMMANDS
GLOBAL LCD16_INIT
GLOBAL LCD16_NODISP
GLOBAL LCD16_DISP
GLOBAL LCD16_CLR
GLOBAL LCD16_PRINT
GLOBAL LCD16_PRCHR
GLOBAL LCD16_HOME
GLOBAL LCD16_SETCURS
GLOBAL LCD16_CURSOFF
GLOBAL LCD16_CURSON
GLOBAL LCD16_BLINKOFF
GLOBAL LCD16_BLINKON
GLOBAL LCD16_SCRLEFT
GLOBAL LCD16_SCRRIGHT
GLOBAL LCD16_MOVLEFT
GLOBAL LCD16_MOVRIGHT
LCDADDR EQU $27 ;$3F
BACKLIGHTPIN EQU 3
BACKLIGHTPINMASK EQU 1.SHL.BACKLIGHTPIN
LCD_NOBACKLIGHT EQU 0x00
LCD_BACKLIGHT EQU 0xFF
EN EQU 2 ;6 // Enable bit
RW EQU 1 ;5 // Read/Write bit
RS EQU 0 ;4 // Register select bit
D4 EQU 4 ;0
D5 EQU 5 ;1
D6 EQU 6 ;2
D7 EQU 7 ;3
;// LCD Commands
;// ---------------------------------------------------------------------------
LCD_CLEARDISPLAY EQU 0x01
LCD_RETURNHOME EQU 0x02
LCD_ENTRYMODESET EQU 0x04
LCD_DISPLAYCONTROL EQU 0x08
LCD_CURSORSHIFT EQU 0x10
LCD_FUNCTIONSET EQU 0x20
LCD_SETCGRAMADDR EQU 0x40
LCD_SETDDRAMADDR EQU 0x80
;// flags for display entry mode
;// ---------------------------------------------------------------------------
LCD_ENTRYRIGHT EQU 0x00
LCD_ENTRYLEFT EQU 0x02
LCD_ENTRYSHIFTINCREMENT EQU 0x01
LCD_ENTRYSHIFTDECREMENT EQU 0x00
;// flags for display on/off and cursor control
;// ---------------------------------------------------------------------------
LCD_DISPLAYON EQU 2;0x04
LCD_DISPLAYOFF EQU 0x00
LCD_CURSORON EQU 1;0x02
LCD_CURSOROFF EQU 0x00
LCD_BLINKON EQU 0;0x01
LCD_BLINKOFF EQU 0x00
;// flags for display/cursor shift
;// ---------------------------------------------------------------------------
LCD_DISPLAYMOVE EQU 0x08
LCD_CURSORMOVE EQU 0x00
LCD_MOVERIGHT EQU 0x04
LCD_MOVELEFT EQU 0x00
;// flags for function set
;// ---------------------------------------------------------------------------
LCD_8BITMODE EQU 0x10
LCD_4BITMODE EQU 0x00
LCD_2LINE EQU 0x08
LCD_1LINE EQU 0x00
LCD_5x10DOTS EQU 0x04
LCD_5x8DOTS EQU 0x00
;// Define COMMAND and DATA LCD Rs (used by send method).
;// ---------------------------------------------------------------------------
COMMAND EQU 0
LCD_DATA EQU 1
FOUR_BITS EQU 2
; @abstract Defines the duration of the home and clear commands
; @discussion This constant defines the time it takes for the home and clear
; commands in the LCD - Time in microseconds.
HOME_CLEAR_EXEC EQU 2000
; @abstract Backlight off constant declaration
; @discussion Used in combination with the setBacklight to swith off the
; LCD backlight. @set setBacklight
BACKLIGHT_OFF EQU 0
; @abstract Backlight on constant declaration
; @discussion Used in combination with the setBacklight to swith on the
; LCD backlight. @set setBacklight
BACKLIGHT_ON EQU 255
BACKLIGHTPIN EQU 3
BACKLIGHTPINMASK EQU 1.SHL.BACKLIGHTPIN
;A HAS THE VALUE FOR THE 4 BITS
;E HAS THE COMMAND OR DATA SIGNAL E=1 MEANS DATA
LCD16_WR4BITS: LD D, 0 ;PIN MAP VALUES FRO 8574 BIT 0-7
; Map the value ON A to LCD pin mapping
RRCA ;D4 = D0,D5=D1,D6=D2,D7=D3
JR NC, LWNXT1 ;BIT 0 NOT SET JR
SET D4, D
LWNXT1: RRCA
JR NC, LWNXT2 ;BIT 1 NOT SET JR
SET D5, D
LWNXT2: RRCA
JR NC, LWNXT3 ;BIT 2 NOT SET JR
SET D6, D
LWNXT3: RRCA
JR NC, LWNXT4 ;BIT 3 NOT SET JR
SET D7, D
LWNXT4: LD A, E
RRCA
JR NC, LWNXT5
SET RS, D
LWNXT5: ;HERE WE HAVE ALL BITS SET TO DRIVE 8574 PINS
LD A,(LCD_STSMASK) ;ADD THE BACKLIGHT MASKS
OR D
LD D,A
;WE SEND A PULSE TO WRITE THE 4BITS TO LCD
SET EN, D ;EN=HIGH
LD A, D
CALL LCD16_I2CSEND
RES EN, D ;EN=LOW
LD A, D
CALL LCD16_I2CSEND
RET
;A HAS THE BYTE TO SEND
LCD16_I2CSEND: PUSH DE
PUSH HL
LD HL, BUFFER
LD (HL), A
LD D, LCDADDR
LD BC, 1
CALL I2C_WRITE
POP HL
POP DE
RET
;A HAS THE COMMAND TO SEND
LCD16_COMMD: LD E, COMMAND
JR LCD16_SEND
;A HAS THE DATA TO SEND
LCD16_DATA: LD E, LCD_DATA
;A HAS THE VALUE FOR THE 4 BITS
;E HAS THE COMMAND OR DATA SIGNAL E=1 MEANS DATA E=0 MEANS COMMAND E=2 IS FOUR_BITS
LCD16_SEND: LD D, A ;SAVE A FOR LATER USE
LD A, E
RRCA
JR C, ISCMDDATA
RRCA
JR NC, ISCMDDATA
;FOUR BITS
LD E, COMMAND ;SEND 4 BITS AS COMMAND E=0
JR LCSD_4BIT
ISCMDDATA: LD A, D
SRL A
SRL A
SRL A
SRL A
PUSH DE
CALL LCD16_WR4BITS ;HIGH 4 BITS FIRST
POP DE
LCSD_4BIT: LD A, D
AND $0F
CALL LCD16_WR4BITS ;LOW 4 BITS NEXT
RET
@LCD16_INIT: LD A, 3 ;SET LCD TO 4BIT MODE
LD E, FOUR_BITS
CALL LCD16_SEND
LD BC, $3000
CALL PAUSE_LOOP ;DELAY 4,5ms
LD A, 3
LD E, FOUR_BITS
CALL LCD16_SEND
LD BC, $3000
CALL PAUSE_LOOP ;DELAY 4,5ms
LD A, 3
LD E, FOUR_BITS
CALL LCD16_SEND
LD BC, $3000
CALL PAUSE_LOOP ;DELAY 4,5ms
LD A, 2 ;PUT 4 BIT MODE
LD E, FOUR_BITS
CALL LCD16_SEND
LD BC, $3000
CALL PAUSE_LOOP ;DELAY 4,5ms
;finally, set # lines, font size, etc.
LD A, LCD_FUNCTIONSET OR LCD_2LINE
CALL LCD16_COMMD
LD A, LCD_DISPLAYON OR LCD_CURSOROFF OR LCD_BLINKOFF
LD (LCD_DSPCTRL), A
CALL LCD16_DISP
CALL LCD16_CLR
LD A, LCD_ENTRYLEFT OR LCD_ENTRYSHIFTDECREMENT
LD (LCD_DSPMODE), A
OR LCD_ENTRYMODESET
CALL LCD16_COMMD
LD BC, $3000
CALL PAUSE_LOOP ;DELAY 4,5ms
CALL LCD16_BKLTON ;BACKLIGHT ON BY DEFAULT
RET
@LCD16_NODISP: LD A, (LCD_DSPCTRL)
RES LCD_DISPLAYON, A
LD (LCD_DSPCTRL), A
OR LCD_DISPLAYCONTROL
CALL LCD16_COMMD
RET
@LCD16_DISP: LD A, (LCD_DSPCTRL)
SET LCD_DISPLAYON, A
LD (LCD_DSPCTRL), A
OR LCD_DISPLAYCONTROL
CALL LCD16_COMMD
RET
LCDDELAY: LD BC, HOME_CLEAR_EXEC
LCLR_AGN1: PUSH BC
CALL DELAYMICRO
POP BC
DEC C
JP PO, LCLR_AGN1
RET
@LCD16_CLR: LD A, LCD_CLEARDISPLAY ;clear display, set cursor position to zero
CALL LCD16_COMMD
CALL LCDDELAY
RET
;HL POINTS TO ZERO TERMINATED STRING
@LCD16_PRINT: LD A, (HL)
CP 0
RET Z
CALL LCD16_DATA
INC HL
JR LCD16_PRINT
;A HAS THE CHAR TO PRINT
@LCD16_PRCHR: CALL LCD16_DATA
RET
@LCD16_HOME: LD A, LCD_RETURNHOME
CALL LCD16_COMMD
CALL LCDDELAY
RET
; D HAS THE COLUMN E HAS THE ROW
ROWOFFSET: DB $00,$40,$14,$54
@LCD16_SETCURS: LD B, 0
LD C, E
LD HL, ROWOFFSET
ADD HL, BC
LD A, (HL)
ADD D
OR LCD_SETDDRAMADDR
CALL LCD16_COMMD
RET
@LCD16_CURSOFF: LD A, (LCD_DSPCTRL)
RES LCD_CURSORON, A
LD (LCD_DSPCTRL), A
OR LCD_DISPLAYCONTROL
CALL LCD16_COMMD
RET
@LCD16_CURSON: LD A, (LCD_DSPCTRL)
SET LCD_CURSORON, A
LD (LCD_DSPCTRL), A
OR LCD_DISPLAYCONTROL
CALL LCD16_COMMD
RET
@LCD16_BLINKOFF: LD A, (LCD_DSPCTRL)
RES LCD_BLINKON, A
LD (LCD_DSPCTRL), A
OR LCD_DISPLAYCONTROL
CALL LCD16_COMMD
RET
@LCD16_BLINKON: LD A, (LCD_DSPCTRL)
SET LCD_BLINKON, A
LD (LCD_DSPCTRL), A
OR LCD_DISPLAYCONTROL
CALL LCD16_COMMD
RET
@LCD16_SCRLEFT: LD A, LCD_CURSORSHIFT OR LCD_DISPLAYMOVE OR LCD_MOVELEFT
CALL LCD16_COMMD
RET
@LCD16_SCRRIGHT: LD A, LCD_CURSORSHIFT OR LCD_DISPLAYMOVE OR LCD_MOVERIGHT
CALL LCD16_COMMD
RET
@LCD16_MOVLEFT: LD A, LCD_CURSORSHIFT OR LCD_CURSORMOVE OR LCD_MOVELEFT
CALL LCD16_COMMD
RET
@LCD16_MOVRIGHT: LD A, LCD_CURSORSHIFT OR LCD_CURSORMOVE OR LCD_MOVERIGHT
CALL LCD16_COMMD
RET
@LCD16_BKLTON: LD A, BACKLIGHTPINMASK AND LCD_BACKLIGHT
LD (LCD_STSMASK),A
CALL LCD16_I2CSEND
RET
@LCD16_BKLTOFF: LD A, BACKLIGHTPINMASK AND LCD_NOBACKLIGHT
LD (LCD_STSMASK),A
CALL LCD16_I2CSEND
RET