//========================================================= // LPC1114 Project //========================================================= // File Name : lcd.c // Function : LCD Module Control //--------------------------------------------------------- #ifdef __USE_CMSIS #include "LPC11xx.h" #endif #include "gpio.h" #include "utility.h" #include "lcd1602.h" //============= // Globals //============= volatile uint32_t gLCD1620_printf_PosX = 0; volatile uint32_t gLCD1620_printf_PosY = 0; //====================== // Initialize LCD Module //====================== void Init_LCD1620(void) { // //LCD表示に使うGPIOの設定 // GPIOSetDir(RS_PORTNUM , RS_BITPOSI , 1); GPIOSetValue(RS_PORTNUM, RS_BITPOSI, 0); GPIOSetDir(RW_PORTNUM, RW_BITPOSI, 1); GPIOSetValue(RW_PORTNUM, RW_BITPOSI, 0); GPIOSetDir(E_PORTNUM, E_BITPOSI, 1); GPIOSetValue(E_PORTNUM, E_BITPOSI, 0); GPIOSetDir(DB4_PORTNUM, DB4_BITPOSI, 1); GPIOSetValue(DB4_PORTNUM, DB4_BITPOSI, 0); GPIOSetDir(DB5_PORTNUM, DB5_BITPOSI, 1); GPIOSetValue(DB5_PORTNUM, DB5_BITPOSI, 0); GPIOSetDir(DB6_PORTNUM, DB6_BITPOSI, 1); GPIOSetValue(DB6_PORTNUM, DB6_BITPOSI, 0); GPIOSetDir(DB7_PORTNUM, DB7_BITPOSI, 1); GPIOSetValue(DB7_PORTNUM, DB7_BITPOSI, 0); // //初期化開始 // //初期設定 delay(1500); //15ms以上待つ write8bit(0x30); //コマンド0x30 delay(500); //4.1ms以上待つ write8bit(0x30); //コマンド0x30 delay(50); //100us以上待つ write8bit(0x30); //コマンド0x30 delay(500); //4.1ms以上待つ write8bit(0x20); //コマンド0x20(4ビット転送モードへ移行) delay(5); //40us以上待つ write4bit(0 , 0x06); //エントリモード //画面設定など LCD1620_Screen_Cfg(TWO_LINE_5x7FONT); LCD1620_Screen_mode(DISPLAY_CHAR_CRSR_BLNK); LCD1620_Clear_Screen(); } void LCD1620_printf(const char *format, ...) { va_list ap; uint8_t buf[256]; uint8_t *pStr; va_start(ap, format); xvsnprintf(buf, 256, format, ap); va_end(ap); pStr = buf; while(*pStr != '\0') { if (*pStr == '\n') { gLCD1620_printf_PosX = 0; if (gLCD1620_printf_PosY == 0){ gLCD1620_printf_PosY = 1; }else{ gLCD1620_printf_PosY = 0; } LCD1620_printf_Position(gLCD1620_printf_PosX , gLCD1620_printf_PosY); } else { write4bit(1 , *pStr); if(gLCD1620_printf_PosX ==15){ gLCD1620_printf_PosX = 0; if (gLCD1620_printf_PosY == 0){ gLCD1620_printf_PosY = 1; }else{ gLCD1620_printf_PosY = 0; } }else{ gLCD1620_printf_PosX++; } LCD1620_printf_Position(gLCD1620_printf_PosX , gLCD1620_printf_PosY); } pStr++; } } void LCD1620_printf_Position(uint32_t posx , uint32_t posy) { int pos_add[2][16] = { {0x80 , 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}, {0xC0 , 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF} }; gLCD1620_printf_PosX = posx; gLCD1620_printf_PosY = posy; write4bit(0 , pos_add[posy][posx]); //アドレス設定 } void LCD1620_Screen_mode(int mode) { int cmd[5]; cmd[DISPLAY_OFF] = 0x08; cmd[DISPLAY_CHAR] = 0x0C; cmd[DISPLAY_CHAR_BLNK] = 0x0D; cmd[DISPLAY_CHAR_CRSR] = 0x0E; cmd[DISPLAY_CHAR_CRSR_BLNK] = 0x0F; write4bit(0 , cmd[mode]); } void LCD1620_Clear_Screen(void) { write4bit(0 , 0x01); delay(200); //2ms待つ gLCD1620_printf_PosX = 0; gLCD1620_printf_PosY = 0; } void LCD1620_Screen_Cfg(int mode) { int cmd[3]; cmd[ONE_LINE_5x7FONT] = 0x20; cmd[ONE_LINE_5x10FONT] = 0x24; cmd[TWO_LINE_5x7FONT] = 0x28; write4bit(0 , cmd[mode]); } // // 8ビット書き込み(実際は上位4ビットのみ一回書き込み) // void write8bit(int data) { int high4bit = data >> 4; //右に4ビットシフトする //データの書き込み GPIOSetValue(E_PORTNUM, E_BITPOSI, 0); //EnableをOFFにする GPIOSetValue(RS_PORTNUM, RS_BITPOSI, 0); //制御モード=0 GPIOSetValue(RW_PORTNUM, RW_BITPOSI, 0); //Writeモードに設定 GPIOSetValue(DB7_PORTNUM, DB7_BITPOSI, (high4bit & 0x08) >> 3); //第7ビット書き込み GPIOSetValue(DB6_PORTNUM, DB6_BITPOSI, (high4bit & 0x04) >> 2); //第6ビット書き込み GPIOSetValue(DB5_PORTNUM, DB5_BITPOSI, (high4bit & 0x02) >> 1); //第5ビット書き込み GPIOSetValue(DB4_PORTNUM, DB4_BITPOSI, (high4bit & 0x01) ); //第4ビット書き込み GPIOSetValue(E_PORTNUM, E_BITPOSI, 1); //Enableをonにする delay(1); //220ns以上待つ→10usウェイト GPIOSetValue(E_PORTNUM, E_BITPOSI, 0); //EnableをOFFにする } // // 4ビット2回書き込み/40us以上のウェイト付 // void write4bit(int rs , int data) { int low4bit = data & 0x0f; //下位4ビット取得 int high4bit = data >> 4; //右に4ビットシフトする //データの書き込み GPIOSetValue(E_PORTNUM, E_BITPOSI, 0); //EnableをOFFにする GPIOSetValue(RS_PORTNUM, RS_BITPOSI, rs); //制御モード=0 / 表示モード=1 GPIOSetValue(RW_PORTNUM, RW_BITPOSI, 0); //Writeモードに設定 //上位4ビット GPIOSetValue(DB7_PORTNUM, DB7_BITPOSI, (high4bit & 0x08) >> 3); //第7ビット書き込み GPIOSetValue(DB6_PORTNUM, DB6_BITPOSI, (high4bit & 0x04) >> 2); //第6ビット書き込み GPIOSetValue(DB5_PORTNUM, DB5_BITPOSI, (high4bit & 0x02) >> 1); //第5ビット書き込み GPIOSetValue(DB4_PORTNUM, DB4_BITPOSI, (high4bit & 0x01) ); //第4ビット書き込み GPIOSetValue(E_PORTNUM, E_BITPOSI, 1); //Enableをonにする delay(1); //220ns以上待つ→10usウェイト GPIOSetValue(E_PORTNUM, E_BITPOSI, 0); //EnableをOFFにする //下位4ビット GPIOSetValue(DB7_PORTNUM, DB7_BITPOSI, (low4bit & 0x08) >> 3); //第3ビット書き込み GPIOSetValue(DB6_PORTNUM, DB6_BITPOSI, (low4bit & 0x04) >> 2); //第2ビット書き込み GPIOSetValue(DB5_PORTNUM, DB5_BITPOSI, (low4bit & 0x02) >> 1); //第1ビット書き込み GPIOSetValue(DB4_PORTNUM, DB4_BITPOSI, (low4bit & 0x01) ); //第0ビット書き込み GPIOSetValue(E_PORTNUM, E_BITPOSI, 1); //Enableをonにする delay(1); //220ns以上待つ→10usウェイト GPIOSetValue(E_PORTNUM, E_BITPOSI, 0); //EnableをOFFにする delay(5); //40us以上待つ } void delay(int count) { int j=0,i=0; for(j=0;j