Динамическая Индикация

28-06-2013, 17:15 От: admin Посмотрели: 685
Всем добрый вечер. Проблема следующая. Есть плата STM32VL Discovery. К ней цепляется з-х разрядный семисегментный индикатор. Цифры предполагается выводить динамически. Но при выводе первого разряда вместе с ним подсвечивается и второй, при выводе 2-го подсвечивается 3-й и соответственно при выводе 3-го подсвечивается 1-й. Пробовал различные частоты вывода и применять задержки между выключением предыдущего индикатора и включением последующего. В чём может быть дело??? На Си только начинаю программировать, поэтому код скорее всего не эффективный, но всё же.



Жду ваших ответов.





#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#define IND_PORT GPIOA// This port is responsible for the display of "IND_PORT"
#define D1 GPIO_Pin_0//This conclusion is responsible for 1st indicator
#define D2 GPIO_Pin_1//This conclusion is responsible for 2nd indicator
#define D3 GPIO_Pin_2//This conclusion is responsible for 3rd indicator
// A segment of the indicator - the output of the microcontroller
#define SEG_A GPIO_Pin_0// seg "A"
#define SEG_B GPIO_Pin_1// seg "B"
#define SEG_C GPIO_Pin_2// seg "C"
#define SEG_D GPIO_Pin_3// seg "D"
#define SEG_E GPIO_Pin_4// seg "E"
#define SEG_F GPIO_Pin_5// seg "F"
#define SEG_G GPIO_Pin_6// seg "G"
#define DP GPIO_Pin_7 //Decimal point
// Create the numbers of segments
#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_PINS (DIG8 | D1 | D2 | D3 )

// Delay
void Delay (void);
void Delay (void)
{
unsigned long i;
for (i=0; i<20000; i++);
}
//


#define TIMER_PRESCALER 720
uint8_t previousState;
uint8_t IND_State;
GPIO_InitTypeDef port;//???
TIM_TimeBaseInitTypeDef timer;
uint8_t counter1;
uint8_t counter2;
uint8_t counter3;
uint8_t rez;
uint8_t digit;

void digit_to_port (uint8_t digit){
uint8_t digitsp[]={DIG0,DIG1,DIG2,DIG3,DIG4,DIG5,DIG6,DIG7,DIG8,DIG9};
IND_PORT->ODR &= ~DIG8;
IND_PORT->ODR |= digitsp[digit];
}
//

void initAll()
{
GPIO_InitTypeDef port;//???
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //On port "A"
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //On port "B"
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //On timer "Tim 4"

GPIO_StructInit(&port);
//Port "A" input
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = DIG8 | DP;
port.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &port);

//Port "B" output
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin =D1 | D2 | D3;
port.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &port);
// Timer
TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = TIMER_PRESCALER;
timer.TIM_Period = 5000;
TIM_TimeBaseInit(TIM4, &timer);
}

//
int main()
{
__enable_irq();
initAll();
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);
NVIC_EnableIRQ(TIM4_IRQn);
IND_State=1;
counter1=1;
counter2=2;
counter3=7;
while(1)
{
__NOP();
}
}
//


void TIM4_IRQHandler()
{

if (IND_State == 1)
{
GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
Delay();
IND_State=2;

GPIO_SetBits(GPIOB, D1);

digit_to_port(counter1);
timer.TIM_Period = 50000;
TIM_TimeBaseInit(TIM4, &timer);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
else
{
if (IND_State == 2)
{
GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
Delay();
IND_State=3;
GPIO_SetBits(GPIOB, D2);

digit_to_port(counter2);
timer.TIM_Period = 50000;
TIM_TimeBaseInit(TIM4, &timer);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
else
{
GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
Delay();
IND_State=1;
GPIO_SetBits(GPIOB, D3);

digit_to_port(counter3);
timer.TIM_Period = 50000;
TIM_TimeBaseInit(TIM4, &timer);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
}
}

Раздел: STM32

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

Обсудить на форуме


На момент добавления Динамическая Индикация все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031