aboutsummaryrefslogtreecommitdiffstats
path: root/demos/AVR-ATmega128-GCC/lcd.c
diff options
context:
space:
mode:
Diffstat (limited to 'demos/AVR-ATmega128-GCC/lcd.c')
-rw-r--r--demos/AVR-ATmega128-GCC/lcd.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/demos/AVR-ATmega128-GCC/lcd.c b/demos/AVR-ATmega128-GCC/lcd.c
new file mode 100644
index 000000000..eed0c896e
--- /dev/null
+++ b/demos/AVR-ATmega128-GCC/lcd.c
@@ -0,0 +1,97 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <ch.h>
+
+#include <avr/io.h>
+
+#include "board.h"
+#include "lcd.h"
+
+static void e_pulse(void) {
+ volatile uint8_t i;
+
+ PORTC |= PORTC_44780_E;
+ for (i = 0; i < ELOOPVALUE; i++);
+ ;
+ PORTC &= ~PORTC_44780_E;
+}
+
+static void wait_not_busy(void) {
+
+ chThdSleep(2);
+}
+
+/*
+ * 44780 soft reset procedure.
+ */
+void lcdInit(void) {
+
+ PORTC = (PORTC & ~(PORTC_44780_DATA | PORTC_44780_RS | PORTC_44780_E | PORTC_44780_RW)) |
+ (LCD_CMD_INIT8 & PORTC_44780_DATA);
+ chThdSleep(50);
+ e_pulse();
+ chThdSleep(10);
+ e_pulse();
+ chThdSleep(2);
+ e_pulse();
+ wait_not_busy();
+ PORTC = (PORTC & ~(PORTC_44780_DATA | PORTC_44780_RS | PORTC_44780_E | PORTC_44780_RW)) |
+ (LCD_CMD_INIT4 & PORTC_44780_DATA);
+ e_pulse();
+ lcdCmd(LCD_CMD_INIT4);
+ lcdCmd(LCD_SET_DM | LCD_DM_DISPLAY_ON);
+ lcdCmd(LCD_SET_INCREMENT_MODE);
+}
+
+/*
+ * Sends a command byte to the 44780.
+ */
+void lcdCmd(uint8_t cmd) {
+
+ wait_not_busy();
+ PORTC = (PORTC | PORTC_44780_DATA) & (cmd | (0x0F & ~PORTC_44780_RS));
+ e_pulse();
+ PORTC = (PORTC | PORTC_44780_DATA) & ((cmd << 4) | (0x0F & ~PORTC_44780_RS));
+ e_pulse();
+}
+
+/*
+ * Writes a char on the LCD at the current position.
+ */
+void lcdPutc(char c) {
+ uint8_t b;
+
+ wait_not_busy();
+ b = c | 0x0F;
+ PORTC = (PORTC | PORTC_44780_DATA | PORTC_44780_RS) & (c | 0x0F);
+ e_pulse();
+ PORTC = (PORTC | PORTC_44780_DATA | PORTC_44780_RS) & ((c << 4) | 0x0F);
+ e_pulse();
+}
+
+/*
+ * Writes a string on the LCD at an absolute address.
+ */
+void lcdPuts(uint8_t pos, char *p) {
+
+ lcdCmd(LCD_SET_DDRAM_ADDRESS | pos);
+ while (*p)
+ lcdPutc(*p++);
+}