| Помогите разобраться с кнопкой. | 
|  | 
| 
 
 
 
 | 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | Рад, что смог быть полезным |  
 |  |  |  |