Перейти к содержанию
bbh_blocked_dnftl

Dx Portal Динамическая индикация STM32


Рекомендуемые сообщения

Помогите! Не пойму, почему не работает код. Хотя он был рабочий, пока я что-то не "оптимизировал"...

 

 

 

// Общие выводы индикатора

#define D0 GPIO_Pin_14

#define D1 GPIO_Pin_13

#define D2 GPIO_Pin_12

#define ALL_CATOD ( D0 | D1 | D2 )

 

// К какой ноге какой сегмент подключен

#define SEG_A GPIO_Pin_0

#define SEG_B GPIO_Pin_1

#define SEG_C GPIO_Pin_2

#define SEG_D GPIO_Pin_3

#define SEG_E GPIO_Pin_4

#define SEG_F GPIO_Pin_5

#define SEG_G GPIO_Pin_6

 

//Собираем цифры из сегментов

#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )

#define DIG1 ( SEG_B | SEG_C )

#define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D )

#define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D )

#define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C)

#define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D )

#define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G )

#define DIG7 ( SEG_A | SEG_B | SEG_C )

#define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)

#define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)

#define ALL_SEG (DIG8 )

 

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin = ALL_SEG | ALL_CATOD;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

}

 

void show_temp(void) {

 

u16 tmp; // Содержит копию counter (из него по очереди исключаются последние цифры)

u8 digit; // В эту переменную поочередно записываются цифры из которых состоит число counter

u16 catods[] = { D0, D1, D2 };

u8 digitsp[] = { DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 };

u8 i;

 

tmp = measureT;

 

for (i = 0; i < 3; i++) {

if (tmp > 0) {

//Вытаскиваем первую справа цифру из числа counter

digit = tmp % 10;

tmp = tmp / 10;

//Выключаем все разряды. 1 на катоды

GPIOA->ODR |= ALL_CATOD;

//Включаем i разряд индикатора

GPIOA->ODR &= ~catods;

//Выводим цифру в i разряд

GPIOA->ODR &= ~DIG8; //Выключаем все сегменты

GPIOA->ODR |= digitsp[digit]; //Зажигаем нужные

//Небольшая задержка. Пусть цифра погорит некоторое время

delay_ms(1000);

}

}

}

 

 

Большую задержку поставил, чтобы глазом было видно результат. Число 123 отображается: сначало 33, потом 22, потом 111. Почему загорается несколько разрядов, хотя GPIOA->ODR &= ~catods;?

 

Читать дальше

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...