Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
en:odroid-c-io [2014/12/06 19:06] odroid |
en:odroid-c-io [2014/12/06 19:12] (current) odroid |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | === ODROID-C1 16x2 LCD + IO Shield === | ||
+ | <code> | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // ODROID-C 16x2 LCD / LED / Button Test Application. | ||
+ | // | ||
+ | // Defined port number is wiringPi port number. | ||
+ | // | ||
+ | // Compile : gcc -o <create excute file name> <source file name> -lwiringPi -lwiringPiDev -lpthread | ||
+ | // Run : sudo ./<created excute file name> | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <stdint.h> | ||
+ | |||
+ | #include <unistd.h> | ||
+ | #include <string.h> | ||
+ | #include <time.h> | ||
+ | |||
+ | #include <wiringPi.h> | ||
+ | #include <wiringPiI2C.h> | ||
+ | #include <wiringSerial.h> | ||
+ | #include <lcd.h> | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // 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(;;) { | ||
+ | |||
+ | if (millis () < timer) continue ; | ||
+ | |||
+ | timer = millis () + LCD_UPDATE_PERIOD; | ||
+ | |||
+ | // All Data update | ||
+ | boardDataUpdate(); | ||
+ | |||
+ | // lcd update | ||
+ | lcd_update(); | ||
+ | } | ||
+ | |||
+ | return 0 ; | ||
+ | } | ||
+ | </code> | ||