суббота, 16 сентября 2017 г.

Подключаем семисегментный индикатор

Работать будем с семисегментным индикатором из Китая D2531CUR. Преимуществом данного индикатора является его стоимость. За пять трех знаковых семисегментных индикатора я заплатил всего 130 р.




К выводам 6,8,10 семисегментного индикатора необходимо подключить резисторы 1кОм чтобы ограничить ток и падение напряжение на сегменты индикатора. Остальное в комментариях в листинге программы

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

// Общие выводы индикатора
#define D0 0x100 //индикатор 1 GPIO_Pin_7
#define D1 0x200 //индикатор 2 GPIO_Pin_8
#define D2 0x400 //индикатор 3 GPIO_Pin_9

//0 0x3F 00111111
//1 0x06 00000110
//2 0x5B 01011011
//3 0x4F 01001111
//4 0x66 01100110
//5 0x6D 01101101
//6 0x7D 01111101
//7 0x07 00000111
//8 0x7F 01111111
//9 0x6F 01101111

// массив со значениями чисел от 0 до 9
int number[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
int i=0;

void delay (uint32_t time_delay) //функция задержки
{
    uint32_t i;
    for (i=0;i<time_delay;i++);
}

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    //настройка портов под сегменты
    GPIO_InitTypeDef SEG;
    SEG.GPIO_Speed = GPIO_Speed_2MHz;
    SEG.GPIO_Mode  = GPIO_Mode_Out_PP;
    SEG.GPIO_Pin   = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6;
    GPIO_Init(GPIOA, &SEG);
    //настройка портов под индикаторы
    GPIO_InitTypeDef DIG;
    DIG.GPIO_Speed = GPIO_Speed_2MHz;
    DIG.GPIO_Mode  = GPIO_Mode_Out_OD; //настраиваем выходы на режим open drain
    DIG.GPIO_Pin   = GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9;
    GPIO_Init(GPIOA, &DIG);


    while(1)
    {
       for (i=0; i<10; i++){
           GPIO_Write(GPIOA, number[i]);
           GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET); //выключаем индикатор 2 и 3
           GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);
           delay (3000000);
       }
      
       for (i=0; i<10; i++){
           GPIO_Write(GPIOA, number[i]);
           GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET); //выключаем индикатор 1 и 3
           GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);
           delay (3000000);
       }
      
       for (i=0; i<10; i++){
           GPIO_Write(GPIOA, number[i]);
           GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET); //выключаем индикатор 1 и 2
           GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);
           delay (3000000);
       }
    }
}