HD44780-I2C.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. while(LCD_ReadStatus()&0x80);
  53. }
  54. //-------------------------------------------------------------------------------------------------
  55. //
  56. // Funkcja odczytu bajtu statusowego
  57. //
  58. //-------------------------------------------------------------------------------------------------
  59. unsigned char LCD_ReadStatus(void)
  60. {
  61. expander_set_bit(LCD_RS_PORT, LCD_RS, 0);
  62. return _LCD_Read();
  63. }
  64. //-------------------------------------------------------------------------------------------------
  65. //
  66. // Funkcja zapisu danych do pamięci wyświetlacza
  67. //
  68. //-------------------------------------------------------------------------------------------------
  69. void LCD_WriteData(unsigned char dataToWrite)
  70. {
  71. expander_set_bit(LCD_RS_PORT, LCD_RS, 1);
  72. _LCD_Write(dataToWrite);
  73. while(LCD_ReadStatus()&0x80);
  74. }
  75. //-------------------------------------------------------------------------------------------------
  76. //
  77. // Funkcja odczytu danych z pamięci wyświetlacza
  78. //
  79. //-------------------------------------------------------------------------------------------------
  80. unsigned char LCD_ReadData(void)
  81. {
  82. expander_set_bit(LCD_RS_PORT, LCD_RS, 1);
  83. return _LCD_Read();
  84. }
  85. //-------------------------------------------------------------------------------------------------
  86. //
  87. // Funkcja wyświetlenia napisu na wyswietlaczu.
  88. //
  89. //-------------------------------------------------------------------------------------------------
  90. void LCD_WriteText(const char * text)
  91. {
  92. while(*text)
  93. LCD_WriteData(*text++);
  94. }
  95. void LCD_WriteTextP(const char *text)
  96. {
  97. char a;
  98. while((a = pgm_read_byte(text++)))
  99. LCD_WriteData(a);
  100. }
  101. //-------------------------------------------------------------------------------------------------
  102. //
  103. // Funkcja ustawienia współrzędnych ekranowych
  104. //
  105. //-------------------------------------------------------------------------------------------------
  106. void LCD_GoTo(unsigned char x, unsigned char y)
  107. {
  108. LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
  109. }
  110. //-------------------------------------------------------------------------------------------------
  111. //
  112. // Funkcja czyszczenia ekranu wyświetlacza.
  113. //
  114. //-------------------------------------------------------------------------------------------------
  115. void LCD_Clear(void)
  116. {
  117. LCD_WriteCommand(HD44780_CLEAR);
  118. _delay_ms(2);
  119. }
  120. //-------------------------------------------------------------------------------------------------
  121. //
  122. // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
  123. //
  124. //-------------------------------------------------------------------------------------------------
  125. void LCD_Home(void)
  126. {
  127. LCD_WriteCommand(HD44780_HOME);
  128. _delay_ms(2);
  129. }
  130. //-------------------------------------------------------------------------------------------------
  131. //
  132. // Procedura inicjalizacji kontrolera HD44780.
  133. //
  134. //-------------------------------------------------------------------------------------------------
  135. void LCD_Initialize(void)
  136. {
  137. unsigned char i;
  138. LCD_DATA_OUTPUT();
  139. expander_set_bit_no_send(LCD_RS_PORT, LCD_RS, 0); // wyzerowanie linii RS
  140. expander_set_bit_no_send(LCD_E_PORT, LCD_E, 0); // wyzerowanie linii E
  141. expander_set_bit(LCD_RW_PORT, LCD_RW, 0);
  142. _delay_ms(100); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
  143. exp_output[0] = 0x3F;
  144. expander_write(0);
  145. for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
  146. {
  147. expander_set_bit(LCD_E, LCD_E, 1);
  148. expander_set_bit(LCD_E, LCD_E, 0);
  149. _delay_ms(5); // czekaj 5ms
  150. }
  151. LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_8_BIT); // interfejs 4-bity, 2-linie, znak 5x7
  152. LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
  153. //LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosæi pamieci DDRAM
  154. LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
  155. LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
  156. }
  157. //-------------------------------------------------------------------------------------------------
  158. //
  159. // Koniec pliku HD44780.c
  160. //
  161. //-------------------------------------------------------------------------------------------------