Previous 199869 Revisions Next

r20349 Saturday 19th January, 2013 at 19:47:24 UTC by Sandro Ronco
(MESS) hd44780: added 4-bit interface mode. (nw)
[src/mess/video]hd44780.c hd44780.h

trunk/src/mess/video/hd44780.c
r20348r20349
33        Hitachi HD44780 LCD controller
44
55        TODO:
6        - 4-bit mode
76        - 5x10 chars
87        - dump internal CGROM
98
r20348r20349
8786   save_item( NAME(m_blink));
8887   save_item( NAME(m_ddram));
8988   save_item( NAME(m_cgram));
90
89   save_item( NAME(m_nibble));
90   save_item( NAME(m_data_latch));
9191}
9292
9393
r20348r20349
115115   m_char_size = 0;
116116   m_disp_shift = 0;
117117   m_blink = 0;
118   m_nibble = false;
119   m_data_latch = 0;
118120
119121   set_busy_flag(1520);
120122}
r20348r20349
223225
224226WRITE8_MEMBER(hd44780_device::control_write)
225227{
226   if (BIT(data, 7)) // Set DDRAM Address
228   if (m_data_len == 0)
227229   {
230      m_nibble = !m_nibble;
231
232      if (m_nibble)
233      {
234         m_data_latch = data & 0xf0;
235         return;
236      }
237      else
238      {
239         m_data_latch |= ((data>>4) & 0x0f);
240      }
241   }
242   else
243   {
244      m_data_latch = data;
245   }
246
247   if (BIT(m_data_latch, 7)) // Set DDRAM Address
248   {
228249      m_ac_mode = 0;
229      m_ac = data & 0x7f;
250      m_ac = m_data_latch & 0x7f;
230251      m_cursor_pos = m_ac;
231252      set_busy_flag(37);
232253   }
233   else if (BIT(data, 6)) // Set CGRAM Address
254   else if (BIT(m_data_latch, 6)) // Set CGRAM Address
234255   {
235256      m_ac_mode = 1;
236      m_ac = data & 0x3f;
257      m_ac = m_data_latch & 0x3f;
237258      set_busy_flag(37);
238259   }
239   else if (BIT(data, 5)) // Function Set
260   else if (BIT(m_data_latch, 5)) // Function Set
240261   {
241262      // datasheet says you can't change char size after first function set without altering 4/8 bit mode
242      if (BIT(data, 4) != m_data_len)
243         m_char_size = BIT(data, 2);
263      if (BIT(m_data_latch, 4) != m_data_len)
264         m_char_size = BIT(m_data_latch, 2);
244265
245      m_data_len = BIT(data, 4);
246      m_num_line = BIT(data, 3);
266      m_data_len = BIT(m_data_latch, 4);
267      m_num_line = BIT(m_data_latch, 3);
247268      set_busy_flag(37);
248269   }
249   else if (BIT(data, 4)) // Cursor or display shift
270   else if (BIT(m_data_latch, 4)) // Cursor or display shift
250271   {
251      UINT8 direct = (BIT(data, 2)) ? +1 : -1;
272      UINT8 direct = (BIT(m_data_latch, 2)) ? +1 : -1;
252273
253      if (BIT(data, 3))
274      if (BIT(m_data_latch, 3))
254275         m_disp_shift += direct;
255276      else
256277      {
r20348r20349
260281
261282      set_busy_flag(37);
262283   }
263   else if (BIT(data, 3)) // Display on/off Control
284   else if (BIT(m_data_latch, 3)) // Display on/off Control
264285   {
265      m_display_on = BIT(data, 2);
266      m_cursor_on = BIT(data, 1);
267      m_blink_on = BIT(data, 0);
286      m_display_on = BIT(m_data_latch, 2);
287      m_cursor_on = BIT(m_data_latch, 1);
288      m_blink_on = BIT(m_data_latch, 0);
268289
269290      set_busy_flag(37);
270291   }
271   else if (BIT(data, 2)) // Entry Mode set
292   else if (BIT(m_data_latch, 2)) // Entry Mode set
272293   {
273      m_direction = (BIT(data, 1)) ? +1 : -1;
294      m_direction = (BIT(m_data_latch, 1)) ? +1 : -1;
274295
275      m_shift_on = BIT(data, 0);
296      m_shift_on = BIT(m_data_latch, 0);
276297
277298      set_busy_flag(37);
278299   }
279   else if (BIT(data, 1)) // return home
300   else if (BIT(m_data_latch, 1)) // return home
280301   {
281302      m_ac = 0;
282303      m_cursor_pos = 0;
r20348r20349
285306      m_disp_shift = 0;
286307      set_busy_flag(1520);
287308   }
288   else if (BIT(data, 0)) // clear display
309   else if (BIT(m_data_latch, 0)) // clear display
289310   {
290311      m_ac = 0;
291312      m_cursor_pos = 0;
r20348r20349
299320
300321READ8_MEMBER(hd44780_device::control_read)
301322{
302   return (m_busy_flag << 7) | (m_ac & 0x7f);
323   if (m_data_len == 0)
324   {
325      m_nibble = !m_nibble;
326
327      if (m_nibble)
328         return (m_busy_flag << 7) | (m_ac & 0x70);
329      else
330         return (m_ac<<4) & 0xf0;
331   }
332   else
333   {
334      return (m_busy_flag << 7) | (m_ac & 0x7f);
335   }
303336}
304337
305338void hd44780_device::update_ac(void) // m_data_bus_flag was left as global so old savestates will work
r20348r20349
324357      return;
325358   }
326359
360   if (m_data_len == 0)
361   {
362      m_nibble = !m_nibble;
363
364      if (m_nibble)
365      {
366         m_data_latch = data & 0xf0;
367         return;
368      }
369      else
370      {
371         m_data_latch |= ((data>>4) & 0x0f);
372      }
373   }
374   else
375   {
376      m_data_latch = data;
377   }
378
327379   if (m_ac_mode == 0)
328      m_ddram[m_ac] = data;
380      m_ddram[m_ac] = m_data_latch;
329381   else
330      m_cgram[m_ac] = data;
382      m_cgram[m_ac] = m_data_latch;
331383
332384   m_data_bus_flag = 1;
333385   update_ac();
r20348r20349
343395   else
344396      data = m_cgram[m_ac];
345397
398   if (m_data_len == 0)
399   {
400      m_nibble = !m_nibble;
401
402      if (m_nibble)
403         return data & 0xf0;
404      else
405         data = (data<<4) & 0xf0;
406   }
407
346408   m_data_bus_flag = 2;
347409   update_ac();
348410
trunk/src/mess/video/hd44780.h
r20348r20349
9696   UINT8 m_char_size;      //char size 5x8 or 5x10
9797
9898   UINT8 m_blink;
99
100   bool m_nibble;
101   UINT8 m_data_latch;
99102};
100103
101104// device type definition

Previous 199869 Revisions Next


© 1997-2024 The MAME Team