Печать
Категория: PIC
Просмотров: 10358
По необходимой теории прошлись. Теперь можно приступать непосредственно к написанию конкретной программы.
Задача: На основе PIC16F84A сделать бегущий огонь на 8 светодиодов.
Для управления 4-мя нагрузками нам необходимо выбрать любые 4 вывода портов. Буду использовать выводы порта В: RB4, RB5, RB6 и RB7.
Нужно так же учесть, что через любой вывод портов, может проходить ток не более 25 мА. Что бы его не превышать, подключим светодиоды через токоограничивающие резисторы, как показано на схеме.
Запускаем mikroC Pro for PIC. Открываем уже созданный проект (если после создания проекта в программе ничего не делали, то он откроется сам при открытии программы).

Как видим уже есть запись

void main() {

}

 



Это есть начальная функция. С которой начнется выполнение программы.

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

Что бы программа выполнялась бесконечно долго (пока есть питание на МК), необходимо организовать цикл, в котором будет собственно сама программа для «бегущего огня». Приступим.

#define timepause 500         //заменяем timepause на 500

void main() {

  TRISB=0;                         //все выводы порта В на выход

  PORTB=0;                        //начальные значения на выводах порта 0

  while(1)                             //организуем бесконеченый цикл

  {

    PORTB.F4 = 1;                  //На RB4 1 - LED1 горит

    Delay_ms (timepause);     //Пауза на 500 мс

    PORTB.F4 = 0;                 //На RB4 0 - LED1 не горит

    PORTB.F5 = 1;                 //На RB5 1 - LED2 горит

    Delay_ms (timepause);     //Пауза на 500 мс

    PORTB.F5 = 0;                 //На RB5 0 - LED2 не горит

    PORTB.F6 = 1;                 //На RB6 1 - LED3 горит

    Delay_ms (timepause);     //Пауза на 500 мс

    PORTB.F6 = 0;                 //На RB6 0 - LED3 не горит

    PORTB.F7 = 1;                 //На RB7 1 - LED4 горит

    Delay_ms (timepause);     //Пауза на 500 мс

    PORTB.F7 = 0;                 //На RB7 1 - LED4 не горит

  }

}





























Можно заметить две новые команды #define и Delay_ms()

Delay_ms() – создает программную задержку в миллисекундах (указываются в дужках). Рабочая точка программы попадая на эту команду находится на ней ровно столько миллисикунд, сколько указано, после чего продолжает выполнение программы.

Команда #define подставляет вместо каждого первого значения, которое встречается в программе, второе.

#define значение_1 значение_2



В нашем случае использую ее для удобства. Достаточно поменять значение с 500 на 300 и она автоматом проставит эти значения в программе где встретится timepause – одним изменением изменяем 4 значения задержек включенных светодиодов.


При желании можно задействовать все выводы порта В (всего 8) и порта А (всего 5) и описать их в программе тем же способом, что и выше. Таким образом, на PIC16F84A можно будет собрать «бегущий огонь» состоящий из 13 независимых светодиода.

Так же любые вопросы можно обсудить на форуме.

Авторизоваться, чтобы комментировать