Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ответ:

Отправлено Леонид Иванович 26 июня 2007 г. 10:42
В ответ на: здрывствуйте!!!! подскажите, поджалуйста, где мона атмега16 подпрограмку для управления 7 сегментными индикаторами содрать? заранее преблагодарин! отправлено <font color=gray>тэофил))</font> 26 июня 2007 г. 10:35


//----------------------------------------------------------------------------

#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)

//и т.д.



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите шесть пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru