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

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

Стандартный семисегментовый индикатор выглядит следующим образом:

Для подключения семисегментного индикатора можно  использовать любые свободные  ножки, схему  с прямым подключением и обратным можно посмотреть тут.

Все ножки настроены на выход с активным высоким уровнем (для семисегментного индикатора с прямым подключением):

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

Так как у нас с таймерами не густо, мы будем использовать 1 таймер  который мы подключим в ячейку TIMER1 для переключения индикаторов и для счета от 0 до 99.  У Вас в программе, вместо чисел которые меняются по таймеру, может быть любое число, например некое значение с аналогового входа.

При настройке прерывания, не забываем делать изменения в файле прерываний (подробное описание в уроке №2).

Ниже код с описанием:

#include // part specific constants and macros
#include «PSoCAPI.h» // PSoC API definitions for all User Modules

unsigned int timerTicks; // переменная для подсчета количества прерываний
#pragma interrupt_handler myTimer_ISR_Handler;//объявляем прерывание
void myTimer_ISR_Handler(void);//функция прерывания

void namber(int t, char v);
void myTimer_ISR_Handler(void);
unsigned int speed =0;
int n=0;
int w=0;
int c[3]={0};

void main(void)
{
M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
// Insert your main routine code here.
timerTicks=0;
Timer16_EnableInt();
Timer16_Start();
LED_1_Start(); LED_2_Start();
LED_a_Start(); LED_b_Start();LED_c_Start();LED_d_Start();LED_f_Start();LED_g_Start();LED_e_Start();
while (1)
{
if (timerTicks>5000)
{
timerTicks=0; // сброс значения
n++; if (n==100){n=0;}// считаем от 0 до 99
}
if (speed == 100){ w++; if (w==3){w=1;} speed=0; // скорость переключения между семисегментными сегментами
if (w==1){c[1]=n%10;namber(c[1],w);} // вывод первого символа
if (w==2){c[2]=n%100/10;namber(c[2],w);}// вывод второго символа
}
}
}

void namber(int t, char v) // выводим цыфры
{
LED_1_Off(); LED_2_Off();
switch (t)
{
case 0: LED_a_On(); LED_b_On();LED_c_On();LED_d_On();LED_e_On();LED_f_On();LED_g_Off();break;
case 1: LED_a_Off(); LED_b_On();LED_c_On();LED_d_Off();LED_e_Off();LED_f_Off();LED_g_Off();break;
case 2: LED_a_On(); LED_b_On();LED_c_Off();LED_d_On();LED_e_On();LED_f_Off();LED_g_On();break;
case 3: LED_a_On(); LED_b_On();LED_c_On();LED_d_On();LED_e_Off();LED_f_Off();LED_g_On();break;
case 4: LED_a_Off(); LED_b_On();LED_c_On();LED_d_Off();LED_e_Off();LED_f_On();LED_g_On();break;
case 5: LED_a_On(); LED_b_Off();LED_c_On();LED_d_On();LED_e_Off();LED_f_On();LED_g_On();break;
case 6: LED_a_On(); LED_b_Off();LED_c_On();LED_d_On();LED_e_On();LED_f_On();LED_g_On();break;
case 7: LED_a_On(); LED_b_On();LED_c_On();LED_d_Off();LED_e_Off();LED_f_Off();LED_g_Off();break;
case 8: LED_a_On(); LED_b_On();LED_c_On();LED_d_On();LED_e_On();LED_f_On();LED_g_On();break;
case 9: LED_a_On(); LED_b_On();LED_c_On();LED_d_On();LED_e_Off();LED_f_On();LED_g_On();break;
}

// включаем нужный семисегментный индикатор
if (v==1){LED_1_On();LED_2_Off();}
if (v==2){LED_2_On();LED_1_Off();}
}

void myTimer_ISR_Handler(void) // описание действия, когда происходит прерывание
{
timerTicks++;
speed++;
}

<<—  Предыдущий урок

Следующий урок —>>

<<—  Предыдущий урок

СОДЕРЖАНИЕ

Следующий урок —>>