__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS); #define knopka RB2 // кнопка void podgot (void); // подготовка МК void main (void) { podgot(); if (knopka = 0) PORTB = 0b01111111; } // === подготовка МК void podgot (void) { TRISA = 0b00000000; // направление работы ножек порта А TRISB = 0b11111111; // направление работы ножек порта В CMCON = 0x07; // отключение компараторов PORTA = 0; // очищаем порт А PORTB = 0; // очищаем порт Б RBPU = 1; // подтягивающие R (0-вкл, 1-выкл) }
Дефайны лучше для удобства чтения подтягивать к инклюдам, сразу после них. Условие проверяется на равенство оператором ==, а не = (оператор присвоения) Приучайся при модификации порта не трогать те выводы, которые заняты. В твоем случае это вход кнопки. В твоем случае, судя по программе, ты не успеешь нажать кнопку после включения. Придется держать ее нажатой при подаче питания. Попробуй сделать в цикле:
Код:
void main (void) { podgot(); for(;;) { if (knopka == 0) PORTB |= 0b0000001; else PORTB &= 0b1111110; } }
И отслеживать состояние RB0 в зависимости от состояния кнопки.
Дефайны лучше для удобства чтения подтягивать к инклюдам, сразу после них. Условие проверяется на равенство оператором ==, а не = (оператор присвоения) Приучайся при модификации порта не трогать те выводы, которые заняты. В твоем случае это вход кнопки. В твоем случае, судя по программе, ты не успеешь нажать кнопку после включения. Придется держать ее нажатой при подаче питания.
И отслеживать состояние RB0 в зависимости от состояния кнопки.
Не пойму зачем нам отслежывать выход на индикатор? Я думал нужно отслежывать кнопку, тоесть RA2. Про равенство забыл. Виноват. И что такое Дефайны?:) Программа с изменением равенства не заработала:( В обед проверю с вашими исправлениями. Цель была такая- Нажимаем- горит Бросаем тухнет. А мочему вы в примере поставили |= и &= ?
__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS); #define knopka RB7 // кнопка void podgot (void); // подготовка МК void main (void) { podgot(); while(1) начало бесконечного цикла (внимательно читай самоучитель) { if (knopka == 0) PORTB0 = 1; else PORTB0 = 0; } //конец бесконечного цикла } //конец функции // === подготовка МК void podgot (void) { TRISA = 0b00000000; // направление работы ножек порта А TRISB = 0b10000000; // направление работы ножек порта В CMCON = 0x07; // отключение компараторов PORTA = 0; // очищаем порт А PORTB = 0; // очищаем порт Б RBPU = 1; // подтягивающие R (0-вкл, 1-выкл) }
я незнаю что они хотят доказать,и чем им ненравиться расположение дефайнов. присваивание описано правильно,нужно програмку лиш чуть чуть подкоректировать см.выше
скажите ,а зачем накладывать маски |= и &= на порт,чтобы вывести в него данные? в авр я встречал подобные присваивания, хотя просто пишу через = PORTB = 0b10100100; и все прекрастно работает
скажите ,а зачем накладывать маски |= и &= на порт,чтобы вывести в него данные? в авр я встречал подобные присваивания, хотя просто пишу через = PORTB = 0b10100100; и все прекрастно работает
Это не зависит от PIC или AVR. Логика тут простая : присваиванием меняешь _все_ разряды порта. Можно и так написа'ть, но при этом надо каждый раз помнить, что там было раньше, и каждый раз воспроизводить это состояние остальных выходов портов. А по маске - изменить состояние только выбранных выходов, не трогая остальные.
скажите ,а зачем накладывать маски |= и &= на порт,чтобы вывести в него данные? в авр я встречал подобные присваивания, хотя просто пишу через = PORTB = 0b10100100; и все прекрастно работает
Чтобы не "задевать" те разряды порта, которые нельзя трогать. Подобные сокращения в Си повсеметно приняты. Язык Си очень гибок. Но по сути все сводится к следующему преобразованию.
Код:
char temp; temp = PORTB & 0xFE; PORTB = temp;
Читаем в переменную temp значение выводов порта, накладывая маску, при этом бит_0 сбрасывается. Модифицированное значение temp выводим снова в порт. В результате bit_0 порта окажется сброшенным, при этом остальные разряды порта останутся неизменными. Оператор &= называется совмещенным оператором. Компилятор при этом сам наложит маску и присвоит модифицированное значение переменно, слева от оператора. Рекомендую почитать основы программирования на Си. В интернете бездна материала...
значит так во вложении проект протеуса и исходник что касаеться протеуса : кварц ставить необязательно(он все равно не эмулируеться) резисторы на индикатор тоже ставить не требуеться они только отнимают ресурсы компьютера
void podgot (void); // подготовка МК void main (void) { podgot(); while (1) { if (RA2 == 0) PORTB = 1; } } //конец функции // === подготовка МК
void podgot (void) { TRISA = 0b11111111; // направление работы ножек порта А TRISB = 0b00000000; // направление работы ножек порта В CMCON = 0x07; // отключение компараторов PORTA = 0; // очищаем порт А PORTB = 0; // очищаем порт Б RBPU = 1; // подтягивающие R (0-вкл, 1-выкл) }
Я уже скопировал ваш код, вставил в МПЛАБ, скомпилировал. В протеусе в свойствах пика указал на hex файл прошивки что в папке микрочипа в програм файлс. Нажимаю плей. Ничего не горит ( хорошо). При нажатие кнопки должны загореться все сегменты, но загорается и горит всё время только 1 сегмент с линии RB0. Хотя по идее при отжаатии ничего светится не должно. У вас тот код что вы написали, как в протеусе работает?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения