Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите разобраться с кнопкой. (Команда Button)
Помогите разобраться с кнопкой.
shaman Дата: Ср, 16.11.2011, 23:44  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Здравствуйте,помогите пожалуйста новичку.Я хочу разобраться с программой подключением кнопок.Суть такая нажал на кнопку PortA.0 включился светодиод PortB.0,нажал на кнопку PortA.1 выключился светодиод PortB.1
Текст программы прилагаю: схема на Pic 16F877A
Adcon1 = 6
TrisA = %00000011
PortA = %00000011
TrisB = %00000000
PortB = %00000000
B0 var byte
b0 = 0
main:
Button PortA.0,0,255,255,B0,1,Loop
Goto main
Button PortA.1,0,255,255,B0,1,Loop1
Goto main
Loop:
High PortB.0
Loop1:
Low PortB.0
Goto main
End

Сообщение отредактировал shaman - Ср, 16.11.2011, 23:45
ЯНДЕКС Дата: 16.11.2011
ADMIN Дата: Чт, 17.11.2011, 07:17  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

После
Loop:
High PortB.0
у тебя сразу начнется выполнение

Loop1:
Low PortB.0
Goto main

Во-первых, High PORTB.0 и Low PORTB.0 нужно оформлять как подпрограммы и возвращаться из них по Return.
Кроме того, зачем эта команда - Button? Можно проще сделать:
If PORTA.0 = 0 Then High PORTB.0
If PORTA.1 = 0 then Low PORTB.0
shaman Дата: Чт, 17.11.2011, 11:26  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Здравствуйте ADMIN, спасибо Вам за ответ. Я пробывал как Вы написали(If PORTA.0 = 0 Then High PORTB.0
If PORTA.1 = 0 then Low PORTB.0) поевляется дребезг контактов,поигрался с командой Pause тоже не то .
Посмотрите пожалуйста так правильно будит
main:
Button PortA.0,0,255,255,B0,1,Loop
Goto main
Button PortA.1,0,255,255,B0,1,Loop1
Goto main
Loop:
High PortB.0
Return
Goto main
Loop1:
Low PortB.0
Return
Goto main
End
ADMIN Дата: Чт, 17.11.2011, 12:24  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А как дребезг контактов влияет на зажигание светодиода?
Команда If поймает хоть один 0 на порту - сразу включит светодиод. Также и выключение.
Чтобы вызвать подпрограмму - нужно использовать инструкцию Gosub. В команде Button происходит переход на подпрограмму, а не вызов - то есть то же самое что и команда Goto, по которой не обязательно возвращаться назад. И вообще, команда Button используется для повтора одного и того же действия при нажатии и удержании кнопки - как в клавиатуре компьютера - нажал на букву и она беспрерывно печатается.
В данном случае - по If...Then - самый оптимальный вариант.
shaman Дата: Чт, 17.11.2011, 13:41  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Спасибо огромное Вам ADMIN за помощь,примного благодарен,всё работает я перепутал подключение батарейки в протеусе ,я подавал + а нужно -.
А поскажите пожалуйста как сделать всё от одной кнопки вкл и выкл.
Это необходимо ввести подпрограмму опроса кнопки и прописать подпрограмму вкл и выкл
правильно я понимаю.
Заранее спасибо.
retas Дата: Чт, 17.11.2011, 14:22  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 462
Репутация: 10   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

--А как дребезг контактов влияет на зажигание светодиода?--
На антидребезг надо смотреть и как на защиту от помех либо сбоев и очень правильно что
человек пишет прогру оглядываясь на него.


Новый подход к питанию потребителей переменного тока: http://ekolaif.ucoz.ru
ADMIN Дата: Чт, 17.11.2011, 15:03  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Мне хотелось услышать мнение ТС на этот счет. Не спорю, что правильно он мыслит, но решает он в данный момент определенную задачу. Я подсказал определенный вариант - устранение дребезга в данном случае - второй вопрос

Quote

Это необходимо ввести подпрограмму опроса кнопки и прописать подпрограмму вкл и выкл
правильно я понимаю.
Заранее спасибо.

А поскажите пожалуйста как сделать всё от одной кнопки вкл и выкл.
В таком случае я, например, использую простую переменную - бит, которая принимает два значения - либо 0, либо 1. При первом нажатии я устанавливаю в 1 эту переменную, при втором - сбрасываю в 0. И в зависимости от состояния этого 'флага", выполняю либо одно действие, либо другое.
shaman Дата: Чт, 17.11.2011, 19:47  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Спасибо огромное за помощь,буду пробывать . Как сделаю отпишусь.

Добавлено (17.11.2011, 19.47.28)
---------------------------------------------
Ребят я вконец запутался, и зашол в тупик прочитал в книге Халинского стр.79-83 попытался написать невышло
Прошу Вашей помощи,несачтите за наглость .
Кому нетрудно,напишите пожалуйста текст как нужно правильно сделать.Огромное Вам СПАСИБО

ADMIN Дата: Пт, 18.11.2011, 07:06  |                                                                                                                Сообщение # 9
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Сформулируй конечную задачу
shaman Дата: Вс, 20.11.2011, 01:26  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Доброе утро всем,я в конечном результате хочу написать прошивку с выбором режима управления. т.е нажал на кнопку высветилась цифра 1 свето.диоды заморгали и т.д Огромное Вам спасибо за помощь, поэтому и обращяюсь к Вам за помощью когда возникают проблемы. Сейчас изучаю по книги как подключить 7 сигмент.

Добавлено (19.11.2011, 18.58.53)
---------------------------------------------
Всем добрый вечер,подскажите пожалуйста как лучше сделать, попробовал применить команду (count) для вкл-выкл одной кнопкой светодиода
В чём ошибка делал как по книги, код прилагаю:
Adcon1 = 6
TrisA = %00000011
PortA = %00000011
TrisB = %00000000
PortB = %00000000
j var byte
main:
If PortA.0 = 0 Then Goto Loop
Loop:
count PORTA.0,3000,j
if j = 1 then Goto Map2
If J = 2 Then Goto Map3
Goto main
Map2:
high PortB.0
Goto main
Map3:
Low PortB.0
Goto main
End

Добавлено (20.11.2011, 01.26.01)
---------------------------------------------
Доброй ночи,ADMIN подскажи пожалуйста как лучше сделать , написал текст как Вы писали в посте выше,и не могу понять как ввести второе нажатие кнопки чтобы сбросить в 0 и выключить светодиод.Заранее Благодарю за помощь,текст программы прилагаю:
Adcon1 = 6
TrisA = %00000001
PortA = %00000001
TrisB = %00000000
PortB = %00000000
B0 var bit
B0 = 0
B0 = 1
main:
If PortA.0 = 0 Then Goto Loop
Goto main
Metka:
If PortA.0 = 0 Then goto Loop2
Goto main
Loop:
if B0 = 1 then Goto Map
Map:
If B0 = 1 Then High PortB.0
Goto Metka
Loop2:
If B0 = 0 Then Goto Map2
Map2:
If B0 = 0 Then Low PortB.0
Goto main
End

ADMIN Дата: Вс, 20.11.2011, 04:04  |                                                                                                                Сообщение # 11
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Так же будет проще, не правда ли:

TestBit var Bit
TestBit = 0 'Инициализируем данную переменную

Main:
If PORTA.0 = 0 then 'Если нажата кнопка
TestBit = ~TestBit 'Инверсия бита
endif

If TestBit = 1 then 'А здесь, если переменная равна единице
High PORTB.0 'то зажигаем светодиод
else 'Иначе
Low PORTB.0 'гасим его
endif

goto Main 'Начинаем цикл сначала
Зачем эти Goto Loop?
shaman Дата: Вс, 20.11.2011, 09:28  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Доброе утро,ADMIN спасибо Вам ОГРОМНОЕ за помощь , не ругайте сильно , да так программа проще намного ,всё же я хочу разобраться по второму варианту программы , подскажите в чём моя ошибка , она работает только на включение при втором нажатии она не выключает лампочку . Заранее Спасибо.
ADMIN Дата: Вс, 20.11.2011, 10:45  |                                                                                                                Сообщение # 13
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Ну там много лишнего, но основная ошибка в том - что бит не инвертируется нигде. Есть проверка - если он равен 1 то зажечь светодиод. Есть проверка если равен нулю - то погасить светодиод. А где то место, где этот бит инвертируется?
После строчек
B0 = 0
B0 = 1 - этот бит так и останется единицей, не так ли?
В моем последнем примере это место
If PORTA.0 = 0 then 'Если нажата кнопка
TestBit = ~TestBit 'Инверсия бита
endif
shaman Дата: Вс, 20.11.2011, 14:29  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 179
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Спасибо Вам Огромное за помощь ADMIN,буду продолжать изучение дальше.
ADMIN Дата: Вс, 20.11.2011, 17:07  |                                                                                                                Сообщение # 15
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Рад, что смог быть полезным
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите разобраться с кнопкой. (Команда Button)
Страница 1 из 11
Поиск: