Ciro Edgardo Romero
/
FoodDeposit
Sistema de supervision y alarma para deposito de comida de animales
Diff: modules/display/display.cpp
- Revision:
- 0:5e7248732177
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/display/display.cpp Fri May 14 17:27:28 2021 +0000 @@ -0,0 +1,357 @@ +//=====[Libraries]============================================================= + +#include "mbed.h" +#include "arm_book_lib.h" +#include "display.h" + +//=====[Declaration of private defines]======================================== + +#define DISPLAY_IR_CLEAR_DISPLAY 0b00000001 +#define DISPLAY_IR_ENTRY_MODE_SET 0b00000100 +#define DISPLAY_IR_DISPLAY_CONTROL 0b00001000 +#define DISPLAY_IR_FUNCTION_SET 0b00100000 +#define DISPLAY_IR_SET_DDRAM_ADDR 0b10000000 + +#define DISPLAY_IR_ENTRY_MODE_SET_INCREMENT 0b00000010 +#define DISPLAY_IR_ENTRY_MODE_SET_DECREMENT 0b00000000 +#define DISPLAY_IR_ENTRY_MODE_SET_SHIFT 0b00000001 +#define DISPLAY_IR_ENTRY_MODE_SET_NO_SHIFT 0b00000000 + +#define DISPLAY_IR_DISPLAY_CONTROL_DISPLAY_ON 0b00000100 +#define DISPLAY_IR_DISPLAY_CONTROL_DISPLAY_OFF 0b00000000 +#define DISPLAY_IR_DISPLAY_CONTROL_CURSOR_ON 0b00000010 +#define DISPLAY_IR_DISPLAY_CONTROL_CURSOR_OFF 0b00000000 +#define DISPLAY_IR_DISPLAY_CONTROL_BLINK_ON 0b00000001 +#define DISPLAY_IR_DISPLAY_CONTROL_BLINK_OFF 0b00000000 + +#define DISPLAY_IR_FUNCTION_SET_8BITS 0b00010000 +#define DISPLAY_IR_FUNCTION_SET_4BITS 0b00000000 +#define DISPLAY_IR_FUNCTION_SET_2LINES 0b00001000 +#define DISPLAY_IR_FUNCTION_SET_1LINE 0b00000000 +#define DISPLAY_IR_FUNCTION_SET_5x10DOTS 0b00000100 +#define DISPLAY_IR_FUNCTION_SET_5x8DOTS 0b00000000 + +#define DISPLAY_20x4_LINE1_FIRST_CHARACTER_ADDRESS 0 +#define DISPLAY_20x4_LINE2_FIRST_CHARACTER_ADDRESS 64 +#define DISPLAY_20x4_LINE3_FIRST_CHARACTER_ADDRESS 20 +#define DISPLAY_20x4_LINE4_FIRST_CHARACTER_ADDRESS 84 + +#define DISPLAY_RS_INSTRUCTION 0 +#define DISPLAY_RS_DATA 1 + +#define DISPLAY_RW_WRITE 0 +#define DISPLAY_RW_READ 1 + +#define DISPLAY_PIN_RS 4 +#define DISPLAY_PIN_RW 5 +#define DISPLAY_PIN_EN 6 +#define DISPLAY_PIN_D0 7 +#define DISPLAY_PIN_D1 8 +#define DISPLAY_PIN_D2 9 +#define DISPLAY_PIN_D3 10 +#define DISPLAY_PIN_D4 11 +#define DISPLAY_PIN_D5 12 +#define DISPLAY_PIN_D6 13 +#define DISPLAY_PIN_D7 14 + +#define DISPLAY_PIN_A_PCF8574 3 + +#define I2C1_SDA PB_9 +#define I2C1_SCL PB_8 + +#define PCF8574_I2C_BUS_8BIT_WRITE_ADDRESS 78 + +//=====[Declaration of private data types]===================================== + +typedef struct{ + int address; + char data; + bool displayPin_RS; + bool displayPin_RW; + bool displayPin_EN; + bool displayPin_A; + bool displayPin_D4; + bool displayPin_D5; + bool displayPin_D6; + bool displayPin_D7; +} pcf8574_t; + +//=====[Declaration and initialization of public global objects]=============== + +DigitalOut displayD0( D0 ); +DigitalOut displayD1( D1 ); +DigitalOut displayD2( D2 ); +DigitalOut displayD3( D3 ); +DigitalOut displayD4( D4 ); +DigitalOut displayD5( D5 ); +DigitalOut displayD6( D6 ); +DigitalOut displayD7( D7 ); +DigitalOut displayRS( D8 ); +DigitalOut displayEN( D9 ); + +I2C I2C_PCF8574( I2C1_SDA, I2C1_SCL ); + +//=====[Declaration of external public global variables]======================= + +//=====[Declaration and initialization of public global variables]============= + +//=====[Declaration and initialization of private global variables]============ + +static display_t display; +static pcf8574_t pcf8574; +static bool initial8BitCommunicationIsCompleted; + +//=====[Declarations (prototypes) of private functions]======================== + +static void displayPinWrite( uint8_t pinName, int value ); +static void displayDataBusWrite( uint8_t dataByte ); +static void displayCodeWrite( bool type, uint8_t dataBus ); + +//=====[Implementations of public functions]=================================== + +void displayInit( displayConnection_t connection ) +{ + display.connection = connection; + + if( display.connection == DISPLAY_CONNECTION_I2C_PCF8574_IO_EXPANDER) { + pcf8574.address = PCF8574_I2C_BUS_8BIT_WRITE_ADDRESS; + pcf8574.data = 0b00000000; + I2C_PCF8574.frequency(100000); + displayPinWrite( DISPLAY_PIN_A_PCF8574, ON ); + } + + initial8BitCommunicationIsCompleted = FALSE; + + delay( 50 ); + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_FUNCTION_SET | + DISPLAY_IR_FUNCTION_SET_8BITS ); + delay( 5 ); + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_FUNCTION_SET | + DISPLAY_IR_FUNCTION_SET_8BITS ); + delay( 1 ); + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_FUNCTION_SET | + DISPLAY_IR_FUNCTION_SET_8BITS ); + delay( 1 ); + + switch( display.connection ) { + case DISPLAY_CONNECTION_GPIO_8BITS: + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_FUNCTION_SET | + DISPLAY_IR_FUNCTION_SET_8BITS | + DISPLAY_IR_FUNCTION_SET_2LINES | + DISPLAY_IR_FUNCTION_SET_5x8DOTS ); + delay( 1 ); + break; + + case DISPLAY_CONNECTION_GPIO_4BITS: + case DISPLAY_CONNECTION_I2C_PCF8574_IO_EXPANDER: + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_FUNCTION_SET | + DISPLAY_IR_FUNCTION_SET_4BITS ); + delay( 1 ); + + initial8BitCommunicationIsCompleted = TRUE; + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_FUNCTION_SET | + DISPLAY_IR_FUNCTION_SET_4BITS | + DISPLAY_IR_FUNCTION_SET_2LINES | + DISPLAY_IR_FUNCTION_SET_5x8DOTS ); + delay( 1 ); + break; + } + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_DISPLAY_CONTROL | + DISPLAY_IR_DISPLAY_CONTROL_DISPLAY_OFF | + DISPLAY_IR_DISPLAY_CONTROL_CURSOR_OFF | + DISPLAY_IR_DISPLAY_CONTROL_BLINK_OFF ); + delay( 1 ); + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_CLEAR_DISPLAY ); + delay( 1 ); + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_ENTRY_MODE_SET | + DISPLAY_IR_ENTRY_MODE_SET_INCREMENT | + DISPLAY_IR_ENTRY_MODE_SET_NO_SHIFT ); + delay( 1 ); + + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_DISPLAY_CONTROL | + DISPLAY_IR_DISPLAY_CONTROL_DISPLAY_ON | + DISPLAY_IR_DISPLAY_CONTROL_CURSOR_OFF | + DISPLAY_IR_DISPLAY_CONTROL_BLINK_OFF ); + delay( 1 ); +} + +void displayCharPositionWrite( uint8_t charPositionX, uint8_t charPositionY ) +{ + switch( charPositionY ) { + case 0: + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_SET_DDRAM_ADDR | + ( DISPLAY_20x4_LINE1_FIRST_CHARACTER_ADDRESS + + charPositionX ) ); + delay( 1 ); + break; + + case 1: + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_SET_DDRAM_ADDR | + ( DISPLAY_20x4_LINE2_FIRST_CHARACTER_ADDRESS + + charPositionX ) ); + delay( 1 ); + break; + + case 2: + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_SET_DDRAM_ADDR | + ( DISPLAY_20x4_LINE3_FIRST_CHARACTER_ADDRESS + + charPositionX ) ); + delay( 1 ); + break; + + case 3: + displayCodeWrite( DISPLAY_RS_INSTRUCTION, + DISPLAY_IR_SET_DDRAM_ADDR | + ( DISPLAY_20x4_LINE4_FIRST_CHARACTER_ADDRESS + + charPositionX ) ); + delay( 1 ); + break; + } +} + +void displayStringWrite( char const * str ) +{ + while (*str) { + displayCodeWrite(DISPLAY_RS_DATA, *str++); + } +} + +//=====[Implementations of private functions]================================== + +static void displayCodeWrite( bool type, uint8_t dataBus ) +{ + if ( type == DISPLAY_RS_INSTRUCTION ) + displayPinWrite( DISPLAY_PIN_RS, DISPLAY_RS_INSTRUCTION); + else + displayPinWrite( DISPLAY_PIN_RS, DISPLAY_RS_DATA); + displayPinWrite( DISPLAY_PIN_RW, DISPLAY_RW_WRITE ); + displayDataBusWrite( dataBus ); +} + +static void displayPinWrite( uint8_t pinName, int value ) +{ + switch( display.connection ) { + case DISPLAY_CONNECTION_GPIO_8BITS: + switch( pinName ) { + case DISPLAY_PIN_D0: displayD0 = value; break; + case DISPLAY_PIN_D1: displayD1 = value; break; + case DISPLAY_PIN_D2: displayD2 = value; break; + case DISPLAY_PIN_D3: displayD3 = value; break; + case DISPLAY_PIN_D4: displayD4 = value; break; + case DISPLAY_PIN_D5: displayD5 = value; break; + case DISPLAY_PIN_D6: displayD6 = value; break; + case DISPLAY_PIN_D7: displayD7 = value; break; + case DISPLAY_PIN_RS: displayRS = value; break; + case DISPLAY_PIN_EN: displayEN = value; break; + case DISPLAY_PIN_RW: break; + default: break; + } + case DISPLAY_CONNECTION_GPIO_4BITS: + switch( pinName ) { + case DISPLAY_PIN_D4: displayD4 = value; break; + case DISPLAY_PIN_D5: displayD5 = value; break; + case DISPLAY_PIN_D6: displayD6 = value; break; + case DISPLAY_PIN_D7: displayD7 = value; break; + case DISPLAY_PIN_RS: displayRS = value; break; + case DISPLAY_PIN_EN: displayEN = value; break; + case DISPLAY_PIN_RW: break; + default: break; + } + break; + + case DISPLAY_CONNECTION_I2C_PCF8574_IO_EXPANDER: + if ( value ) { + switch( pinName ) { + case DISPLAY_PIN_D4: pcf8574.displayPin_D4 = ON; break; + case DISPLAY_PIN_D5: pcf8574.displayPin_D5 = ON; break; + case DISPLAY_PIN_D6: pcf8574.displayPin_D6 = ON; break; + case DISPLAY_PIN_D7: pcf8574.displayPin_D7 = ON; break; + case DISPLAY_PIN_RS: pcf8574.displayPin_RS = ON; break; + case DISPLAY_PIN_EN: pcf8574.displayPin_EN = ON; break; + case DISPLAY_PIN_RW: pcf8574.displayPin_RW = ON; break; + case DISPLAY_PIN_A_PCF8574: pcf8574.displayPin_A = ON; break; + default: break; + } + } + else { + switch( pinName ) { + case DISPLAY_PIN_D4: pcf8574.displayPin_D4 = OFF; break; + case DISPLAY_PIN_D5: pcf8574.displayPin_D5 = OFF; break; + case DISPLAY_PIN_D6: pcf8574.displayPin_D6 = OFF; break; + case DISPLAY_PIN_D7: pcf8574.displayPin_D7 = OFF; break; + case DISPLAY_PIN_RS: pcf8574.displayPin_RS = OFF; break; + case DISPLAY_PIN_EN: pcf8574.displayPin_EN = OFF; break; + case DISPLAY_PIN_RW: pcf8574.displayPin_RW = OFF; break; + case DISPLAY_PIN_A_PCF8574: pcf8574.displayPin_A = OFF; break; + default: break; + } + } + pcf8574.data = 0b00000000; + if ( pcf8574.displayPin_RS ) pcf8574.data |= 0b00000001; + if ( pcf8574.displayPin_RW ) pcf8574.data |= 0b00000010; + if ( pcf8574.displayPin_EN ) pcf8574.data |= 0b00000100; + if ( pcf8574.displayPin_A ) pcf8574.data |= 0b00001000; + if ( pcf8574.displayPin_D4 ) pcf8574.data |= 0b00010000; + if ( pcf8574.displayPin_D5 ) pcf8574.data |= 0b00100000; + if ( pcf8574.displayPin_D6 ) pcf8574.data |= 0b01000000; + if ( pcf8574.displayPin_D7 ) pcf8574.data |= 0b10000000; + I2C_PCF8574.write( pcf8574.address, &pcf8574.data, 1); + break; + } +} + +static void displayDataBusWrite( uint8_t dataBus ) +{ + displayPinWrite( DISPLAY_PIN_EN, OFF ); + displayPinWrite( DISPLAY_PIN_D7, dataBus & 0b10000000 ); + displayPinWrite( DISPLAY_PIN_D6, dataBus & 0b01000000 ); + displayPinWrite( DISPLAY_PIN_D5, dataBus & 0b00100000 ); + displayPinWrite( DISPLAY_PIN_D4, dataBus & 0b00010000 ); + switch( display.connection ) { + case DISPLAY_CONNECTION_GPIO_8BITS: + displayPinWrite( DISPLAY_PIN_D3, dataBus & 0b00001000 ); + displayPinWrite( DISPLAY_PIN_D2, dataBus & 0b00000100 ); + displayPinWrite( DISPLAY_PIN_D1, dataBus & 0b00000010 ); + displayPinWrite( DISPLAY_PIN_D0, dataBus & 0b00000001 ); + break; + + case DISPLAY_CONNECTION_GPIO_4BITS: + case DISPLAY_CONNECTION_I2C_PCF8574_IO_EXPANDER: + if ( initial8BitCommunicationIsCompleted == TRUE) { + displayPinWrite( DISPLAY_PIN_EN, ON ); + delay( 1 ); + displayPinWrite( DISPLAY_PIN_EN, OFF ); + delay( 1 ); + displayPinWrite( DISPLAY_PIN_D7, dataBus & 0b00001000 ); + displayPinWrite( DISPLAY_PIN_D6, dataBus & 0b00000100 ); + displayPinWrite( DISPLAY_PIN_D5, dataBus & 0b00000010 ); + displayPinWrite( DISPLAY_PIN_D4, dataBus & 0b00000001 ); + } + break; + + } + displayPinWrite( DISPLAY_PIN_EN, ON ); + delay( 1 ); + displayPinWrite( DISPLAY_PIN_EN, OFF ); + delay( 1 ); +} \ No newline at end of file