» Advertenties

Zo 20 Mei 2012, 07:51

C code -
  1. //*****************************************************************************
  2. //
  3. // File Name : lcd.h
  4. // Title : 4bit controle software for HD44780 LCD's
  5. // Author : Smoerijf.be (Orinal by Pascal Stang - edit by smoerijf)
  6. // Target MCU : Atmel AVR Series
  7. //
  8. //*****************************************************************************
  9.  
  10. #ifndef LCD_H
  11. #define LCD_H
  12.  
  13.  
  14. #if (__GNUC__ * 100 + __GNUC_MINOR__) < 303
  15. #error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !"
  16. #endif
  17.  
  18. #include <inttypes.h>
  19. #include <avr/pgmspace.h>
  20.  
  21. /**
  22.  * @name Definitions for MCU Clock Frequency
  23.  * Adapt the MCU clock frequency in Hz to your target.
  24.  */
  25. #define XTAL F_CPU /**< clock frequency in Hz, used to calculate delay timer */
  26.  
  27.  
  28. /**
  29.  * @name Definition for LCD controller type
  30.  * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
  31.  */
  32. #define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
  33.  
  34. /**
  35.  * @name Definitions for Display Size
  36.  * Change these definitions to adapt setting to your display
  37.  */
  38. #ifndef LCD_LINES
  39.   #define LCD_LINES 4 /**< number of visible lines of the display */
  40. #endif
  41. #ifndef LCD_DISP_LENGTH
  42.   #define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
  43. #endif
  44. #define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
  45. #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
  46. #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
  47. #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
  48. #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
  49. #define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
  50.  
  51.  
  52. #define LCD_IO_MODE 1 /**< 0: memory mapped mode, 1: IO port mode */
  53. #if LCD_IO_MODE
  54. /**
  55.  * @name Definitions for 4-bit IO mode
  56.  * Change LCD_PORT if you want to use a different port for the LCD pins.
  57.  *
  58.  * The four LCD data lines and the three control lines RS, RW, E can be on the
  59.  * same port or on different ports.
  60.  * Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on
  61.  * different ports.
  62.  *
  63.  * Normally the four data lines should be mapped to bit 0..3 on one port, but it
  64.  * is possible to connect these data lines in different order or even on different
  65.  * ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.
  66.  *
  67.  */
  68. #ifndef LCD_PORT
  69.   #define LCD_PORT PORTB   /**< port for the LCD lines */
  70.   #define LCD_DATA0_PORT LCD_PORT   /**< port for 4bit data bit 0 */
  71.   #define LCD_DATA1_PORT LCD_PORT   /**< port for 4bit data bit 1 */
  72.   #define LCD_DATA2_PORT LCD_PORT   /**< port for 4bit data bit 2 */
  73.   #define LCD_DATA3_PORT LCD_PORT   /**< port for 4bit data bit 3 */
  74.   #define LCD_DATA0_PIN 4   /**< pin for 4bit data bit 0 */
  75.   #define LCD_DATA1_PIN 5   /**< pin for 4bit data bit 1 */
  76.   #define LCD_DATA2_PIN 6   /**< pin for 4bit data bit 2 */
  77.   #define LCD_DATA3_PIN 7   /**< pin for 4bit data bit 3 */
  78.   #define LCD_RS_PORT PORTC     /**< port for RS line */
  79.   #define LCD_RS_PIN 7   /**< pin for RS line */
  80.   #define LCD_RW_PORT PORTC     /**< port for RW line */
  81.   #define LCD_RW_PIN 6   /**< pin for RW line */
  82.   #define LCD_E_PORT PORTC     /**< port for Enable line */
  83.   #define LCD_E_PIN 5   /**< pin for Enable line */
  84. #endif
  85.  
  86. #elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \
  87. defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \
  88. defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
  89. /*
  90.  * memory mapped mode is only supported when the device has an external data memory interface
  91.  */
  92. #define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
  93. #define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
  94. #define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
  95. #else
  96. #error "external data memory interface not available for this device, use 4-bit IO port mode"
  97.  
  98. #endif
  99.  
  100.  
  101. /**
  102.  * @name Definitions for LCD command instructions
  103.  * The constants define the various LCD controller instructions which can be passed to the
  104.  * function lcd_command(), see HD44780 data sheet for a complete description.
  105.  */
  106.  
  107. /* instruction register bit positions, see HD44780U data sheet */
  108. #define LCD_CLR 0 /* DB0: clear display */
  109. #define LCD_HOME 1 /* DB1: return to home position */
  110. #define LCD_ENTRY_MODE 2 /* DB2: set entry mode */
  111. #define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */
  112. #define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */
  113. #define LCD_ON 3 /* DB3: turn lcd/cursor on */
  114. #define LCD_ON_DISPLAY 2 /* DB2: turn display on */
  115. #define LCD_ON_CURSOR 1 /* DB1: turn cursor on */
  116. #define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */
  117. #define LCD_MOVE 4 /* DB4: move cursor/display */
  118. #define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */
  119. #define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */
  120. #define LCD_FUNCTION 5 /* DB5: function set */
  121. #define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */
  122. #define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */
  123. #define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */
  124. #define LCD_CGRAM 6 /* DB6: set CG RAM address */
  125. #define LCD_DDRAM 7 /* DB7: set DD RAM address */
  126. #define LCD_BUSY 7 /* DB7: LCD is busy */
  127.  
  128. /* set entry mode: display shift on/off, dec/inc cursor move direction */
  129. #define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */
  130. #define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */
  131. #define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */
  132. #define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */
  133.  
  134. /* display on/off, cursor on/off, blinking char at cursor position */
  135. #define LCD_DISP_OFF 0x08 /* display off */
  136. #define LCD_DISP_ON 0x0C /* display on, cursor off */
  137. #define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */
  138. #define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */
  139. #define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */
  140.  
  141. /* move cursor/shift display */
  142. #define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */
  143. #define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */
  144. #define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */
  145. #define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */
  146.  
  147. /* function set: set interface data length and number of display lines */
  148. #define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */
  149. #define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */
  150. #define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
  151. #define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
  152.  
  153.  
  154. #define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
  155.  
  156.  
  157.  
  158. /**
  159.  * @name Functions
  160.  */
  161.  
  162.  
  163. /**
  164.  @brief Initialize display and select type of cursor
  165.  @param dispAttr \b LCD_DISP_OFF display off\n
  166.   \b LCD_DISP_ON display on, cursor off\n
  167.   \b LCD_DISP_ON_CURSOR display on, cursor on\n
  168.   \b LCD_DISP_ON_CURSOR_BLINK display on, cursor on flashing
  169.  @return none
  170. */
  171. extern void lcdInit(uint8_t dispAttr);
  172.  
  173.  
  174. /**
  175.  @brief Clear display and set cursor to home position
  176.  @param void
  177.  @return none
  178. */
  179. extern void lcdClr(void);
  180.  
  181.  
  182. /**
  183.  @brief Set cursor to home position
  184.  @param void
  185.  @return none
  186. */
  187. extern void lcdHome(void);
  188.  
  189.  
  190. /**
  191.  @brief Set cursor to specified position
  192.  @param x horizontal position\n (0: left most position)
  193.  @param y vertical position\n (0: first line)
  194.  @return none
  195. */
  196. extern void lcdGotoXY(uint8_t x, uint8_t y);
  197.  
  198.  
  199. /**
  200.  @brief Display character at current cursor position
  201.  @param c character to be displayed
  202.  @return none
  203. */
  204. extern void lcd_putc(char c);
  205.  
  206.  
  207. /**
  208.  @brief Display string without auto linefeed
  209.  @param s string to be displayed
  210.  @return none
  211. */
  212. extern void lcdEcho(const char *s);
  213. extern void lcdPuts(const char *s);
  214.  
  215.  
  216. /**
  217.  @brief Display string from program memory without auto linefeed
  218.  @param s string from program memory be be displayed
  219.  @return none
  220.  @see lcd_puts_P
  221. */
  222. extern void lcd_puts_p(const char *progmem_s);
  223.  
  224.  
  225. /**
  226.  @brief Send LCD controller instruction command
  227.  @param cmd instruction to send to LCD controller, see HD44780 data sheet
  228.  @return none
  229. */
  230. extern void lcd_command(uint8_t cmd);
  231.  
  232.  
  233. /**
  234.  @brief Send data byte to LCD controller
  235.  
  236.  Similar to lcd_putc(), but without interpreting LF
  237.  @param data byte to send to LCD controller, see HD44780 data sheet
  238.  @return none
  239. */
  240. extern void lcd_data(uint8_t data);
  241.  
  242.  
  243. /**
  244.  @brief macros for automatically storing string constant in program memory
  245. */
  246. #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s))
  247.  
  248.  
  249. /**
  250.  @brief load custom char into lcd RAM
  251.  @param lcdCustomCharArray
  252.  @param romCharNum
  253.  @param lcdCharNum
  254.  @return none
  255. */
  256. extern void lcdLCC(u08* lcdCustomCharArray, u08 romCharNum, u08 lcdCharNum);
  257.  
  258. /*@}*/
  259. #endif //LCD_H
Laatste wijziging: Za 25 April 2009, 09:45