Kirill Lubinets

STM32f303vc вывод на блок семисегментного дисплея

3 сообщения в этой теме

Необходимо выводить на блок из 4 семисегментных индикаторов данные, управление лежит на двух сдвиговых регистрах:
Первый хранит в себе число на вывод, второй адрес(адресует на конкретный разряд в блоке).

 

Данные передаю через аппаратный SPI, настроенный в STM32CubeMX, но он у меня не работает.

Мой алгоритм

Задаю наборы для отображения на индикаторе и адресные наборы для перемещения по разрядам в блоке.

 uint8_t i,j = 0;
  uint8_t buff[8] = {1,2,3,4,5,6,7,8};
  uint8_t digit[10] = { 
      0xC0, // 0
      0xF9, // 1
      0xA4, // 2
      0xB0, // 3
      0x99, // 4
      0x92, // 5
      0x82, // 6
      0xF8, // 7
      0x80, // 8
      0x90, // 9 
  };
  uint8_t chr[4] = { 
      0x8,  
      0x4,  
      0x2,  
      0x1  
  };

Строб необходим для начала записи данных в регистр хранения сдвигового регистра

void strob(void){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(85);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(85);
}

Функция передачи данных с использованием HAL функции и строба.
void spi_send(uint8_t *data, uint8_t it){
  strob();
 uint8_t *d = data;
  for(j = 0; j <=it; j++){
    d = &data[j];
  HAL_SPI_Transmit ( &hspi1, d, 8, 50); 
  }
  strob();
}

Отправляю смешение по элементам блока семисегментного индикатора.

  while (1)
  { i++;
    if(i<=4){
spi_send(chr, i);
  } else i = 4;
  i = -1;
  

s.7z

Файлы с IAR проектом и CubeMX проектом инициализации.

1dsfs.7z

Пример работы индикатора

video_2018-07-04_00-13-42.mp4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexter    341

Похоже, да. :)

Без указания модели индикатора, без схемы подключения и с неработающим аппаратным SPI вряд ли кто будет в вашем коде разбираться.

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Olga Kovin
      Индикаторы:
      ИВ-8. В наличии: 300шт по 20р/шт.                     
      ИЛЦ1-1/9. В наличии: 750шт по 30р/шт.            
      ИЛЦ2-12/8Л. В наличии: 60шт по 40р/шт.           
      ИЛЦ3-4/7М. В наличии: 2800шт по 25р/шт.          
      ИЛТ1-8М. В наличии: 800шт по 45р/шт.               
      ИЛТ6-30М. В наличии: 600шт по 90р/шт.            
      Все с хранения, в групповых упаковках. Паспорт, общий на каждую упаковку!
      Индикаторы ИЧ. В хорошем состоянии. 2шт по 1000р за шт.
       
      Саратовская обл. г. Энгельс
      Отправим: почтой, транспортной компанией, в Москву - с курьером.
       
      Контакты: 
      Моб. тел.:+7904-240-51-17.
      E-mail: olgalosewa86@mail.ru












    • Автор: megavolt3101
      Здравствуйте уважаемые форумчане. Пытаюсь связать два микроконтроллера по шине LIN. В качестве мастера выбрал контроллер STM8S103F3P6 (Его Usart умеет только LIN MASTER). В качестве ведомого выбрал STM8S208RBT6 (У него 2 Усарта, один из которых умеет быть ведомым LIN) Собрал на двух макетных платах. LIN трансивер TJA1020 Прием и передача работают нормально. Но как дошло дело до защиты от потери линии связи, тут возникли проблемы. После обрыва линии связи и ее восстановления связь возобновляется. Но вот после короткого замыкания шины LIN ведомое (SLAVE) устройство намертво виснет. Точнее виснет в обработчике прерывания от USART3. Я пытался принудительно очистить флаг приема по узарту (UART3_FLAG_RXNE) и флаг приема хедер байта (UART3_FLAG_LHDF). А также скидывал флаг брэйк байта (UART3_FLAG_LBDF). Ничего не помогает программа не возвращается из прерывания по приему от USART_3. Но зато если в этот момент с ведущего устройства снова подать команду, то работоспособность ведомого устройства восстанавливается. Тоже самое помогает, если в обработчике прерывания по USART_3 принудительно подать рандомную команду на передачу. То есть, так как линия одна, она сама свою же команду и принимает, получается. Вроде все нормально, но как то коробит такой колхозный способ защиты от короткого замыкания шины. Подскажите, может я забываю еще какой нибудь скинуть флаг при случае коротыша на линии LIN или есть еще каrой нибудь правильный способ обойти защиту от потери связи после кратковременного замыкания на шине. Надеюсь тут есть люди, которые что-то делали с шиной LIN ?

      Прилагаю инициализацию для мастер устройства 
      UART1_Init( 9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
      UART1_LINBreakDetectionConfig( UART1_LINBREAKDETECTIONLENGTH_11BITS);
      UART1_ITConfig( UART1_IT_RXNE_OR, ENABLE);
      UART1_LINCmd( ENABLE);
      enableInterrupts();

      И для Ведомого устройства
      UART3_Init( 9600, UART3_WORDLENGTH_8D, UART3_STOPBITS_1, UART3_PARITY_NO, UART3_MODE_TXRX_ENABLE);
      UART3_LINConfig( UART3_LIN_MODE_SLAVE, UART3_LIN_AUTOSYNC_ENABLE,UART3_LIN_DIVUP_LBRR1);
      UART3_LINBreakDetectionConfig( UART3_LINBREAKDETECTIONLENGTH_11BITS);
      UART3_ITConfig( UART3_IT_RXNE_OR, ENABLE);
      UART3_ITConfig( UART3_IT_LBDF, ENABLE);
      UART3_ITConfig( UART3_IT_LHDF, ENABLE);
      UART3_LINCmd( ENABLE);
      enableInterrupts();

      А также обработчик прерывания для ведомого устройства
      //Обработчик прерывания для UART3.
      INTERRUPT_HANDLER( UART3_RX_IRQHandler, 21)
      {
      if( UART3_GetFlagStatus( UART3_FLAG_LHDF)){recUART3_Header=UART3_ReceiveData8(); UART3_ClearFlag(UART3_FLAG_LHDF);}
      if( UART3_GetFlagStatus( UART3_FLAG_RXNE)){recUART3_Data=UART3_ReceiveData8(); UART3_ClearFlag(UART3_FLAG_RXNE);}
      if( UART3_GetFlagStatus( UART3_FLAG_LBDF)){ UART3_ClearFlag( UART3_FLAG_LBDF);}
      if( UART3_GetFlagStatus(UART3_FLAG_OR_LHE)){UART3_SendData8(0x00);UART3_ClearFlag(UART3_FLAG_OR_LHE);}// Отправляю пустую команду через USART_3
      }
    • Автор: Krokodil007
      Продам
      ИВ-4, новые, с хранения, 183 шт. по 150 р/шт.
      Местонахождение: Саратовская обл.
      Возможна отправка почтой в любой регион РФ.


    • Автор: Sergey-Ufa
      Продам семисегментные вакуумные люминесцентные индикаторы:
      ИВ-4                 91шт.           50 руб./шт.

      https://rudatasheet.ru/tubes/iv4/
      ИВ-6               110 шт.         30 руб./шт.

      http://www.radiolamp.ru/sprav/ind/iv6.html
      ИВ-11              98 шт.           80 руб./шт.

      https://rudatasheet.ru/tubes/iv11/
      ИВ-27        7 шт.           80 руб./шт.

      http://yarelektronika.ru/files/image/ИВ-27М.PDF
      ИВЛ1-7/5      7 шт.           150 руб./шт.

      http://radio-hobby.org/uploads/datasheets/ivl/ivl1 7.5.pdf
      Цена без стоимости пересылки. Все индикаторы новые. Так как детали стеклянные и хрупкие, то требуется хорошая их упаковка и отправка возможна только посылкой. Поэтому для маленькой партии стоимость пересылки может равняться или даже быть больше стоимости деталей. При заказе большой партии возможна скидка. Все предложения в личку.
    • Автор: Радиосталкер
      Доброго времени суток. На китайских часах сгорели сегменты на индикаторе
      Точно такой же сегментный индикатор найти не могу, поэтому решил собрать из 4 отдельных индикаторов и применить светодиоды двоеточие(секунды)

      Микросхема T2488DD3

      У меня есть 4 штуки 7 - сегментные индикаторы и два светодиода(для секунды) и хочу их соединить с помощь по этой схеме:

      но в схеме на данный момент только 4 сегмента, а как применить к этой схеме двоеточие?
      Заранее спасибо!