00001
00002
00003
00004
00005
00006
00007
00074 #ifndef __HD44780_H
00075 #define __HD44780_H
00076
00077 #include "macros.h"
00078 #include <avr/io.h>
00079 #include <avr/pgmspace.h>
00080 #include <stdio.h>
00081
00082
00083
00084
00085
00086
00087 #if !defined(HD44780_WIDTH) || !defined(HD44780_HEIGHT)
00088 #error "Nie zdefiniowano rozmiarów wyświetlacza (HD44780_WIDTH i HD44780_HEIGHT)"
00089 #endif
00090
00091 #ifndef HD44780_DATA_CUSTOM
00092 #define HD44780_DATA_CUSTOM 0
00093 #endif
00094
00095 #ifndef HD44780_DATA_8BIT
00096 #define HD44780_DATA_8BIT 0
00097 #endif
00098
00099 #if HD44780_DATA_8BIT && (HD44780_DATA_CUSTOM || HD44780_DATA_HIGHHALFBYTE)
00100 #error "Nie można jednocześnie ustawić trybu 8bit (HD44780_DATA_8BIT) razem z opcjami \
00101 HD44780_DATA_CUSTOM oraz HD44780_DATA_HIGHHALFBYTE"
00102 #endif
00103
00104 #if HD44780_DATA_CUSTOM
00105 # if !defined(HD44780_DATA_DB4_GPIO) || !defined(HD44780_DATA_DB4_BIT) || \
00106 !defined(HD44780_DATA_DB5_GPIO) || !defined(HD44780_DATA_DB5_BIT) || \
00107 !defined(HD44780_DATA_DB6_GPIO) || !defined(HD44780_DATA_DB6_BIT) || \
00108 !defined(HD44780_DATA_DB7_GPIO) || !defined(HD44780_DATA_DB7_BIT)
00109 # error "Nie zdefiniowano szyny danych (HD44780_DATA_DB[4-7]_[GPIO|BIT])"
00110 # endif
00111 #elif HD44780_DATA_8BIT
00112 # if !defined(HD44780_DATA_GPIO)
00113 # error "Nie zdefiniowano szyny danych (HD44780_DATA_GPIO)"
00114 # endif
00115 #else
00116 # if !defined(HD44780_DATA_GPIO) || !defined(HD44780_DATA_HIGHHALFBYTE)
00117 # error "Nie zdefiniowano szyny danych (HD44780_DATA_GPIO i \
00118 HD44780_DATA_HIGHHALFBYTE) lub indywidualno przypisania (HD44780_DATA_CUSTOM)"
00119 # endif
00120 #endif
00121
00122 #ifndef HD44780_DOUBLE
00123 # if ((HD44780_HEIGHT * HD44780_WIDTH) > 80)
00124 # define HD44780_DOUBLE 1
00125 # else
00126 # define HD44780_DOUBLE 0
00127 # endif
00128 #endif
00129
00130 #if !defined(HD44780_RS_GPIO) || !defined(HD44780_RS_BIT) || \
00131 !defined(HD44780_E1_GPIO) || !defined(HD44780_E1_BIT) || \
00132 (HD44780_DOUBLE && (!defined(HD44780_E2_GPIO) || !defined(HD44780_E2_BIT)))
00133 #error "Nie zdefiniowano pinów sterujących (HD44780_[RS|E1|E2]_[GPIO|BIT])"
00134 #endif
00135
00136 #if (!( (HD44780_WIDTH == 16 && HD44780_HEIGHT == 2) || \
00137 (HD44780_WIDTH == 16 && HD44780_HEIGHT == 4) || \
00138 (HD44780_WIDTH == 20 && HD44780_HEIGHT == 4) || \
00139 (HD44780_WIDTH == 40 && HD44780_HEIGHT == 4) ))
00140 #warning "Twój typ wyświetlacza nie został przetestowany we współpracy z tą \
00141 biblioteką. Skontaktuj się z autorem."
00142 #endif
00143
00144 #if defined(HD44780_RW_GPIO) != defined(HD44780_RW_BIT)
00145 #error "Zdefiniowano tylko jedną ze stałych określającą linię RW (HD44780_RW_GPIO i HD44780_RW_BIT)"
00146 #endif
00147
00148
00149
00150
00151
00152
00153 #if HD44780_DATA_CUSTOM
00154 # define HD44780_DATA_DB4_DDR CONCAT(DDR, HD44780_DATA_DB4_GPIO)
00155 # define HD44780_DATA_DB4_PORT CONCAT(PORT, HD44780_DATA_DB4_GPIO)
00156 # define HD44780_DATA_DB5_DDR CONCAT(DDR, HD44780_DATA_DB5_GPIO)
00157 # define HD44780_DATA_DB5_PORT CONCAT(PORT, HD44780_DATA_DB5_GPIO)
00158 # define HD44780_DATA_DB6_DDR CONCAT(DDR, HD44780_DATA_DB6_GPIO)
00159 # define HD44780_DATA_DB6_PORT CONCAT(PORT, HD44780_DATA_DB6_GPIO)
00160 # define HD44780_DATA_DB7_DDR CONCAT(DDR, HD44780_DATA_DB7_GPIO)
00161 # define HD44780_DATA_DB7_PORT CONCAT(PORT, HD44780_DATA_DB7_GPIO)
00162 # ifdef HD44780_RW_GPIO
00163 # define HD44780_DATA_DB4_PIN CONCAT(PIN, HD44780_DATA_DB4_GPIO)
00164 # define HD44780_DATA_DB5_PIN CONCAT(PIN, HD44780_DATA_DB5_GPIO)
00165 # define HD44780_DATA_DB6_PIN CONCAT(PIN, HD44780_DATA_DB6_GPIO)
00166 # define HD44780_DATA_DB7_PIN CONCAT(PIN, HD44780_DATA_DB7_GPIO)
00167 # endif
00168 #else
00169 # define HD44780_DATA_DDR CONCAT(DDR, HD44780_DATA_GPIO)
00170 # define HD44780_DATA_PORT CONCAT(PORT, HD44780_DATA_GPIO)
00171 # ifdef HD44780_RW_GPIO
00172 # define HD44780_DATA_PIN CONCAT(PIN, HD44780_DATA_GPIO)
00173 # endif
00174 # if !HD44780_DATA_8BIT
00175 # if HD44780_DATA_HIGHHALFBYTE
00176 # define HD44780_DATA_MASK 0xF0
00177 # define HD44780_DATA_SHIFT 4
00178 # else
00179 # define HD44780_DATA_MASK 0x0F
00180 # define HD44780_DATA_SHIFT 0
00181 # endif
00182 # endif
00183 #endif
00184
00185 #define HD44780_RS_DDR CONCAT(DDR, HD44780_RS_GPIO)
00186 #define HD44780_E1_DDR CONCAT(DDR, HD44780_E1_GPIO)
00187
00188 #define HD44780_RS_PORT CONCAT(PORT, HD44780_RS_GPIO)
00189 #define HD44780_E1_PORT CONCAT(PORT, HD44780_E1_GPIO)
00190
00191 #if defined(HD44780_RW_GPIO)
00192 # define HD44780_RW_DDR CONCAT(DDR, HD44780_RW_GPIO)
00193 # define HD44780_RW_PORT CONCAT(PORT, HD44780_RW_GPIO)
00194 #endif
00195
00196 #if HD44780_DOUBLE
00197 # define HD44780_E2_DDR CONCAT(DDR, HD44780_E2_GPIO)
00198 # define HD44780_E2_PORT CONCAT(PORT, HD44780_E2_GPIO)
00199 # define HD44780_IFDOUBLE(str) str
00200 # define HD44780_IFDOUBLE_C(str) , str
00201 #else
00202 # define HD44780_IFDOUBLE(str)
00203 # define HD44780_IFDOUBLE_C(str)
00204 #endif
00205
00206
00207 #ifdef HD44780_CHARSET
00208 # include "hd44780-charsets/charsets.h"
00209 #endif
00210
00211
00212
00213
00214
00215 #define HD44780_CLEAR 0x01
00216
00217 #define HD44780_HOME 0x02
00218
00219 #define HD44780_ENTRY_MODE 0x04
00220 # define HD44780_ENTRY_SHCURSOR 0x00
00221 # define HD44780_ENTRY_SHDISPLAY 0x01
00222 # define HD44780_ENTRY_SHLEFT 0x00
00223 # define HD44780_ENTRY_SHRIGHT 0x02
00224
00225 #define HD44780_DISPLAY_CONTROL 0x08
00226 # define HD44780_DISPLAY_NOBLINK 0x00
00227 # define HD44780_DISPLAY_BLINK 0x01
00228 # define HD44780_DISPLAY_NOCURSOR 0x00
00229 # define HD44780_DISPLAY_CURSOR 0x02
00230 # define HD44780_DISPLAY_OFF 0x00
00231 # define HD44780_DISPLAY_ON 0x04
00232
00233 #define HD44780_SHIFT_CURDISP 0x10
00234 # define HD44780_SHIFT_CURSOR 0x00
00235 # define HD44780_SHIFT_DISPLAY 0x08
00236 # define HD44780_SHIFT_LEFT 0x00
00237 # define HD44780_SHIFT_RIGHT 0x04
00238
00239 #define HD44780_FUNCTION_SET 0x20
00240 # define HD44780_FUNCTION_FONT5x8 0x00
00241 # define HD44780_FUNCTION_FONT5x10 0x04
00242 # define HD44780_FUNCTION_1LINE 0x00
00243 # define HD44780_FUNCTION_2LINE 0x08
00244 # define HD44780_FUNCTION_4BIT 0x00
00245 # define HD44780_FUNCTION_8BIT 0x10
00246
00247 #define HD44780_CGRAM_SET 0x40
00248
00249 #define HD44780_DDRAM_SET 0x80
00250
00251 #define HD44780_READ_BUSY_MASK 0x80
00252 #define HD44780_READ_ADDR_MASK 0x7F
00253
00254
00255
00256
00257
00258
00263 void hd44780_init();
00264
00269 void hd44780_clear();
00270
00277 void hd44780_goto(uint8_t x, uint8_t y);
00278
00292 void hd44780_putChar(uint8_t c);
00293
00306 void hd44780_putStr(char *str, uint8_t length);
00307
00323 void hd44780_putPStr(const char *pstr, uint8_t length);
00324
00332 #define HD44780_PUTSTR(str) hd44780_putStr(str, -1)
00333
00345 #define HD44780_PUTPSTR(str) hd44780_putPStr(PSTR(str), sizeof(str) - 1)
00346
00355 void hd44780_putInt(int val, uint8_t radix, uint8_t lpad);
00356
00364 #define HD44780_PUTINT(val) hd44780_putInt(val, 10, 0)
00365
00379 void hd44780_loadChar(uint8_t addr, const uint8_t data[8]);
00380
00391 void hd44780_loadCharSet(const uint8_t data[64]);
00392
00419 #define HD44780_BIND_STREAM(stream_name) \
00420 { \
00421 fdev_setup_stream(&_hd44780_stream, _hd44780_putStreamChar, NULL, _FDEV_SETUP_WRITE); \
00422 stream_name = &_hd44780_stream; \
00423 }
00424
00425
00426
00427
00428
00429 #if HD44780_DATA_CUSTOM
00430
00431 # define _HD44780_WRITE_HALFBYTE(data) _hd44780_write_halfbyte_custom(data)
00432
00433 # ifdef HD44780_RW_GPIO
00434 # define _HD44780_READ_HALFBYTE() _hd44780_read_halfbyte_custom()
00435 # endif
00436
00437 #elif !HD44780_DATA_8BIT
00438
00439
00440
00441
00442 # define _HD44780_WRITE_HALFBYTE(data) HD44780_DATA_PORT = \
00443 ((HD44780_DATA_PORT & ~HD44780_DATA_MASK) | \
00444 ((data << HD44780_DATA_SHIFT) & HD44780_DATA_MASK))
00445
00446 # ifdef HD44780_RW_GPIO
00447 # define _HD44780_READ_HALFBYTE() \
00448 ((HD44780_DATA_PIN & HD44780_DATA_MASK) >> HD44780_DATA_SHIFT)
00449 # endif
00450
00451 #endif
00452
00453
00454
00455
00456 #define _HD44780_SET_COMMAND_MODE() HD44780_RS_PORT &= ~_BV(HD44780_RS_BIT)
00457
00458
00459
00460
00461 #define _HD44780_SET_DATA_MODE() HD44780_RS_PORT |= _BV(HD44780_RS_BIT)
00462
00469 void _hd44780_enable(HD44780_IFDOUBLE(uint8_t controller));
00470
00476 void _hd44780_write(uint8_t data
00477 HD44780_IFDOUBLE_C(uint8_t controller));
00478
00484 void _hd44780_write_command(uint8_t command
00485 HD44780_IFDOUBLE_C(uint8_t controller));
00486
00492 void _hd44780_write_data(uint8_t data
00493 HD44780_IFDOUBLE_C(uint8_t controller));
00494
00502 int _hd44780_putStreamChar(char c, FILE *stream);
00503
00504 #if HD44780_DATA_CUSTOM
00505
00513 void _hd44780_write_halfbyte_custom(uint8_t halfbyte);
00514
00515 # ifdef HD44780_RW_GPIO
00516
00517
00518
00519
00520
00521
00522 uint8_t _hd44780_read_halfbyte_custom();
00523 # endif
00524
00525 #endif
00526
00527
00528
00529
00530 #if HD44780_DATA_CUSTOM
00531 # define _HD44780_DATA_DDR_SETOUT() \
00532 { \
00533 HD44780_DATA_DB4_DDR |= _BV(HD44780_DATA_DB4_BIT); \
00534 HD44780_DATA_DB5_DDR |= _BV(HD44780_DATA_DB5_BIT); \
00535 HD44780_DATA_DB6_DDR |= _BV(HD44780_DATA_DB6_BIT); \
00536 HD44780_DATA_DB7_DDR |= _BV(HD44780_DATA_DB7_BIT); \
00537 }
00538 # define _HD44780_DATA_DDR_SETIN() \
00539 { \
00540 HD44780_DATA_DB4_DDR &= ~_BV(HD44780_DATA_DB4_BIT); \
00541 HD44780_DATA_DB5_DDR &= ~_BV(HD44780_DATA_DB5_BIT); \
00542 HD44780_DATA_DB6_DDR &= ~_BV(HD44780_DATA_DB6_BIT); \
00543 HD44780_DATA_DB7_DDR &= ~_BV(HD44780_DATA_DB7_BIT); \
00544 }
00545 #elif HD44780_DATA_8BIT
00546 # define _HD44780_DATA_DDR_SETOUT() HD44780_DATA_DDR = 0xFF;
00547 # define _HD44780_DATA_DDR_SETIN() HD44780_DATA_DDR = 0x00;
00548 #else
00549 # define _HD44780_DATA_DDR_SETOUT() HD44780_DATA_DDR |= HD44780_DATA_MASK;
00550 # define _HD44780_DATA_DDR_SETIN() HD44780_DATA_DDR &= ~HD44780_DATA_MASK;
00551 #endif
00552
00553 #ifdef HD44780_RW_GPIO
00554 # define _HD44780_DATA_SETWRITEABLE() \
00555 { \
00556 _HD44780_DATA_DDR_SETOUT(); \
00557 HD44780_RW_PORT &= ~_BV(HD44780_RW_BIT); \
00558 }
00559
00560 # define _HD44780_DATA_SETREADABLE() \
00561 { \
00562 _HD44780_DATA_DDR_SETIN(); \
00563 HD44780_RW_PORT |= _BV(HD44780_RW_BIT); \
00564 }
00565
00566 # define _HD44780_DATA_READ(var, controller) \
00567 { \
00568 _hd44780_busy_wait(HD44780_IFDOUBLE(controller)); \
00569 _HD44780_SET_DATA_MODE(); \
00570 var = _hd44780_read(HD44780_IFDOUBLE(controller)); \
00571 }
00572
00580 uint8_t _hd44780_read(HD44780_IFDOUBLE(uint8_t controller));
00581
00582
00583
00584
00585
00586
00587
00588 void _hd44780_busy_wait(HD44780_IFDOUBLE(uint8_t controller));
00589 #endif
00590
00591 #include "hd44780.c"
00592
00593 #endif