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

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

вот куски, может пригодятся

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

//7-segment bits (определение битов сегментов индикации (для общего анода, 0 - свечение сегмента))
#define i7s_sega ((uint8_t)(~(1))) /**< \brief Segment A mask (сегмент A) \ingroup ul_iled7s */
#define i7s_segb ((uint8_t)(~(2))) /**< \brief Segment B mask (сегмент B) \ingroup ul_iled7s */
#define i7s_segc ((uint8_t)(~(4))) /**< \brief Segment C mask (сегмент C) \ingroup ul_iled7s */
#define i7s_segd ((uint8_t)(~(8))) /**< \brief Segment D mask (сегмент D) \ingroup ul_iled7s */
#define i7s_sege ((uint8_t)(~(16))) /**< \brief Segment E mask (сегмент E) \ingroup ul_iled7s */
#define i7s_segf ((uint8_t)(~(32))) /**< \brief Segment F mask (сегмент F) \ingroup ul_iled7s */
#define i7s_segg ((uint8_t)(~(64))) /**< \brief Segment G mask (сегмент G) \ingroup ul_iled7s */
#define i7s_segh ((uint8_t)(~(128))) /**< \brief Segment H mask (сегмент H) \ingroup ul_iled7s */


//symbols definitions (определения изображений символов)
#define i7s_allon (i7s_sa & i7s_sb & i7s_sc & i7s_sd & i7s_se & i7s_sf & i7s_sg) /**< \brief all segment on - 0 for lighted segment (common anode indicators)
все сегменты включены - 0 для включения соотв.сегмента (для индикаторов с общим анодом) \ingroup group_i7s */
#define i7s_alloff (~i7s_allon) /**< \brief all segments off
все сегменты выключены \ingroup group_i7s */
#define i7s_0 (i7s_sa & i7s_sb & i7s_sc & i7s_sd & i7s_se & i7s_sf) /**< \brief '0' \ingroup group_i7s */
#define i7s_1 (i7s_sb & i7s_sc) /**< \brief '1' \ingroup group_i7s */
#define i7s_2 (i7s_sa & i7s_sb & i7s_sd & i7s_se & i7s_sg) /**< \brief '2' \ingroup group_i7s */
#define i7s_3 (i7s_sa & i7s_sb & i7s_sc & i7s_sd & i7s_sg) /**< \brief '3' \ingroup group_i7s */
#define i7s_4 (i7s_sb & i7s_sc & i7s_sf & i7s_sg) /**< \brief '4' \ingroup group_i7s */
#define i7s_5 (i7s_sa & i7s_sc & i7s_sd & i7s_sf & i7s_sg) /**< \brief '5' \ingroup group_i7s */
#define i7s_6 (i7s_sa & i7s_sc & i7s_sd & i7s_se & i7s_sf & i7s_sg) /**< \brief '6' \ingroup group_i7s */
#define i7s_7 (i7s_sa & i7s_sb & i7s_sc) /**< \brief '7' \ingroup group_i7s */
#define i7s_8 (i7s_sa & i7s_sb & i7s_sc & i7s_sd & i7s_se & i7s_sf & i7s_sg) /**< \brief '8' \ingroup group_i7s */
#define i7s_9 (i7s_sa & i7s_sb & i7s_sc & i7s_sd & i7s_sf & i7s_sg) /**< \brief '9' \ingroup group_i7s */
#define i7s_A (i7s_sa & i7s_sb & i7s_sc & i7s_se & i7s_sf & i7s_sg) /**< \brief 'A' \ingroup group_i7s */
#define i7s_b (i7s_sc & i7s_sd & i7s_se & i7s_sf & i7s_sg) /**< \brief 'b' \ingroup group_i7s */
#define i7s_C (i7s_sa & i7s_sd & i7s_se & i7s_sf) /**< \brief 'C' \ingroup group_i7s */
#define i7s_c (i7s_sd & i7s_se & i7s_sg) /**< \brief 'c' \ingroup group_i7s */
#define i7s_d (i7s_sb & i7s_sc & i7s_sd & i7s_se & i7s_sg) /**< \brief 'd' \ingroup group_i7s */
#define i7s_E (i7s_sa & i7s_sd & i7s_se & i7s_sf & i7s_sg) /**< \brief 'E' \ingroup group_i7s */
#define i7s_F (i7s_sa & i7s_se & i7s_sf & i7s_sg) /**< \brief 'F' \ingroup group_i7s */
#define i7s_H (i7s_sb & i7s_sc & i7s_se & i7s_sf & i7s_sg) /**< \brief 'H' \ingroup group_i7s */
#define i7s_h (i7s_sc & i7s_se & i7s_sf & i7s_sg) /**< \brief 'h' \ingroup group_i7s */
#define i7s_L (i7s_sd & i7s_se & i7s_sf) /**< \brief 'L' \ingroup group_i7s */
#define i7s_n (i7s_sc & i7s_se & i7s_sg) /**< \brief 'n' \ingroup group_i7s */
#define i7s_o (i7s_sc & i7s_sd & i7s_se & i7s_sg) /**< \brief 'o' \ingroup group_i7s */
#define i7s_P (i7s_sa & i7s_sb & i7s_se & i7s_sf & i7s_sg) /**< \brief 'P' \ingroup group_i7s */
#define i7s_q (i7s_sa & i7s_sb & i7s_sc & i7s_sf & i7s_sg) /**< \brief 'q' \ingroup group_i7s */
#define i7s_r (i7s_se & i7s_sg) /**< \brief 'r' \ingroup group_i7s */
#define i7s_t (i7s_sd & i7s_se & i7s_sf & i7s_sg) /**< \brief 't' \ingroup group_i7s */
#define i7s_Y (i7s_sb & i7s_sc & i7s_sd & i7s_sf & i7s_sg) /**< \brief 'Y' \ingroup group_i7s */
#define i7s_U (i7s_sb & i7s_sc & i7s_sd & i7s_se & i7s_sf) /**< \brief 'U' \ingroup group_i7s */
#define i7s_u (i7s_sc & i7s_sd & i7s_se) /**< \brief 'u' \ingroup group_i7s */
#define i7s_Pcyr (i7s_sa & i7s_sb & i7s_sc & i7s_se & i7s_sf) /**< \brief 'P cyrillic' \ingroup group_i7s */
#define i7s_Gcyr (i7s_sa & i7s_se & i7s_sf) /**< \brief 'G cyrillic' \ingroup group_i7s */


#define i7s_buf_size 7 /**< \brief 7-segment LED indication buffer size (размер буфера индикации) \ingroup ul_iled7s */


u8 i7s_buf_cnt; /**< \brief 7-segment dynamic indication buffer counter
счетчик текущего символа для динамической индикации \ingroup group_i7s */
u8 i7s_buf[i7s_buf_size]; /**< \brief 7-segment indication buffer of previously defined size \b i7s_buf_size
буфер индикации (предварительно определить размер буфера \b led7s_buf_size) \ingroup group_i7s */
u8 i7s_point = (u8)i7s_sh; /**< \brief "point" symbol definition (== \b i7s_alloff for point disable)
символ для отображения "точки" ( \b i7s_alloff для отключения) \ingroup group_i7s */
u8 i7s_minus = (u8)i7s_sg; /**< \brief "minus" symbol definition (== \b i7s_alloff for '-' disable)
символ для отображения "минуса" ( \b i7s_alloff для отключения) \ingroup group_i7s */
u8 i7s_space = (u8)i7s_alloff;/**< \brief "space" symbol definition
символ для отображения "пробела" ( \b i7s_alloff для отключения) \ingroup group_i7s */

/** \brief hex symbols array ('0'-'9','A'-'F')
массив HEX-символов в памяти \ingroup group_i7s */
#define inc_i7s_hex_syms \
static u8 i7s_hex_syms[] = \
{(u8)i7s_0 /*0*/, (u8)i7s_1 /*1*/, (u8)i7s_2 /*2*/, (u8)i7s_3 /*3*/, \
(u8)i7s_4 /*4*/, (u8)i7s_5 /*5*/, (u8)i7s_6 /*6*/, (u8)i7s_7 /*7*/, \
(u8)i7s_8 /*8*/, (u8)i7s_9 /*9*/, (u8)i7s_A /*A*/, (u8)i7s_b /*b*/, \
(u8)i7s_C /*C*/, (u8)i7s_d /*d*/, (u8)i7s_E /*E*/, (u8)i7s_F /*F*/ \
};

/** \brief macro for reading HEX symbol from array
макрос для считывания соответствующего HEX символа \ingroup group_i7s */
#define i7s_hexdig_uni(adata) (i7s_hex_syms[adata])

/** \brief write 7-segment 32-bit signed int \b data to \b buf (lowest digit), \b buf-1 (next digit), with \b options :

(options & 7) + 1 - number of digits,

((options >> 4) & 7) - point position (counting from right, 0 - without point),

((options & 0x08) == 0x08) - don't show leading zeroes,

((options & 0x80) == 0x80) - previously convert to BCD

записать 32-bit знаковое \b data в 7-сегментном коде по адресу \b buf (мл.цифра), \b buf-1 (след.цифра) с параметрами \b options :

(options & 7) + 1 - количество цифр,

((options >> 4) & 7) - позиция точки (считая справа, 0 - без точки),

((options & 0x08) == 0x08) - не показывать стартовых нулей,

((options & 0x80) == 0x80) - предварительно преобразовать в десятичный вид
\ingroup group_i7s */
void i7s_wr_s32(s32 data, void* buf, u8 options)
{u8 u8_01, u8_02, u8_03;
u8_01 = (options & 7) + 1; /*number of digits*/
/*remember sign of data*/
if (data < 0)
{options |= 1;
data = -data;
} else options &= ~1;
if (options & 0x80) data = bin2bcd_u32(data, ((u8_01 - 1) >> 1) + 1); /*if necessary,convert to BCD*/
u8_03 = ((options >> 4) & 7); /*point position*/
u8_02 = u8_01 - u8_03;
if (u8_03) u8_02++;
while (u8_01)
{if ((options & 8) && (data == 0) && (u8_01 < u8_02))
{if (options & 1)
{*(u8 *)buf = i7s_minus; /*show 'minus' sign*/
options &= ~1;
}else *(u8 *)buf = i7s_space; /*delete leading zeroes*/
}
else
{u8 u8_04;
u8_04 = i7s_hexdig(data & 0xf); /*read digit 7-segment code from array*/
if ((u8_01 == u8_02) && (u8_03)) u8_04 &= i7s_point; /*if necessary, put point mark*/
*(u8 *)buf = u8_04;
}
u8_01--; data >>= 4; buf--; /*show next digit*/
}
}

u32 bin2bcd_u32(u32 data, u8 result_bytes)
{u32 result = 0; /*result*/
u8 u8_1;
for (u8_1 = (4 - result_bytes); u8_1; u8_1--) data <<= 8; /*adjust input bytes*/
for (u8_1 = (result_bytes << 3); u8_1; u8_1--) /*bit shift loop*/
{u8 u8_2, u8_3;
/*result BCD nibbles correction*/
result += 0x33333333;
/*result correction loop*/
for (u8_3 = 4; u8_3; u8_3--)
{u8_2 = result >> 24;
if (!(u8_2 & 0x08)) u8_2 -= 0x03;
if (!(u8_2 & 0x80)) u8_2 -= 0x30;
result <<= 8; /*shift result*/
result |= u8_2; /*set 8 bits of result*/
}
/*shift next bit of input to result*/
result <<= 1;
if (((u8)(data >> 24)) & 0x80) result |= 1;
data <<= 1;
}
return(result);
}




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

Ответы


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

Сообщение:

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

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

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

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