231 lines
7.0 KiB
C
231 lines
7.0 KiB
C
/**
|
|
* \file led_7seg.h
|
|
* <!--
|
|
* This file is part of BeRTOS.
|
|
*
|
|
* Bertos is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
* As a special exception, you may use this file as part of a free software
|
|
* library without restriction. Specifically, if other files instantiate
|
|
* templates or use macros or inline functions from this file, or you compile
|
|
* this file and link it with other files to produce an executable, this
|
|
* file does not by itself cause the resulting executable to be covered by
|
|
* the GNU General Public License. This exception does not however
|
|
* invalidate any other reasons why the executable file might be covered by
|
|
* the GNU General Public License.
|
|
*
|
|
* Copyright 2010 Develer S.r.l. (http://www.develer.com/)
|
|
* -->
|
|
*
|
|
* \author Fabio Bizzi <fbizzi@bizzi.org>
|
|
*
|
|
* \defgroup SevenSegDisplay 7 Segments LED Displays Driver
|
|
* \ingroup drivers
|
|
* \{
|
|
*
|
|
* \brief 7 segments LED displays (headers)
|
|
*
|
|
* Here you find the prototypes and the data structures that
|
|
* format and holds the text that has to be displayed by the
|
|
* 7 segments display.
|
|
*
|
|
* The main function is the sevenseg_print()
|
|
* that is called by your software to display the text, also
|
|
* important is the sevenseg_init() that initialize the data
|
|
* structures and set the refresh timer, you need to call
|
|
* this procedure just one time in the init procedure of
|
|
* your software before any use of the sevenseg_print().
|
|
*
|
|
* Usage:
|
|
*
|
|
* To use succesfully the display you have to follow these steps:
|
|
*
|
|
* \li Create the structure and init the display
|
|
* \li Check if the display is ready to accept a new print with
|
|
* the function sevenseg_isReady()
|
|
* \li Unlock the display with the function sevenseg_unlock()
|
|
* NOTE: when the display is unlocked the displaying of any
|
|
* text is stopped but the data (text and attributes like text
|
|
* position, blinking etc etc) are not erased.
|
|
* \li Set the wanted text attributes with sevenseg_set* functions
|
|
* \li Print the wanted text with sevenseg_print()
|
|
* \li Lock the display with sevenseg_lock()
|
|
*
|
|
* When the display is locked the displaying of the text starts.
|
|
*
|
|
*
|
|
* \code
|
|
* static Seven_Seg display;
|
|
* // ...
|
|
* sevenseg_init(&display);
|
|
* while (!sevenseg_isReady(&display))
|
|
* ;
|
|
* sevenseg_unlock(&display);
|
|
* sevenseg_setBlink(&display,false,0);
|
|
* sevenseg_setRunonce(&display,false);
|
|
* sevenseg_setRunspeed(&display,10);
|
|
* if ((sevenseg_print(&display, "made with bertos.")) != 0)
|
|
* return -1;
|
|
* sevenseg_lock(&display);
|
|
* \endcode
|
|
*
|
|
* $WIZ$ module_name = "led_7seg"
|
|
* $WIZ$ module_depends = "timer"
|
|
* $WIZ$ module_configuration = "bertos/cfg/cfg_led_7seg.h"
|
|
* $WIZ$ module_hw = "bertos/hw/hw_led_7seg.h"
|
|
*/
|
|
|
|
#ifndef DRV_LED_7SEG_H
|
|
#define DRV_LED_7SEG_H
|
|
|
|
#include "cfg/cfg_led_7seg.h"
|
|
#include <drv/timer.h>
|
|
#include <mware/event.h>
|
|
|
|
/**
|
|
* \name Numbers and Letters Table.
|
|
* \note These tables contain all the printable
|
|
* characters on a 7 segment digit encoded
|
|
* for common cathode and common anode
|
|
* display type.
|
|
*
|
|
* 0, 1, 2, 3, 4, 5, 6, 7, 8,
|
|
* 9, ., -, A, B, C, D, E, F,
|
|
* G, H, I, J, K, L, M, N, O,
|
|
* P, Q, R, S, T, U, V, W, X,
|
|
* Y, Z, SPACE
|
|
*
|
|
* \{
|
|
*/
|
|
#if CONFIG_LED_7SEG_CCAT
|
|
static const uint8_t segstable[] =
|
|
{
|
|
0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f,
|
|
0x6f, 0x80, 0x40, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,
|
|
0x3d, 0x74, 0x30, 0x1e, 0x75, 0x38, 0x15, 0x37, 0x3f,
|
|
0x73, 0x67, 0x50, 0x6d, 0x78, 0x3e, 0x2a, 0x6a, 0x76,
|
|
0x6e, 0x5b, 0x0
|
|
};
|
|
#else
|
|
static const uint8_t segstable[] =
|
|
{
|
|
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80,
|
|
0x90, 0x7f, 0xbf, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
|
|
0xc2, 0x8b, 0xcf, 0xe1, 0x8a, 0xc7, 0xea, 0xc8, 0xc0,
|
|
0x8c, 0x98, 0xaf, 0x92, 0x87, 0xc1, 0xd5, 0x95, 0x89,
|
|
0x91, 0xa4, 0xff
|
|
};
|
|
#endif
|
|
/**\} */
|
|
|
|
/**
|
|
* Context data for Display functions
|
|
*
|
|
*/
|
|
typedef struct SevenSeg
|
|
{
|
|
/** The String to be displayed */
|
|
uint8_t string[CONFIG_LED_7SEG_STRLEN];
|
|
/** The length of the string to be displayed */
|
|
unsigned int string_len;
|
|
/** Has to blink? */
|
|
bool blink;
|
|
/** Has to blink only one digit? */
|
|
uint8_t bdigit;
|
|
/** Has to be displayed only one time? */
|
|
bool runonce;
|
|
/** Scrolling speed */
|
|
unsigned int speed;
|
|
/** Working scrolling speed */
|
|
unsigned int curspeed;
|
|
/** Is it printed at least one time? */
|
|
bool firstrun;
|
|
/** Working current position */
|
|
unsigned int curpos;
|
|
/** Working current digit */
|
|
unsigned int curdigit;
|
|
/** Is the structure in edit? */
|
|
bool busyedit;
|
|
} SevenSeg;
|
|
|
|
/* Functions prototypes */
|
|
|
|
/*
|
|
* This is the procedure that fills the seven_seg structure with the translated
|
|
* string to display. It swaps also the structures to display the new text when
|
|
* all the data is ready to display.
|
|
*/
|
|
int sevenseg_print(SevenSeg *SS, const char *sstring);
|
|
|
|
/*
|
|
* This is the procedure that inits all the structures that rules the 7 segments
|
|
* display and set the timer for the proper print/refresh of the text.
|
|
*/
|
|
void sevenseg_init(SevenSeg *SS);
|
|
|
|
/*
|
|
* This is the procedure that does a short print of all segments of all
|
|
* digits of the display.
|
|
*/
|
|
void sevenseg_test(SevenSeg *SS);
|
|
|
|
/*
|
|
* This is the procedure that check if the print of the current text is run
|
|
* almost one time and we're ready to print a new text.
|
|
*/
|
|
bool sevenseg_isReady(SevenSeg *SS);
|
|
|
|
/*
|
|
* This is the procedure that check if the print of the current text is run
|
|
* almost one time and then set the status of the display to "unlocked".
|
|
*/
|
|
bool sevenseg_unlock(SevenSeg *SS);
|
|
|
|
/*
|
|
* This is the procedure that lock the display and permit
|
|
* the print of the text.
|
|
*/
|
|
bool sevenseg_lock(SevenSeg *SS);
|
|
|
|
/*
|
|
* This is the procedure that set the blinking of the display.
|
|
* You can choose to blink all the display or only a single
|
|
* digit.
|
|
*/
|
|
bool sevenseg_setBlink(SevenSeg *SS, bool blink, uint8_t digit);
|
|
|
|
/*
|
|
* This is the procedure that set if the text has to be displayed
|
|
* just one time
|
|
*/
|
|
bool sevenseg_setRunonce(SevenSeg *SS, bool runonce);
|
|
|
|
/*
|
|
* This is the procedure that set the scrolling speed of the text
|
|
* if the text is longer than the display digits or the
|
|
* duration of the display if the text is smaller or equal the
|
|
* length of display digits.
|
|
*/
|
|
bool sevenseg_setRunspeed(SevenSeg *SS, unsigned int r_speed);
|
|
|
|
/*
|
|
* This is the procedure that blanks the text to be displayed
|
|
* and so on clear the display.
|
|
*/
|
|
bool sevenseg_clear(SevenSeg *SS);
|
|
|
|
#endif /* DRV_LED_7SEG_H */
|
|
/** \} */ //defgroup drivers
|