HD44780.c 6.1 KB

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