HD44780-I2C.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*-------------------------------------------------------------------------------------------------
  2. * Wyświetlacz alfanumeryczny ze sterownikiem HD44780
  3. * Sterowanie w trybie 8-bitowym z odczytem flagi zajętości
  4. * Plik : HD44780-I2C.c
  5. * Mikrokontroler : Atmel AVR
  6. * Kompilator : avr-gcc
  7. * Autor : Radosław Kwiecień
  8. * Źródło : http://radzio.dxp.pl/hd44780/
  9. * Data : 24.03.2007
  10. * Modified: k4be, 2022 (I2C access mode)
  11. * ------------------------------------------------------------------------------------------------ */
  12. #include "HD44780-I2C.h"
  13. #include <avr/pgmspace.h>
  14. //-------------------------------------------------------------------------------------------------
  15. //
  16. // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
  17. //
  18. //-------------------------------------------------------------------------------------------------
  19. void _LCD_Write(unsigned char dataToWrite)
  20. {
  21. LCD_DATA_OUTPUT();
  22. expander_set_bit_no_send(LCD_RW_PORT, LCD_RW, 0);
  23. expander_set_bit_no_send(LCD_E_PORT, LCD_E, 1);
  24. exp_output[0] = dataToWrite;
  25. expander_write(0);
  26. expander_set_bit(LCD_E_PORT, LCD_E, 0);
  27. }
  28. //-------------------------------------------------------------------------------------------------
  29. //
  30. // Funkcja odczytu bajtu z wyświetacza (bez rozróżnienia instrukcja/dane).
  31. //
  32. //-------------------------------------------------------------------------------------------------
  33. unsigned char _LCD_Read(void)
  34. {
  35. unsigned char tmp = 0;
  36. LCD_DATA_INPUT();
  37. expander_set_bit_no_send(LCD_RW_PORT, LCD_RW, 1);
  38. expander_set_bit(LCD_E_PORT, LCD_E, 1);
  39. tmp = expander_read_byte(0, 0);
  40. expander_set_bit(LCD_E_PORT, LCD_E, 0);
  41. return tmp;
  42. }
  43. //-------------------------------------------------------------------------------------------------
  44. //
  45. // Funkcja zapisu rozkazu do wyświetlacza
  46. //
  47. //-------------------------------------------------------------------------------------------------
  48. void LCD_WriteCommand(unsigned char commandToWrite)
  49. {
  50. expander_set_bit(LCD_RS_PORT, LCD_RS, 0);
  51. _LCD_Write(commandToWrite);
  52. #ifdef LCD_WAIT_FOR_READY
  53. while(LCD_ReadStatus()&0x80);
  54. #endif
  55. }
  56. //-------------------------------------------------------------------------------------------------
  57. //
  58. // Funkcja odczytu bajtu statusowego
  59. //
  60. //-------------------------------------------------------------------------------------------------
  61. unsigned char LCD_ReadStatus(void)
  62. {
  63. expander_set_bit(LCD_RS_PORT, LCD_RS, 0);
  64. return _LCD_Read();
  65. }
  66. //-------------------------------------------------------------------------------------------------
  67. //
  68. // Funkcja zapisu danych do pamięci wyświetlacza
  69. //
  70. //-------------------------------------------------------------------------------------------------
  71. void LCD_WriteData(unsigned char dataToWrite)
  72. {
  73. expander_set_bit(LCD_RS_PORT, LCD_RS, 1);
  74. _LCD_Write(dataToWrite);
  75. #ifdef LCD_WAIT_FOR_READY
  76. while(LCD_ReadStatus()&0x80);
  77. #endif
  78. }
  79. //-------------------------------------------------------------------------------------------------
  80. //
  81. // Funkcja odczytu danych z pamięci wyświetlacza
  82. //
  83. //-------------------------------------------------------------------------------------------------
  84. unsigned char LCD_ReadData(void)
  85. {
  86. expander_set_bit(LCD_RS_PORT, LCD_RS, 1);
  87. return _LCD_Read();
  88. }
  89. //-------------------------------------------------------------------------------------------------
  90. //
  91. // Funkcja wyświetlenia napisu na wyswietlaczu.
  92. //
  93. //-------------------------------------------------------------------------------------------------
  94. void LCD_WriteText(const char * text)
  95. {
  96. while(*text)
  97. LCD_WriteData(*text++);
  98. }
  99. void LCD_WriteTextP(const char *text)
  100. {
  101. char a;
  102. while((a = pgm_read_byte(text++)))
  103. LCD_WriteData(a);
  104. }
  105. //-------------------------------------------------------------------------------------------------
  106. //
  107. // Funkcja ustawienia współrzędnych ekranowych
  108. //
  109. //-------------------------------------------------------------------------------------------------
  110. void LCD_GoTo(unsigned char x, unsigned char y)
  111. {
  112. LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
  113. }
  114. //-------------------------------------------------------------------------------------------------
  115. //
  116. // Funkcja czyszczenia ekranu wyświetlacza.
  117. //
  118. //-------------------------------------------------------------------------------------------------
  119. void LCD_Clear(void)
  120. {
  121. LCD_WriteCommand(HD44780_CLEAR);
  122. _delay_ms(2);
  123. }
  124. //-------------------------------------------------------------------------------------------------
  125. //
  126. // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
  127. //
  128. //-------------------------------------------------------------------------------------------------
  129. void LCD_Home(void)
  130. {
  131. LCD_WriteCommand(HD44780_HOME);
  132. _delay_ms(2);
  133. }
  134. //-------------------------------------------------------------------------------------------------
  135. //
  136. // Procedura inicjalizacji kontrolera HD44780.
  137. //
  138. //-------------------------------------------------------------------------------------------------
  139. void LCD_Initialize(void)
  140. {
  141. unsigned char i;
  142. LCD_DATA_OUTPUT();
  143. expander_set_bit_no_send(LCD_RS_PORT, LCD_RS, 0); // wyzerowanie linii RS
  144. expander_set_bit_no_send(LCD_E_PORT, LCD_E, 0); // wyzerowanie linii E
  145. expander_set_bit(LCD_RW_PORT, LCD_RW, 0);
  146. _delay_ms(100); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
  147. exp_output[0] = 0x3F;
  148. expander_write(0);
  149. for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
  150. {
  151. expander_set_bit(LCD_E, LCD_E, 1);
  152. expander_set_bit(LCD_E, LCD_E, 0);
  153. _delay_ms(5); // czekaj 5ms
  154. }
  155. LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_8_BIT); // interfejs 4-bity, 2-linie, znak 5x7
  156. LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
  157. //LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosæi pamieci DDRAM
  158. LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
  159. LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
  160. }
  161. //-------------------------------------------------------------------------------------------------
  162. //
  163. // Koniec pliku HD44780.c
  164. //
  165. //-------------------------------------------------------------------------------------------------