From 3778166f5d49f3c179cfd274a8c1860bf210c91d Mon Sep 17 00:00:00 2001 From: RichardBarry Date: Thu, 14 Apr 2011 09:31:18 +0000 Subject: [PATCH] Add OLED driver to the StmartFusion demo. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1357 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../MicroSemi_Code/drivers/OLED/oled.c | 536 ++++++++++++++++++ .../MicroSemi_Code/drivers/OLED/oled.h | 209 +++++++ 2 files changed, 745 insertions(+) create mode 100644 Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.c create mode 100644 Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.h diff --git a/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.c b/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.c new file mode 100644 index 000000000..e6b9d8e5c --- /dev/null +++ b/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.c @@ -0,0 +1,536 @@ +/***************************************************************************** + * (c) Copyright 2009 Actel Corporation. All rights reserved. + * + * Author : Actel Application Team + * Rev : 1.0.0.0 + * Description: Device driver for the on-board OLED for SmartFusion KITS + * Implementation of sample basic driver for OLED display found on Actel + * SmartFusion development boards. + * This code is intended as an example of using the SmartFusion I2C driver. + *****************************************************************************/ + + #include "oled.h" +#include "../bsp_config.h" + +/***************************************************************************//** + Command definitions for the SSD300 controller inside the OLED display module. + */ +#define CMD_DISPLAY_OFF_SET 0xD3 +#define CMD_PANEL_ON 0xAF +#define CMD_PANEL_OFF 0xAE +#define CMD_DC_DC 0xAD +#define CMD_DC_DC_DEFAULT_ON 0x8B +#define CMD_DC_DC_OFF 0x8A +#define CMD_DISPLAY_ALL_ON 0xA5 +#define CMD_DISPLAY_ALL_OFF 0xA4 +#define CMD_DISPLAY_NON_INV 0xA6 +#define CMD_DISPLAY_INV 0xA7 +#define CMD_ARECOL_LPM 0xD8 +#define CMD_ARECOL_MONO 0x00 +#define CMD_ARECOL_COLOR 0x30 +#define CMD_LPM_ON 0x05 +#define CMD_LPM_OFF 0x00 +#define CMD_CONTRAST 0x81 +#define CMD_MIRROR_HORI_ON 0xC8 +#define CMD_MIRROR_HORI_OFF 0xC0 +#define CMD_MIRROR_VERT_ON 0xA1 +#define CMD_MIRROR_VERT_OFF 0xA0 +#define CMD_HORI_SCRL 0x26 +#define CMD_HORI_SCRL_ON 0x2F +#define CMD_HORI_SCRL_OFF 0x2E +#define CMD_MUX_RATIO 0xA8 +#define CMD_MUX_RATIO_31 0x23 + +#define CMD_PAGE_0 0xB0 +#define CMD_PAGE_1 0xB1 +#define CMD_PAGE_2 0xB2 +#define CMD_PAGE_3 0xB3 +#define CMD_PAGE_4 0xB4 +#define CMD_PAGE_5 0xB5 + +#define CMD_LOW_NIB_COL 0x00 +#define CMD_HIGH_NIB_COL 0x10 + +#define CMD_START_LINE 0x50 +#define CONTRAST_DEFAULT 0xFF +#define CONTRAST_25_PERC 0x40 +#define CONTRAST_100_PERC 0xFF +#define CONTRAST_0_PERC 0x00 +#define SCROLL_1_COLUMN 0x01 +#define SCROLL_2_COLUMN 0x02 +#define SCROLL_3_COLUMN 0x03 +#define SCROLL_4_COLUMN 0x04 +#define SCROLL_PAGE_0 0x00 +#define SCROLL_PAGE_1 0x01 +#define SCROLL_PAGE_2 0x02 +#define SCROLL_PAGE_3 0x03 +#define SCROLL_PAGE_4 0x04 +#define SCROLL_PAGE_5 0x05 +#define SCROLL_12_FRAMES 0x00 +#define SCROLL_64_FRAMES 0x01 +#define SCROLL_128_FRAMES 0x02 +#define SCROLL_256_FRAMES 0x03 +#define SCROLL_PER_STEP 0x01 +#define PAGE0_COLOR_BAG 0x92 +#define PAGE1_COLOR_BAG 0x93 + +/***************************************************************************//** + OLED display I2C communication protocol control byte values. Used to indicate + whether the byte following the control byte is to be interpreted by the OLED + display as a command or data byte. + */ +#define OLED_COMMAND_CODE 0x80 +#define OLED_DATA_CODE 0xC0 + +/***************************************************************************//** + I2C serial address of OLED display. + */ +#define OLED_SLAVE_ADDRESS 0x78 + +/***************************************************************************//** + Bitmaps of the character set. + Each character is 5 pixels wide and 7 pixels high. + The table is indexed on ASCII character codes. + */ +#define CHARACTER_WIDTH 5 + +const unsigned char oled_ascii_character_set[255][CHARACTER_WIDTH] = +{ + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + + {0x00, 0x00, 0x5F, 0x00, 0x00}, + {0x00, 0x07, 0x00, 0x07, 0x00}, + {0x14, 0x7F, 0x14, 0x7F, 0x14}, + {0x24, 0x2A, 0x7F, 0x2A, 0x12}, + {0x23, 0x13, 0x08, 0x64, 0x62}, + {0x36, 0x49, 0x55, 0x22, 0x50}, + {0x00, 0x05, 0x03, 0x00, 0x00}, + {0x00, 0x1C, 0x22, 0x41, 0x00}, + {0x00, 0x41, 0x22, 0x1C, 0x00}, + {0x14, 0x08, 0x3E, 0x08, 0x14}, + {0x08, 0x08, 0x3E, 0x08, 0x08}, + {0x00, 0x50, 0x30, 0x00, 0x00}, + {0x08, 0x08, 0x08, 0x08, 0x08}, + {0x00, 0x60, 0x60, 0x00, 0x00}, + {0x20, 0x10, 0x08, 0x04, 0x02}, + {0x3E, 0x51, 0x49, 0x45, 0x3E}, + {0x00, 0x42, 0x7F, 0x40, 0x00}, + {0x42, 0x61, 0x51, 0x49, 0x46}, + {0x21, 0x41, 0x45, 0x4B, 0x31}, + {0x18, 0x14, 0x12, 0x7F, 0x10}, + {0x27, 0x45, 0x45, 0x45, 0x39}, + {0x3C, 0x4A, 0x49, 0x49, 0x30}, + {0x01, 0x71, 0x09, 0x05, 0x03}, + {0x36, 0x49, 0x49, 0x49, 0x36}, + {0x06, 0x49, 0x49, 0x29, 0x1E}, + {0x00, 0x36, 0x36, 0x00, 0x00}, + {0x00, 0x56, 0x36, 0x00, 0x00}, + {0x08, 0x14, 0x22, 0x41, 0x00}, + {0x14, 0x14, 0x14, 0x14, 0x14}, + {0x00, 0x41, 0x22, 0x14, 0x08}, + {0x02, 0x01, 0x51, 0x09, 0x06}, + {0x32, 0x49, 0x79, 0x41, 0x3E}, + {0x7E, 0x11, 0x11, 0x11, 0x7E}, + {0x7F, 0x49, 0x49, 0x49, 0x36}, + {0x3E, 0x41, 0x41, 0x41, 0x22}, + {0x7F, 0x41, 0x41, 0x22, 0x1C}, + {0x7F, 0x49, 0x49, 0x49, 0x41}, + {0x7F, 0x09, 0x09, 0x09, 0x01}, + {0x3E, 0x41, 0x49, 0x49, 0x7A}, + {0x7F, 0x08, 0x08, 0x08, 0x7F}, + {0x00, 0x41, 0x7F, 0x41, 0x00}, + {0x20, 0x40, 0x41, 0x3F, 0x01}, + {0x7F, 0x08, 0x14, 0x22, 0x41}, + {0x3F, 0x40, 0x40, 0x40, 0x40}, + {0x7F, 0x02, 0x0C, 0x02, 0x7F}, + {0x7F, 0x04, 0x08, 0x10, 0x7F}, + {0x3E, 0x41, 0x41, 0x41, 0x3E}, + {0x7F, 0x09, 0x09, 0x09, 0x06}, + {0x3E, 0x41, 0x51, 0x21, 0x5E}, + {0x7F, 0x09, 0x19, 0x29, 0x46}, + {0x46, 0x49, 0x49, 0x49, 0x31}, + {0x01, 0x01, 0x7F, 0x01, 0x01}, + {0x3F, 0x40, 0x40, 0x40, 0x3F}, + {0x1F, 0x20, 0x40, 0x20, 0x1F}, + {0x3F, 0x40, 0x38, 0x40, 0x3F}, + {0x63, 0x14, 0x08, 0x14, 0x63}, + {0x07, 0x08, 0x70, 0x08, 0x07}, + {0x61, 0x51, 0x49, 0x45, 0x43}, + {0x00, 0x7F, 0x41, 0x41, 0x00}, + {0x02, 0x04, 0x08, 0x10, 0x20}, + {0x00, 0x41, 0x41, 0x7F, 0x00}, + {0x04, 0x02, 0x01, 0x02, 0x04}, + {0x40, 0x40, 0x40, 0x40, 0x40}, + {0x00, 0x01, 0x02, 0x04, 0x00}, + {0x20, 0x54, 0x54, 0x54, 0x78}, + {0x7F, 0x48, 0x44, 0x44, 0x38}, + {0x38, 0x44, 0x44, 0x44, 0x20}, + {0x30, 0x48, 0x48, 0x50, 0x7F}, + {0x38, 0x54, 0x54, 0x54, 0x18}, + {0x10, 0x7E, 0x11, 0x01, 0x02}, + {0x0C, 0x52, 0x52, 0x52, 0x3E}, + {0x7F, 0x08, 0x04, 0x04, 0x78}, + {0x00, 0x44, 0x7D, 0x40, 0x00}, + {0x20, 0x40, 0x44, 0x3D, 0x00}, + {0x7F, 0x10, 0x28, 0x44, 0x00}, + {0x00, 0x41, 0x7F, 0x40, 0x00}, + {0x7C, 0x04, 0x18, 0x04, 0x78}, + {0x7C, 0x08, 0x04, 0x04, 0x78}, + {0x38, 0x44, 0x44, 0x44, 0x38}, + {0x7C, 0x14, 0x14, 0x14, 0x08}, + {0x08, 0x14, 0x14, 0x18, 0x7C}, + {0x7C, 0x08, 0x04, 0x04, 0x08}, + {0x48, 0x54, 0x54, 0x54, 0x20}, + {0x04, 0x3F, 0x44, 0x40, 0x20}, + {0x3C, 0x40, 0x40, 0x20, 0x7C}, + {0x1C, 0x20, 0x40, 0x20, 0x1C}, + {0x3C, 0x40, 0x30, 0x40, 0x3C}, + {0x44, 0x28, 0x10, 0x28, 0x44}, + {0x0C, 0x50, 0x50, 0x50, 0x3C}, + {0x44, 0x64, 0x54, 0x4C, 0x44}, + + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00}, + + {0x07, 0x05, 0x07, 0x00, 0x00}, + {0x12, 0x19, 0x16, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00} + +}; + +#define FIRST_CHARACTER 0 + +/***************************************************************************//** + The g_p_oled_i2c global variable is only used inside the OLED driver. It + identifies the MSS I2C block used to communicate with the OLED display. + */ +static mss_i2c_instance_t * g_p_oled_i2c = OLED_I2C_INSTANCE; + +/***************************************************************************//** + The OLED_set_cursor function sets the cursor position. + + @param line + The line parameter specifies the line at which to set the cursor. It can + take the values: + - FIRST_LINE + - SECOND_LINE + + @param char_offset + The char_offset paraemter specifies the character offset on a line where to + set the cursor location. It can be set to FIRST_CHARACTER to set the cursor + at the start of a line. + */ +void OLED_set_cursor +( + uint8_t line, + uint8_t char_offset +); +/***************************************************************************//** + The OLED_write_string function displays the input string to the OLED panel. + + @param string + The string parameter is a pointer to the zero-terminated to display on the + OLED. + */ +void OLED_write_string( const char *string); + +/***************************************************************************//** + The OLED_write_char function displays a single character to the display. + + @param data_char + The data_char parameter is the ASCII code of the character to display. +*/ +void OLED_write_char( const uint8_t data_char ); +/***************************************************************************//** + OLED_init() + See "oled.h" for details of how to use this function. + */ +void OLED_init(void ) +{ + uint8_t oled_init_sequence1[] = + { + OLED_COMMAND_CODE, CMD_DISPLAY_NON_INV, + OLED_COMMAND_CODE, CMD_DISPLAY_ALL_OFF, + OLED_COMMAND_CODE, CMD_MIRROR_HORI_ON, + OLED_COMMAND_CODE, CMD_MIRROR_VERT_OFF, + OLED_COMMAND_CODE, CMD_HORI_SCRL_OFF, + OLED_COMMAND_CODE, CMD_CONTRAST, + OLED_COMMAND_CODE, CONTRAST_DEFAULT, + OLED_COMMAND_CODE, CMD_ARECOL_LPM, + OLED_COMMAND_CODE, CMD_ARECOL_MONO^CMD_LPM_OFF + }; + + uint8_t oled_init_sequence2[] = + { + OLED_COMMAND_CODE, CMD_START_LINE, + OLED_COMMAND_CODE, CMD_PANEL_ON + }; + + MSS_I2C_init( g_p_oled_i2c, OLED_SLAVE_ADDRESS, MSS_I2C_PCLK_DIV_60 ); + + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, oled_init_sequence1, sizeof(oled_init_sequence1), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + + OLED_clear_display(BOTH_LINES); + + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, oled_init_sequence2, sizeof(oled_init_sequence2), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + + OLED_set_cursor( FIRST_LINE, FIRST_CHARACTER ); +} + +/***************************************************************************//** + OLED_clear_display() + See "oled.h" for details of how to use this function. + */ +void OLED_clear_display( oled_no_of_line LINES ) +{ + uint8_t i, j,start_line,end_line; + uint8_t clear_8_columns[] = + { + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00, + OLED_DATA_CODE, 0x00 + }; + + switch(LINES) + { + case FIRST_LINE: + { + start_line = FIRST_LINE; + end_line = FIRST_LINE; + } + + case SECOND_LINE: + { + start_line = SECOND_LINE; + end_line = SECOND_LINE; + } + + case BOTH_LINES: + { + start_line = FIRST_LINE; + end_line = SECOND_LINE; + } + + } + + for( j = start_line; j <= end_line; ++j ) + { + OLED_set_cursor( j, FIRST_CHARACTER ); + for( i = 0; i < 13; ++i ) + { + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, clear_8_columns, sizeof(clear_8_columns), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + } + } +} + +/***************************************************************************//** + OLED_set_cursor() + See definition of OLED_set_cursor() for details of how to use this function. + */ +void OLED_set_cursor +( + uint8_t line, + uint8_t char_offset +) +{ + uint8_t command_sequence[] = + { + OLED_COMMAND_CODE, CMD_LOW_NIB_COL, + OLED_COMMAND_CODE, CMD_HIGH_NIB_COL, + OLED_COMMAND_CODE, CMD_PAGE_0 + }; + uint8_t low_nib, high_nib; + + ++char_offset; + char_offset *= CHARACTER_WIDTH; + low_nib = 0x0F & char_offset; + high_nib = (0xF0 & char_offset) >> 4; + line += 2; + + command_sequence[1] |= low_nib; + command_sequence[3] |= high_nib; + command_sequence[5] |= line; + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, command_sequence, sizeof(command_sequence), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); +} + +/***************************************************************************//** + OLED_write_string() + See definition of OLED_write_string for details of how to use this function. + */ +void OLED_write_string +( + const char *string +) +{ + while (*string != 0) + { + OLED_write_char( *string ); + ++string; + } +} + +/***************************************************************************//** + OLED_write_char() + See definition of OLED_write_char() for details of how to use this function. + */ +void OLED_write_char +( + const uint8_t data_char +) +{ + uint8_t txbuff[10]; + uint8_t i; + + for ( i = 0; i < CHARACTER_WIDTH; ++i ) + { + txbuff[i * 2] = OLED_DATA_CODE; + txbuff[(i * 2) + 1] = oled_ascii_character_set[data_char][i]; + } + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, txbuff, sizeof(txbuff), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); +} + +/***************************************************************************//** + OLED_horizontal_scroll() + See "oled.h" for details of how to use this function. + */ +void OLED_horizontal_scroll(struct oled_data * horiz_scroll) +{ + uint8_t horiz_scroll_on_off[] = + { + OLED_COMMAND_CODE, CMD_HORI_SCRL_OFF, + }; + + uint8_t horiz_scroll_setup_data[] = + { + OLED_COMMAND_CODE, CMD_HORI_SCRL, + OLED_COMMAND_CODE, SCROLL_PER_STEP, + OLED_COMMAND_CODE, SCROLL_PAGE_0, + OLED_COMMAND_CODE, SCROLL_12_FRAMES, + OLED_COMMAND_CODE, SCROLL_PAGE_1, + }; + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, horiz_scroll_on_off, sizeof(horiz_scroll_on_off), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + + if(horiz_scroll->on_off == 1) + { + horiz_scroll_setup_data[3] = horiz_scroll->column_scrool_per_step; + horiz_scroll_setup_data[5] = horiz_scroll->start_page; + horiz_scroll_setup_data[7] = horiz_scroll->time_intrval_btw_scroll_step; + horiz_scroll_setup_data[9] = horiz_scroll->end_page; + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, horiz_scroll_setup_data, sizeof(horiz_scroll_setup_data), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + + horiz_scroll_on_off[1] = CMD_HORI_SCRL_ON; + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, horiz_scroll_on_off, sizeof(horiz_scroll_on_off), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + } +} + +/***************************************************************************//** + OLED_contrast() + See "oled.h" for details of how to use this function. + */ +void OLED_contrast(uint8_t color_contrast) +{ + uint8_t oled_contrast[] = + { + OLED_COMMAND_CODE, CMD_CONTRAST, + OLED_COMMAND_CODE, CONTRAST_DEFAULT, + }; + + oled_contrast[3] = color_contrast; + MSS_I2C_write( g_p_oled_i2c, OLED_SLAVE_ADDRESS, oled_contrast, sizeof(oled_contrast), MSS_I2C_RELEASE_BUS ); + MSS_I2C_wait_complete( g_p_oled_i2c ); + +} + +/***************************************************************************//** + OLED_write_data() + See "oled.h" for details of how to use this function. + */ +void OLED_write_data(struct oled_data* data, oled_no_of_line LINES) +{ + uint8_t line; + uint8_t char_offset; + char *string; + + switch(LINES) + { + + case FIRST_LINE: + { + OLED_clear_display(FIRST_LINE); + line = data->line1; + char_offset = data->char_offset1; + string = data->string1; + } + + case SECOND_LINE: + { + OLED_clear_display(SECOND_LINE); + line = data->line2; + char_offset = data->char_offset2; + string = data->string2; + } + + case BOTH_LINES: + { + OLED_clear_display(BOTH_LINES); + line = data->line1; + char_offset = data->char_offset1; + string = data->string1; + OLED_set_cursor(line,char_offset); + OLED_write_string(string); + line = data->line2; + char_offset = data->char_offset2; + string = data->string2; + } + + OLED_set_cursor(line,char_offset); + OLED_write_string(string); + OLED_contrast(data->contrast_val); + } +} diff --git a/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.h b/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.h new file mode 100644 index 000000000..35a826098 --- /dev/null +++ b/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/OLED/oled.h @@ -0,0 +1,209 @@ +/***************************************************************************** + * (c) Copyright 2009 Actel Corporation. All rights reserved. + * + * Author : Actel Application Team + * Rev : 1.0.0.0 + * Description: Device driver for the on-board OLED for SmartFusion KITS + * API of sample basic driver for OLED display found on Actel SmartFusion + * development boards. + * This code is intended as an example of using the SmartFusion I2C driver. + * + */ +#ifndef OLED_H_ +#define OLED_H_ + +#include "../BSP/i2c_driver/i2c.h" + +#define OLED_HORIZ_SCROLL_ON 0x01 +#define OLED_HORIZ_SCROLL_OFF 0x00 +#define OLED_HORIZ_SCROLL_STEP 0x08 +#define OLED_CONTRAST_VAL 0xFF +#define OLED_START_PAGE 0x01 +#define OLED_HORIZ_SCROLL_TINVL 0x00 +#define OLED_END_PAGE 0x05 +/*-------------------------------------------------------------------------*/ +/* The oled_no_of_line type represents number of lines to be written on OLED. + FIRST LINE : The OLED cursor is set to line number 1 and only 1 line is + printed on OLED + SECOND_LINE : The OLED cursor is set to line number 2 and only 1 line is + printed on OLED + BOTH_LINES : The OLED cursor is set to line number 1 and line 1 and line 2 + are printed on OLED +*/ +typedef enum { + FIRST_LINE = 0, + SECOND_LINE, + BOTH_LINES +} oled_no_of_line; + +/*-------------------------------------------------------------------------*//** + oled_data + ------------------------------------------------------------------------------ + There is one instance of this structure for OLED data. Instances of this + structure is used to provide the data to OLED. A pointer to an instance of + the oled_data structure is passed as the parameter OLED driver functions. + */ +struct oled_data +{ + /* Represents line number, where String 1 has to be printed */ + uint8_t line1; + /* Represents character offset within the line1, from where String 1 has to be + * printed */ + uint8_t char_offset1; + /* Represents line number, where String 2 has to be printed */ + uint8_t line2; + /* Represents character offset within the line2, from where String 2 has to be + * printed */ + uint8_t char_offset2; + /* String 1 holds the data to be displayed on line 1 of OLED, It has to be + * less that 49 characters*/ + char *string1; + /* String 1 holds the data to be displayed on line 2 of OLED, It has to be + * less that 49 characters*/ + char *string2; + /* Holds the contrast value to be set for String 1 and String 2 */ + uint8_t contrast_val; + /* Represents ON or OFF for horizontal scrolling */ + uint8_t on_off; + /* Represents number of coumns scrolls per step for horizontal scroll*/ + unsigned char column_scrool_per_step; + /* Represents start page for horizontal scroll*/ + unsigned char start_page; + /* Represents time interval for horizontal scroll*/ + unsigned char time_intrval_btw_scroll_step; + /* Represents end page for horizontal scroll*/ + unsigned char end_page; + +}; +/***************************************************************************//** + The following defines can be used as parameter to the OLED_set_cursor() + function. + */ + +/***************************************************************************//** + The OLED_init function initializes the OLED display. + */ +void OLED_init( void ); + +/***************************************************************************//** + This function(OLED_clear_display) clears the content of the display RAM + based on the LINES input. + ------------------------------------------------------------------------------ + @param oled_no_of_line: + The oled_no_of_line parameter enum that holds Number of lines. + If FIRST_LINE is passed as parameter to this function thnen, this functions + clears only First line that is 0 + If SECOND_LINE is passed as parameter to this function thnen, this functions + clears only Second line that is 1 + If BOTH_LINE is passed as parameter to this function thnen, this functions + clears entire OLED display. + */ +void OLED_clear_display( oled_no_of_line LINES ); + +/*-------------------------------------------------------------------------*//** + OLED Write data. + ------------------------------------------------------------------------------ + This function (OLED_write_data ) writes the data to OLED basedon the + parameters passed to this function. + ------------------------------------------------------------------------------ + @param data: + The data parameter is a pointer to an oled_data structure, that holds + different fields of data to be required for OLED (see the oled_data structure + definition). + + @param oled_no_of_line: + The oled_no_of_line parameter enum that holds Number of lines. + If FIRST_LINE is passed as parameter to this function thnen, this functions + wtites string 1 at FIRST LINE + If SECOND_LINE is passed as parameter to this function thnen, this functions + wtites string 1 at SECOND LINE + If BOTH_LINE is passed as parameter to this function thnen, this functions + wtites string 1 and string 2 at FIRST LINE and SECOND LINE respectively. +Example: + @code +#include "drivers/mss_watchdog/mss_watchdog.h" +#include "oled.h" +#define FIRST_CHARACTER 0 + +int main() +{ + + char *string1="SmartFusion"; + char *string2="INNOVATIVE "; + struct oled_data write_data; + + write_data.line1 = FIRST_LINE; + write_data.char_offset1 = FIRST_CHARACTER; + write_data.string1 = string1; + write_data.line2 = SECOND_LINE; + write_data.char_offset2 = FIRST_CHARACTER; + write_data.string2 = string2; + write_data.contrast_val = 0x01; + + MSS_WD_disable(); + OLED_init(); + OLED_write_data(&write_data,BOTH_LINES); + return 0; +} + @endcode + */ + +void OLED_write_data(struct oled_data * data, oled_no_of_line flag); + +/*-------------------------------------------------------------------------*//** + OLED Horizontal scrolling. + ------------------------------------------------------------------------------ + This function (OLED_horizontal_scroll ) enbles the Horizontal scrolling. + ------------------------------------------------------------------------------ + @param data: + The horiz_scroll parameter is a pointer to an oled_data structure, that holds + different fields of data to be required for OLED (see the oled_data structure + definition). +Example: + @code + +int main() +{ + + char *string1="SmartFusion"; + char *string2="INNOVATIVE "; + struct oled_data write_data; + + write_data.line1 = FIRST_LINE; + write_data.char_offset1 = FIRST_CHARACTER; + write_data.string1 = string1; + write_data.line2 = SECOND_LINE; + write_data.char_offset2 = FIRST_CHARACTER; + write_data.string2 = string2; + write_data.contrast_val = 0x01; + write_data.on_off = 0x01; + write_data.column_scrool_per_step = 0x08; + write_data.start_page = 0x01; + write_data.time_intrval_btw_scroll_step = 0x00; + write_data.end_page = 0x05; + + MSS_WD_disable(); + OLED_init(); + OLED_write_data(&write_data,BOTH_LINES); + OLED_horizontal_scroll(&write_data); + return 0; +} + @endcode + */ + +void OLED_horizontal_scroll(struct oled_data * horiz_scroll); + +/***************************************************************************//** + This function(OLED_contrast) sets ths conrtast to the data displayed on the + OLED. + ------------------------------------------------------------------------------ + @param color_contrast: + The color_contrast parameter that holds contrast value. + The color_contrast values should be in the range of 1 to 256. + */ +void OLED_contrast(uint8_t color_contrast); + +#endif + + + -- 2.39.2