📄 lcdcalc.h
字号:
/*******************************************************************************
Biblioteka obslugi wyswietlacza kalkulatorowego, 8-znakowego, 3-podlozowego
Zawiera:
- definicje segmentow kodu 7-segmentowego
- definicje segmentow wyswietlacza LCD
- setup dla mikrokontrolerow MSP430F41x, 43x*, 44x * - nie testowane
- funkcja translacji kodu 7-segmentowego dla pola LCD
- dodatkowe makra
UWAGA! Wszelkie definicje prawdziwe tylko dla przykladowego sposobu polaczenia
wyswietlacza i mikrokontrolera !!!
Mariusz Kaczor, Contrans TI
11.01.2005
rev 1.02
********************************************************************************/
/*************** Budowa i podlaczenie wyswietlacza*******************************
-------------------------------------------------------
| MINUS MEMORY ERROR |
| ,____, ,____, ,____, ,____, |
| 8.8. 8.8. 8.8. 8.8. | - 4 pary cyfr
|-------------------------------------------------------|
| C|C|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|C |
| | | | | | | | | | | |1|1|1|1|1|1|1|1|1|1|2|2|2|2|2| |
| 3 2 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 1 |
-------------------------------------------------------
- 27 wyprowadzen, 3 podloza, 24 segmenty
- MUX 1/3 - MUX3
- BIAS 1/2 - podlaczony do BIAS 1/3 - taki tryb posiada MSP430
- napiecie pracy ok. 3V,
- kierunek patrzenia - zazwyczaj z godziny szostej
Polaczenia:
LCD - C3 C2 C1 S24 - - - S1
| | | | | | | | |
MSP - COM2 COM1 COM0 S23 - - - S0
w generatorze
Sterownik LCD wymaga 4 potencjalow: 0V, 1/2 Vcc, 2/3Vcc oraz Vcc (BIAS 1/3)
Polaczenia generatora napiec:
| R03 R13 R23 R33 |
-----------------------------
| | | |
GND lub I/O - 1MOhm - 1MOhm - 1MOhm
^
|____ Ograniczenie napiecia pracy LCD przez dodanie rezystora pomiedzy
R03 i GND(I/O)
*********************************************************************************/
#ifndef __lcdcalc
#define __lcdcalc
/********************************************************************************/
/*************************** OPCJE BIBLIOTEK ***********************************/
#define autosetupLCD // opcjonalna kompilacja setupu portow dla LCD,
// gdy "autosetupLCD" jest zdefiniowane
#define LCD_inne // opcjonalna kompilacja innych funkcji dla LCD
#define znaki_tab_on // opcjonalna kompilacja tablicy translacji dla LCD
/********************************************************************************/
#define segA BIT0
#define segB BIT1 // definicje sement體 kodu 7-segmentowego
#define segC BIT2 // i znak體 specjalnych dla funkcji
#define segD BIT3 // translacji z kodu 7-segmentowego na pole LCD
#define segE BIT4
#define segF BIT5
#define segG BIT6
#define segP BIT7
#define segMIN BIT4
#define segMEM BIT0
#define segERR BIT4
#define MINUS BIT0 // tablica LCD2
#define MEMORY BIT1 // definicje lokalizacji znakow specjalnych
#define ERROR BIT2 // w osmym bajcie tablicy translacji
#define LCDAl BIT4 // definicje segment體 wyswietlacza -
#define LCDBl BIT1 // odzwierciedlaja umiejscowienie fizycznych segmentow
#define LCDCl BIT6 // pola LCD w pamieci obrazu mikrokontrolera
#define LCDDl BIT2 // pole wyswietlacza podzielone jest na 4 pary cyfr
#define LCDEl BIT1 // (oznaczone jako "lewa-l" i "prawa-p")
#define LCDFl BIT0
#define LCDGl BIT5
#define LCDPl BIT2
#define LCDAr BIT0
#define LCDBr BIT5
#define LCDCr BIT2
#define LCDDr BIT6
#define LCDEr BIT5
#define LCDFr BIT4
#define LCDGr BIT1
#define LCDPr BIT6
/********************************************************************************/
// MAKRA
/********************************************************************************/
#define __display_on LCDCTL |= LCDSON // makro wlacza zawartosc wyswietlacza
#define __display_off LCDCTL &=~ LCDSON // makro wygasza zawartosc wyswietlacza
//
// przykladowe wywolanie: __display_on;
/********************************************************************************/
// przykladowa tablica znakow kodu 7-segmentowego - cyfry z zakresu 0-9
#ifdef znaki_tab_on
const unsigned char znaki[10] =
{
segA+segB+segC+segD+segE+segF, //0
segB+segC, //1
segA+segB +segD+segE +segG, //2
segA+segB+segC+segD +segG, //3
segB+segC +segF+segG, //4
segA+ segC+segD+ segF+segG, //5
segA+segG+segC+segD+segE+segF, //6
segA+segB+segC, //7
segA+segB+segC+segD+segE+segF+segG, //8
segA+segB+segC+segD +segF+segG, //9
};
#endif //znaki_tab_on
/********************************************************************************/
unsigned char LCD_buffer[9];
// przykladowa tablica translacji
// Budowa:
// bajt 0-bajt 7 - znaki w kodzie 7-segmentowym, zgodnie z tablica LCD1
// bajt 8 - znaki specjalne - zgodnie z tablica LCD2
/********************************************************************************/
/********************************************************************************/
// FUNKCJE //
/********************************************************************************/
#ifdef autosetupLCD
void setup_LCD (void); // funkcja ustawia porty dla LCD
#endif //autosetupLCD
void seven_seg2LCD (unsigned char*); // funkcja translacji kodu 7-seg. na pole LCD
#ifdef autosetupLCD
void setup_LCD (void)
{
LCDCTL = LCDON + LCDSON + LCDMX1 + LCDP0 + LCDP1;
P5SEL |= 0xfc;
}
#endif //autosetupLCD
void seven_seg2LCD (unsigned char* source)
{
unsigned short data_src; //
unsigned short data_eval;
unsigned short round_cnt;
unsigned char *pntr;
pntr = (unsigned char*) LCDMEM;
for (round_cnt = 0; round_cnt < 4; round_cnt++)
{ // cztery pary cyfr do analizy
// kazda para cyfr wsp蟪pracuje z trzema komorkami LCDM
data_eval=0;
data_src = *source; //pobranie danych
if (data_src & segA) data_eval |= LCDAl;
if (data_src & segC) data_eval |= LCDCl;
if (data_src & segD) data_eval |= LCDDl;
if (data_src & segE) data_eval |= LCDEl;
if (data_src & segF) data_eval |= LCDFl;
if (data_src & segG) data_eval |= LCDGl;
*pntr = data_eval; // pierwsza kom髍ka wyjsciowa
data_eval=0;
if (data_src & segB) data_eval |= LCDBl;
if (data_src & segP) data_eval |= LCDPl;
//zakonczenie analizy pierwszej cyfry w parze
source++;
data_src = *source; //pobranie danych
if (data_src & segD) data_eval |= LCDDr;
if (data_src & segE) data_eval |= LCDEr;
if (data_src & segF) data_eval |= LCDFr;
pntr++;
*pntr = data_eval; // druga komorka wyjsciowa
data_eval=0;
if (data_src & segA) data_eval |= LCDAr;
if (data_src & segB) data_eval |= LCDBr;
if (data_src & segC) data_eval |= LCDCr;
if (data_src & segG) data_eval |= LCDGr;
if (data_src & segP) data_eval |= LCDPr;
pntr++;
*pntr = data_eval; // trzecia kom髍ka wyjsciowa
*source++; // analiza dwoch cyfr zakonczona
pntr++;
} // osiem cyfr juz narysowane
data_src = *source; //pobranie danych znakow specjalnych
pntr--;
if (data_src & ERROR) *pntr |= segERR;
pntr--;
if (data_src & MEMORY) *pntr |= segMEM;
pntr-=2;
if (data_src & MINUS) *pntr |= segMIN;
//znaki specjalne ustawione
}
#endif //__lcdcalc
/********************************************************************************
HISTORIA WERSJI
---------------------------------------------------------------------------------
1.01 - 04.01.2006
- w funkcji setup_LCD() usuniete ustawienie BasicTimera - ustawiac nalezy
w glownym setupie
- w funkcji setup_LCD() zmiany w setupie portow
- zweryfikowane dzialanie dla 44x
- rozszerzony opis
1.02 - dodane makra zarzadzania ekranem
- poprawiony opis
- tablica znakow jest opcjonalna
*********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -