diff --git a/ES/Lab/Lab9/LCD_DOUBLELINE.c b/ES/Lab/Lab9/LCD_DOUBLELINE.c new file mode 100644 index 0000000..2f81af5 --- /dev/null +++ b/ES/Lab/Lab9/LCD_DOUBLELINE.c @@ -0,0 +1,102 @@ +#include + +#define RS_CTRL 0x08000000 +#define EN_CTRL 0x10000000 +#define DT_CTRL 0x07800000 + +unsigned int col = 0; +unsigned long int temp1 = 0, temp2 = 0, i, j; +unsigned char flag1 = 0, flag2 = 0; +unsigned char msg[] = ("Long messages work well, heh."); + +void lcd_write(void); +void port_write(void); +void delay_lcd(unsigned long); + +unsigned long int init_command[] = { + 0x30, 0x30, 0x30, 0x20, 0x28, 0x0C, 0x01, 0x80 +}; + +#define LCD_COLS 16 + +int main() { + LPC_GPIO0->FIODIR = DT_CTRL | RS_CTRL | EN_CTRL; + + flag1 = 0; + + + for (i = 0; i < 8; i++) { + temp1 = init_command[i]; + lcd_write(); + } + + + flag1 = 1; + + + i = 0; + + while (msg[i] != '\0') { + if (col == LCD_COLS) { + flag1 = 0; + temp1 = 0xC0; + lcd_write(); + + flag1 = 1; + } else if (col == (LCD_COLS * 2)) { + flag1 = 0; + temp1 = 0x80; + lcd_write(); + + flag1 = 1; + col = 0; + } + + temp1 = msg[i++]; + lcd_write(); + col++; + } + + while (1) + ; +} + +void lcd_write(void) { + flag2 = (flag1 == 1) ? 0 : + (((temp1 == 0x30) || (temp1 == 0x20)) ? 1 : 0); + + temp2 = temp1 & 0xf0; + temp2 = temp2 << 19; + + port_write(); + + if (!flag2) { + temp2 = temp1 & 0x0f; + temp2 = temp2 << 23; + port_write(); + } +} + +void port_write(void) { + LPC_GPIO0->FIOPIN = temp2; + + if (flag1 == 0) { + LPC_GPIO0->FIOCLR = RS_CTRL; + } else { + LPC_GPIO0->FIOSET = RS_CTRL; + } + + LPC_GPIO0->FIOSET = EN_CTRL; + delay_lcd(100); + LPC_GPIO0->FIOCLR = EN_CTRL; + + delay_lcd(500000); +} + +void delay_lcd(unsigned long r1) { + unsigned long r; + + for (r = 0; r < r1; r++) + ; + return; +}