Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
//----------------------------------------------------------------------------#include
#include//----------------------------------------------------------------------------
volatile char Phase; //фаза индикации дисплея
char SegData[4]; //копия сегментов индикатора//----------------------------------------------------------------------------
char Conv(char d); //преобразование цифры в 7-сегментный код
void SetSeg(char s); //вывод данных на сегменты индикатора//--------------- Таблица перекодировки в 7-сегментный код: ------------------
__flash char Font[]= { 0x3F, //code 00H, character 0
0x06, //code 01H, character 1
0x5B, //code 02H, character 2
0x4F, //code 03H, character 3
0x66, //code 04H, character 4
0x6D, //code 05H, character 5
0x7D, //code 06H, character 6
0x07, //code 07H, character 7
0x7F, //code 08H, character 8
0x6F, //code 09H, character 9
0x40, //code 0AH, character -
0x00 }; //code 0AH, character blank//------------------- Инициализация подсистемы дисплея: ----------------------
void Init_Disp(void)
{
Phase = 0;
for(char i = 0; i < 4; i++)
SegData[i] = Conv(CHR_BLK);
}//--------------- Вывод на дисплей беззнакового числа 0..999.9: ---------------
void Disp_FixP(int n)
{
char d;
char nzero = 0;d = n / 1000;
nzero |= d;
if(nzero) SegData[0] = Conv(d);
else SegData[0] = Conv(CHR_BLK);
n = n % 1000;d = n / 100;
nzero |= d;
if(nzero) SegData[1] = Conv(d);
else SegData[1] = Conv(CHR_BLK);
n = n % 100;d = n / 10;
SegData[2] = Conv(d) | POINT;
n = n % 10;SegData[3] = Conv(n);
}//----------------- Преобразование цифры в 7-сегментный код: -----------------
char Conv(char d)
{
if(d > CHR_BLK) return(CHR_MIN);
return(Font[d]);
}//------------------ Вывод данных на сегменты индикатора: --------------------
void SetSeg(char s)
{
(s & 0x01)? Port_SEG_A_0 : Port_SEG_A_1;
(s & 0x02)? Port_SEG_B_0 : Port_SEG_B_1;
(s & 0x04)? Port_SEG_C_0 : Port_SEG_C_1;
(s & 0x08)? Port_SEG_D_0 : Port_SEG_D_1;
(s & 0x10)? Port_SEG_E_0 : Port_SEG_E_1;
(s & 0x20)? Port_SEG_F_0 : Port_SEG_F_1;
(s & 0x40)? Port_SEG_G_0 : Port_SEG_G_1;
(s & 0x80)? Port_SEG_H_0 : Port_SEG_H_1;
}//------------------- Рализация динамической индикации: ----------------------
//Вызывается в прерывании таймера 1 ms
void Timer_Disp(void)
{
Port_SCAN1_1; //выключение всех разрядов дисплея
Port_SCAN2_1;
Port_SCAN3_1;
Port_SCAN4_1;switch(Phase) //проверка текущей фазы
{
case 0:
SetSeg(SegData[0]); //вывод сегментов разряда 1
Port_SCAN1_0; //включение разряда 1
break;
case 1:
SetSeg(SegData[1]); //вывод сегментов разряда 2
Port_SCAN2_0; //включение разряда 2
break;
case 2:
SetSeg(SegData[2]); //вывод сегментов разряда 3
Port_SCAN3_0; //включение разряда 3
break;
case 3:
SetSeg(SegData[3]); //вывод сегментов разряда 4
Port_SCAN4_0; //включение разряда 4
break;
}
if(Phase < 3) Phase++; else Phase = 0; //следующая фаза
}//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//disp.h
//LED display support module header file
//----------------------------------------------------------------------------
#ifndef DispH
#define DispH//----------------------------------------------------------------------------
#define CHR_MIN 10 //символ "минус"
#define CHR_BLK 11 //символ "пробел"
#define POINT 0x80 //сегмент H//----------------------------------------------------------------------------
void Init_Disp(void); //инициализация подсистемы дисплея
void Timer_Disp(void); //реализация динамической индикации
void Disp_FixP(int n); //вывод числа на дисплей//----------------------------------------------------------------------------
#endif
//Порты в main.h описываются так:
#define SEG_A (1 << PC5) //сегмент A
#define Port_SEG_A_0 (PORTC &= ~SEG_A)
#define Port_SEG_A_1 (PORTC |= SEG_A)//и т.д.