//------------------------------------------------------------------------------------------------------------ // // ODROID-C 16x2 LCD / LED / Button Test Application. // // Defined port number is wiringPi port number. // // Compile : gcc -o -lwiringPi -lwiringPiDev -lpthread // Run : sudo ./ // //------------------------------------------------------------------------------------------------------------ #include #include #include #include #include #include #include #include #include #include //------------------------------------------------------------------------------------------------------------ // // Global handle Define // //------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------ // // LCD: // //------------------------------------------------------------------------------------------------------------ #define LCD_ROW 2 // 16 Char #define LCD_COL 16 // 2 Line #define LCD_BUS 4 // Interface 4 Bit mode #define LCD_UPDATE_PERIOD 300 // 300ms static unsigned char lcdFb[LCD_ROW][LCD_COL] = {0, }; static int lcdHandle = 0; static int lcdDispPos = 0; #define PORT_LCD_RS 7 // GPIOY.BIT3(#83) #define PORT_LCD_E 0 // GPIOY.BIT8(#88) #define PORT_LCD_D4 2 // GPIOX.BIT19(#116) #define PORT_LCD_D5 3 // GPIOX.BIT18(#115) #define PORT_LCD_D6 1 // GPIOY.BIT7(#87) #define PORT_LCD_D7 4 // GPIOX.BIT7(#104) const unsigned char lcdDispString[LCD_ROW][LCD_COL] = { //1234567890123456 " Hello! ODROID! ", " - HardKernel - ", }; //------------------------------------------------------------------------------------------------------------ // // Button: // //------------------------------------------------------------------------------------------------------------ #define PORT_BUTTON1 5 // GPIOX.BIT5(#102) #define PORT_BUTTON2 6 // GPIOX.BIT6(#103) //------------------------------------------------------------------------------------------------------------ // // LED: // //------------------------------------------------------------------------------------------------------------ static int ledPos = 0; const int ledPorts[] = { 21, // GPIOX.BIT4(#101) 22, // GPIOX.BIT3(#100) 23, // GPIOX.BIT11(#108):PWM_B 24, // GPIOX.BIT0(#97) 11, // GPIOX.BIT21(#118) 26, // GPIOX.BIT2(#99) 27, // GPIOX.BIT1(#98) }; #define MAX_LED_CNT sizeof(ledPorts) / sizeof(ledPorts[0]) //------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------ // // LCD Update Function: // //------------------------------------------------------------------------------------------------------------ static void lcd_update (void) { int i, j; memset((void *)&lcdFb, ' ', sizeof(lcdFb)); if(lcdDispPos) lcdDispPos %= LCD_COL; // LCD Display Shift if(lcdDispPos < 0) { strncpy(&lcdFb[0][abs(lcdDispPos)], &lcdDispString[0][0], LCD_COL - abs(lcdDispPos)); strncpy(&lcdFb[1][abs(lcdDispPos)], &lcdDispString[1][0], LCD_COL - abs(lcdDispPos)); } else { strncpy(&lcdFb[0][0], &lcdDispString[0][lcdDispPos], LCD_COL - lcdDispPos); strncpy(&lcdFb[1][0], &lcdDispString[1][lcdDispPos], LCD_COL - lcdDispPos); } for(i = 0; i < LCD_ROW; i++) { lcdPosition (lcdHandle, 0, i); for(j = 0; j < LCD_COL; j++) lcdPutchar(lcdHandle, lcdFb[i][j]); } } //------------------------------------------------------------------------------------------------------------ // // system init // //------------------------------------------------------------------------------------------------------------ int system_init(void) { int i; // LCD Init lcdHandle = lcdInit (LCD_ROW, LCD_COL, LCD_BUS, PORT_LCD_RS, PORT_LCD_E, PORT_LCD_D4, PORT_LCD_D5, PORT_LCD_D6, PORT_LCD_D7, 0, 0, 0, 0); if(lcdHandle < 0) { fprintf(stderr, "%s : lcdInit failed!\n", __func__); return -1; } // GPIO Init(LED Port ALL Output) for(i = 0; i < MAX_LED_CNT; i++) { pinMode (ledPorts[i], OUTPUT); pullUpDnControl (PORT_BUTTON1, PUD_OFF); } // Button Pull Up Enable. pinMode (PORT_BUTTON1, INPUT); pullUpDnControl (PORT_BUTTON1, PUD_UP); pinMode (PORT_BUTTON2, INPUT); pullUpDnControl (PORT_BUTTON2, PUD_UP); return 0; } //------------------------------------------------------------------------------------------------------------ // // board data update // //------------------------------------------------------------------------------------------------------------ void boardDataUpdate(void) { int i; // LED Control for(i = 0; i < MAX_LED_CNT; i++) digitalWrite (ledPorts[i], 0); // LED All Clear digitalWrite(ledPorts[ledPos++], 1); if(ledPos) ledPos %= MAX_LED_CNT; // button status read if(!digitalRead (PORT_BUTTON1)) lcdDispPos++; if(!digitalRead (PORT_BUTTON2)) lcdDispPos--; } //------------------------------------------------------------------------------------------------------------ // // Start Program // //------------------------------------------------------------------------------------------------------------ int main (int argc, char *argv[]) { int timer = 0 ; wiringPiSetup (); if (system_init() < 0) { fprintf (stderr, "%s: System Init failed\n", __func__); return -1; } for(;;) { usleep(100000); if (millis () < timer) continue ; timer = millis () + LCD_UPDATE_PERIOD; // All Data update boardDataUpdate(); // lcd update lcd_update(); } return 0 ; } //------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------