Помогите разобраться с кнопкой.
|
|
shaman |
Дата: Ср, 16.11.2011, 23:44 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 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
|
|
|
|
ADMIN |
Дата: Чт, 17.11.2011, 07:17 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А как дребезг контактов влияет на зажигание светодиода? Команда If поймает хоть один 0 на порту - сразу включит светодиод. Также и выключение. Чтобы вызвать подпрограмму - нужно использовать инструкцию Gosub. В команде Button происходит переход на подпрограмму, а не вызов - то есть то же самое что и команда Goto, по которой не обязательно возвращаться назад. И вообще, команда Button используется для повтора одного и того же действия при нажатии и удержании кнопки - как в клавиатуре компьютера - нажал на букву и она беспрерывно печатается. В данном случае - по If...Then - самый оптимальный вариант.
|
|
|
|
shaman |
Дата: Чт, 17.11.2011, 13:41 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Спасибо огромное Вам ADMIN за помощь,примного благодарен,всё работает я перепутал подключение батарейки в протеусе ,я подавал + а нужно -. А поскажите пожалуйста как сделать всё от одной кнопки вкл и выкл. Это необходимо ввести подпрограмму опроса кнопки и прописать подпрограмму вкл и выкл правильно я понимаю. Заранее спасибо.
|
|
|
|
retas |
Дата: Чт, 17.11.2011, 14:22 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
--А как дребезг контактов влияет на зажигание светодиода?-- На антидребезг надо смотреть и как на защиту от помех либо сбоев и очень правильно что человек пишет прогру оглядываясь на него.
|
|
|
|
ADMIN |
Дата: Чт, 17.11.2011, 15:03 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Мне хотелось услышать мнение ТС на этот счет. Не спорю, что правильно он мыслит, но решает он в данный момент определенную задачу. Я подсказал определенный вариант - устранение дребезга в данном случае - второй вопрос
Quote Это необходимо ввести подпрограмму опроса кнопки и прописать подпрограмму вкл и выкл правильно я понимаю. Заранее спасибо. А поскажите пожалуйста как сделать всё от одной кнопки вкл и выкл. В таком случае я, например, использую простую переменную - бит, которая принимает два значения - либо 0, либо 1. При первом нажатии я устанавливаю в 1 эту переменную, при втором - сбрасываю в 0. И в зависимости от состояния этого 'флага", выполняю либо одно действие, либо другое.
|
|
|
|
shaman |
Дата: Чт, 17.11.2011, 19:47 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Спасибо огромное за помощь,буду пробывать . Как сделаю отпишусь. Добавлено (17.11.2011, 19.47.28) --------------------------------------------- Ребят я вконец запутался, и зашол в тупик прочитал в книге Халинского стр.79-83 попытался написать невышло Прошу Вашей помощи,несачтите за наглость . Кому нетрудно,напишите пожалуйста текст как нужно правильно сделать.Огромное Вам СПАСИБО
|
|
|
|
ADMIN |
Дата: Пт, 18.11.2011, 07:06 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Сформулируй конечную задачу
|
|
|
|
shaman |
Дата: Вс, 20.11.2011, 01:26 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Доброе утро,ADMIN спасибо Вам ОГРОМНОЕ за помощь , не ругайте сильно , да так программа проще намного ,всё же я хочу разобраться по второму варианту программы , подскажите в чём моя ошибка , она работает только на включение при втором нажатии она не выключает лампочку . Заранее Спасибо.
|
|
|
|
ADMIN |
Дата: Вс, 20.11.2011, 10:45 | Сообщение # 13 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну там много лишнего, но основная ошибка в том - что бит не инвертируется нигде. Есть проверка - если он равен 1 то зажечь светодиод. Есть проверка если равен нулю - то погасить светодиод. А где то место, где этот бит инвертируется? После строчек B0 = 0 B0 = 1 - этот бит так и останется единицей, не так ли? В моем последнем примере это место If PORTA.0 = 0 then 'Если нажата кнопка TestBit = ~TestBit 'Инверсия бита endif
|
|
|
|
shaman |
Дата: Вс, 20.11.2011, 14:29 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Спасибо Вам Огромное за помощь ADMIN,буду продолжать изучение дальше.
|
|
|
|
ADMIN |
Дата: Вс, 20.11.2011, 17:07 | Сообщение # 15 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Рад, что смог быть полезным
|
|
|
|