Вт сен 08, 2020 14:08:30
Вт сен 08, 2020 15:07:39
Куда уж проще.Demiurg писал(а):Ну, есть способы. "Заменить на xxxx"
#define A _BV(0)
#define B _BV(1)
#define C _BV(2)
#define D _BV(3)
#define E _BV(4)
#define F _BV(5)
#define G _BV(6)
#define H _BV(7)
Вт сен 08, 2020 15:49:04
Вт сен 08, 2020 20:46:15
Сб авг 13, 2022 13:58:10
Сб авг 13, 2022 16:06:54
Сб авг 13, 2022 16:21:31
Надо помедленнее, покадрово бы посмотреть, станет понятнее
А так то в принципе он там сами цифры не трогает, а эффекты сделаны методом наложения посегментной маски по AND для гашения части сегментов.
Сб авг 13, 2022 18:54:58
Сб авг 13, 2022 20:14:45
/** ----------
* @brief Переключение шагов динамической индикации.
*/
void SegmentLED_DynaScan(void)
{
static uint8_t digit = 0;
uint8_t mask;
mask = SegmentLED_Animation_GetMask(digit);
SegmentLED_DigitOut(digit, buf[digit] & mask);
digit++;
if(digit >= NUM_DIG) digit = 0;
}
Сб авг 13, 2022 20:38:07
Сб авг 13, 2022 21:05:32
Сб авг 13, 2022 21:13:30
Сб авг 13, 2022 21:49:55
/** ----------
* @brief Переключение шагов динамической индикации.
*/
void SegmentLED_DynaScan(void)
{
static uint8_t digit = 0;
uint8_t mask;
mask = SegmentLED_Animation_GetMask(digit); // получить маску сегментов в текущем разряде
SegmentLED_DigitOut(digit, buf[digit] & mask); // смешать отображаемую цифру и маску и вывести в разряд
digit++;
if(digit >= NUM_DIG) digit = 0;
}
/* положение сегментов в байте */
#define SEG_A (1 << 0)
#define SEG_B (1 << 1)
#define SEG_C (1 << 2)
#define SEG_D (1 << 3)
#define SEG_E (1 << 4)
#define SEG_F (1 << 5)
#define SEG_G (1 << 6)
/* карта анимации сегментов в четырех разрядах, по шагам */
static uint8_t anim1[][4] = {{SEG_A, SEG_D, SEG_A, SEG_D},
{(SEG_A | SEG_B), (SEG_D | SEG_E), (SEG_A | SEG_B), (SEG_D | SEG_E)},
{(SEG_A | SEG_B | SEG_C), (SEG_D | SEG_E | SEG_F), (SEG_A | SEG_B | SEG_C), (SEG_D | SEG_E | SEG_F)},
{(SEG_A | SEG_B | SEG_C | SEG_D), (SEG_A | SEG_D | SEG_E | SEG_F), (SEG_A | SEG_B | SEG_C | SEG_D), (SEG_A | SEG_D | SEG_E | SEG_F)},
{0xFF, 0xFF, 0xFF, 0xFF}};
uint8_t *ptr = &anim1[0][0]; //указатель на текущую карту анимации и текущий шаг
/** ----------
* @brief Получение маски сегментов в текущем разряде
* @param digit - текущий активированный разряд
* @return маска сегментов в текущем разряде
*/
uint8_t SegmentLED_Animation_GetMask(uint8_t digit)
{
return *(ptr + digit);
}
/** ----------
* @brief Переключение шагов анимации сегментов
*/
void AnimationStep(void)
{
static uint8_t step = 0;
ptr = &anim1[step][0]; // указатель ставится на первый разряд текущего шага анимации в карте
step++;
if(step > 4) step = 0;
}
/** ----------
* @brief Активация сегментов выбранного разряда.
* @param digit - номер разряда
* @param seg_data - данные сегментов
*/
void SegmentLED_DigitOut(uint8_t digit, uint8_t seg_data)
{
ALLSEGs_OFF(); // гашение всех сегментов
switch(digit){
case 0: // разряд 1
SELECT_DIGIT(DIG1_Pin); // активация разряда
SEGs_OUT(seg_data); // активация сегментов
break;
case 1: // разряд 2
SELECT_DIGIT(DIG2_Pin); // активация разряда
SEGs_OUT(seg_data); // активация сегментов
break;
case 2:
SELECT_DIGIT(DIG3_Pin);
SEGs_OUT(seg_data);
break;
case 3:
SELECT_DIGIT(DIG4_Pin);
SEGs_OUT(seg_data);
break;
}
}
Сб авг 13, 2022 22:25:17
Сб авг 13, 2022 22:36:39
#define NUM_DIG 4
/* кодирование сегментов в байте */
#define SEG_A (1 << 0)
#define SEG_B (1 << 1)
#define SEG_C (1 << 2)
#define SEG_D (1 << 3)
#define SEG_E (1 << 4)
#define SEG_F (1 << 5)
#define SEG_G (1 << 6)
#define SEG_dp (1 << 7)
/* символы шрифта */
#define CH_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )
#define CH_1 ( SEG_B | SEG_C )
#define CH_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define CH_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define CH_4 ( SEG_B | SEG_C | SEG_F | SEG_G)
#define CH_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define CH_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define CH_7 (SEG_A | SEG_B | SEG_C )
#define CH_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define CH_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define CH_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define CH_B ( SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define CH_C (SEG_A | SEG_D | SEG_E | SEG_F )
#define CH_D ( SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define CH_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define CH_F (SEG_A | SEG_E | SEG_F | SEG_G)
static uint8_t buf[NUM_DIG] = {CH_0, CH_3, CH_5, CH_6}; // на индикаторе отображается число "0356"
Сб авг 13, 2022 22:50:34
Вс авг 14, 2022 06:46:06
Вс авг 14, 2022 07:57:34
Вс авг 14, 2022 15:48:01
Вс авг 14, 2022 20:32:19