#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <errno.h>
#include <wiringPi.h>
#include <lcd.h>
// MCP23S17 Registers
#define IOCON 0x0A
#define IODIRA 0x00
#define IPOLA 0x02
#define GPINTENA 0x04
#define DEFVALA 0x06
#define INTCONA 0x08
#define GPPUA 0x0C
#define INTFA 0x0E
#define INTCAPA 0x10
#define GPIOA 0x12
#define OLATA 0x14
#define IODIRB 0x01
#define IPOLB 0x03
#define GPINTENB 0x05
#define DEFVALB 0x07
#define INTCONB 0x09
#define GPPUB 0x0D
#define INTFB 0x0F
#define INTCAPB 0x11
#define GPIOB 0x13
#define OLATB 0x15
// Bits in the IOCON register
#define IOCON_BANK_MODE 0x80
#define IOCON_MIRROR 0x40
#define IOCON_SEQOP 0x20
#define IOCON_DISSLW 0x10
#define IOCON_HAEN 0x08
#define IOCON_ODR 0x04
#define IOCON_INTPOL 0x02
#define IOCON_UNUSED 0x01
// Default initialisation mode
// RGB Backlight Values for Adafruit Raspberry Pi RGB-LCD display
#define OFF 0x0
#define RED 0x01
#define GREEN 0x02
#define YELLOW 0x03
#define BLUE 0x04
#define VIOLET 0x05
#define TEAL 0x06
#define WHITE 0x07
#define RED_LED 0xBF
#define GREEN_LED 0x7F
//BLUE_LED is controlled by the state of bit 0 of oldval
#define TRUE 1
#define FALSE 0
int x, y, xio, fd2, oldval, rows, cols, isRGB;
char *color;
void lcd_pinMode(int pin, int mode);
void lcd_digitalWrite(int pin, int value);
int main (void)
{
oldval = 0;
rows = 4;
cols = 20;
isRGB = TRUE;
i2cAddr = 0x20;
if(isRGB == TRUE)
{
oldval &= 0xFE; // turn Blue_LED ON
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, (GREEN_LED & RED_LED) ) ; //Turn RED_LED and GREEN_LED on
color = "WHITE";
}else{
oldval |= 0x01; // turn Blue_LED OFF
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, RED_LED) ; // Turn BACKLIGHT on
color = "NO RGB";
}
printf ("Raspberry Pi LCD test program\n") ;
xio = wiringPiI2CSetup (i2cAddr);
if (xio < 0){
printf ("xio: Unable to initialise I2C: %s\n", strerror (errno));
return 1;
}
wiringPiI2CWriteReg8 (xio, IOCON, 0x84) ; // IOCON - set BANK bit
wiringPiI2CWriteReg8 (xio, IODIRA, 0x3F) ; // Port A -> Outputs
wiringPiI2CWriteReg8 (xio, IODIRB, 0x00) ; // Port B -> Outputs
digitalWrite = lcd_digitalWrite;
pinMode = lcd_pinMode;
fd2 = lcdInit(rows, cols, 4, 7, 5, 4, 3, 2, 1, 0, 0, 0, 0);
if(fd2 < 0){
printf ("lcdInit 2 failed\n") ;
return 1 ;
}
sleep (1) ;
x = 0;
y = 0;
for(;;)
{
if (rows == 4)
{
lcdPosition (fd2, 0, 0) ; lcdPrintf (fd2, " Adafruit %s ", color) ;
lcdPosition (fd2, 0, 1) ; lcdPuts (fd2, " Raspberry Pi ") ;
lcdPosition (fd2, 0, 2) ; lcdPuts (fd2, " RGB-LCD Plate Test ") ;
lcdPosition (fd2, 0, 3) ; lcdPrintf (fd2, "Iteration: %d", x) ;
}else if(rows == 2){
lcdPosition (fd2, 0, 0) ; lcdPrintf (fd2, "Adafruit %s ", color) ;
lcdPosition (fd2, 0, 1) ; lcdPrintf (fd2, "Iteration:%d", x) ;
}
x++;
if(x % 10 == 0)
{
y++;
if(y < 1 || y > 7){y = 1;}
if(isRGB == TRUE)
{
switch(y)
{
case RED:
{
oldval |= 0x01; // turn Blue_LED OFF
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, RED_LED) ; // Turn RED_LED on
color = "RED";
break;
}
case GREEN:
{
oldval |= 0x01; // turn Blue_LED OFF
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, GREEN_LED) ; // Turn GREEN_LED on
color = "GREEN";
break;
}
case YELLOW:
{
oldval |= 0x01; // turn Blue_LED OFF
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, (GREEN_LED & RED_LED) ) ; //Turn RED_LED and GREEN_LED on
color = "YELLOW";
break;
}
case BLUE:
{
oldval &= 0xFE; // turn Blue_LED ON
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, (GREEN_LED | RED_LED) ) ; //Turn RED_LED and GREEN_LED off
color = "BLUE";
break;
}
case VIOLET:
{
oldval &= 0xFE; // turn Blue_LED ON
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, RED_LED) ; //Turn RED_LED on
color = "VIOLET";
break;
}
case TEAL:
{
oldval &= 0xFE; // turn Blue_LED ON
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, GREEN_LED ) ; //Turn GREEN_LED on
color = "TEAL";
break;
}
case WHITE:
{
oldval &= 0xFE; // turn Blue_LED ON
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, (GREEN_LED & RED_LED) ) ; //Turn RED_LED and GREEN_LED on
color = "WHITE";
break;
}
}
}else{
oldval |= 0x01; // turn Blue_LED OFF
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
wiringPiI2CWriteReg8 (xio, OLATA, RED_LED) ; // Turn BACKLIGHT on
color = "NO RGB";
}
}
}
return 0;
}
void lcd_pinMode(int pin, int mode){}
void lcd_digitalWrite(int pin, int value)
{
oldval &= ~(1 << pin);
oldval |= value << pin;
wiringPiI2CWriteReg8 (xio, OLATB, oldval) ;
}