Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите с написание кода


Помогите с написание кода

Сообщений 1 страница 10 из 10

1

Привет всем, помогите с написанием кода:
Как для 3 -х кнопок сделать такие вот эфекты (3 ноги допустим порта B)на вход  и две ноги (порта B) вывод ....

1. Нажатие одной из трех - сигнал на 1 - ю ногу....
2. Нажатие любой пары из 3 - моргание светодиодов на первой ноге.
3. Нажатие всех трех  сигнал на 2 - ногу.  (горит светодиод на второй ноге).

Спасибо.

0

2

Помогаю.
Ищете на форуме по запросу "кнопка", "светодиод".
Внимательно читаете. Пробуете писать свой код самостоятельно.
Если что-то не получается, уточняете в чём конкретно нужно помочь. И код не забывайте выкладывать.

Мне понадобится 5 минут написать этот код.
А кто то это сделает и того быстрее. Но за вас никто писать его не будет.
Разве только за деньги, да и то по предоплате.

0

3

$regfile = "m8def.dat"
$crystal = 1000000

Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
Config Portb.3 = Output
Config Portb.4 = Output

Do

If Pinb.0 = 0 Then
Portb.3 = 1
Else
Portb.3 = 0
End If

If Pinb.1 = 0 Then
Portb.3 = 1
Else
Portb.3 = 0
End If

If Pinb.2 = 0 Then
Portb.3 = 1
Else
Portb.3 = 0
End If

Loop

End

но скорее всего это неправильно ((( в симуляции зацикливание ... (моргает светодиод = )
далее не могу понять каким образом проверить состояние пары кнопок и остальных трех ? может перевести в числовую форму и опредилять сумму какой либо комбинации ?

Отредактировано vtotoro (2015-05-14 00:20:59)

0

4

нужно добавить в инициализации портов:
(если только у вас нет наружной подтяжки резисторами)

Set Portb.0                                                 'включить внутренний подтягивающий резистор
Set Portb.1                                                 'включить внутренний подтягивающий резистор
Set Portb.2                                                 'включить внутренний подтягивающий резистор

'Проверка на одновременное нажатие двух кнопок
If Pinb.0 = 0 And Pinb.1 = 0 Then                         
     
End If

0

5

Спасибо за ответ.
Взял и перекроил код ,вот но есть проблемма постоянно при включении наличие на Portb.1 логической единицы... ну и потом по кругу эфекты... пока не перебереш кнопками.....
не сбросит ( на что обратить внимание?

$regfile = "m8def.dat"                                      'specify the used micro
$crystal = 1000000                                          'used crystal frequency
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space

Config Portb.0 = Output                                     
Config Portb.1 = Output                                   
Config Portd.4 = Input                                     
Config Portd.5 = Input                                     
Config Portd.2 = Input
Config Int0 = Falling
Config Debounce = 50
Enable Interrupts

Dim Effect As Byte
Dim Temp As Byte
Temp = 250

Portb = 0

Do

   Effect = 0
   If Pind.2 = 0 Then Effect = 1
   If Pind.4 = 0 Then Effect = 1
   If Pind.5 = 0 Then Effect = 1
   If Pind.4 = 0 And Pind.5 = 0 Then Effect = 2
   If Pind.5 = 0 And Pind.2 = 0 Then Effect = 2
   If Pind.2 = 0 And Pind.4 = 0 Then Effect = 2
   If Pind.2 = 0 And Pind.4 = 0 And Pind.5 = 0 Then Effect = 3

Effect = 1
   If Effect = 1 Then
      Portb.0 = 1

   End If

Effect = 2
   If Effect = 2 Then
      Portb.0 = 1

      Waitms Temp

      Portb = 0

      Waitms Temp

   End If

   If Effect = 3 Then

    Portb.1 = 1

   End If

If Effect = 0 Then Portb = 0

Loop

End

0

6

Зачем вы в главном цикле присваиваете значения Effect = 1 и Effect = 2?
Они ведь у вас и так меняются на кнопках!

0

7

Извините это описание .... 'Effect = 1

0

8

посмотрите в сторону  ElseIf
На крайняк Case (тут для Вас сложней будет, но попробую подтолкнуть)

Код:
кнопка = portb and &b00000111 ' определяем нажатые кнопки (конфигурация портов из первой программы)
select case кнопка
case 1 : нажата 1 кнопка
case 2 : нажата 2 кнопка
case 3 : нажаты 1 и 2 кнопки
и т. д.
else case: ничего не нажато - всё выключаем

Отредактировано kip (2015-05-14 15:49:44)

0

9

vtotoro написал(а):

есть проблемма постоянно при включении наличие на Portb.1 логической единицы

Ошибка в том, что "жёстко" прописано - PORTB = 0, то биш - ВХОД, а перед этим в конфигурации написано  - НА ВЫХОД. Программа исполняется по кругу и если питание было подано то, что было сконфигурировано в начале, и по порядку строк кода, потом попадает в цикл DO...LOOP. С какими параметрами? Уже с неправильными. :) Инверсными.

Отредактировано sevastopolets (2015-05-16 00:00:31)

0

10

Спасибо Radan. Выкладываю рабочий код, проверил в работе все ОК! Если что делайте замечания.

$regfile = "m8def.dat"                                      'specify the used micro
$crystal = 1000000                                          'used crystal frequency
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space
Set Portd.4
Set Portd.5
Set Portd.2
Config Portb.0 = Output
Config Portb.1 = Output
Config Portd.4 = Input
Config Portd.5 = Input
Config Portd.2 = Input
Config Int0 = Falling
Config Debounce = 50
Enable Interrupts
Dim Effect As Byte
Dim Temp As Byte
Temp = 250
Portb = 0
Do

   Effect = 0
   If Pind.2 = 0 Then Effect = 1
   If Pind.4 = 0 Then Effect = 1
   If Pind.5 = 0 Then Effect = 1
   If Pind.4 = 0 And Pind.5 = 0 Then Effect = 2
   If Pind.5 = 0 And Pind.2 = 0 Then Effect = 2
   If Pind.2 = 0 And Pind.4 = 0 Then Effect = 2
   If Pind.2 = 0 And Pind.4 = 0 And Pind.5 = 0 Then Effect = 3

   If Effect = 1 Then

      Portb.0 = 1

   End If

   If Effect = 2 Then

      Portb.0 = 1

      Waitms Temp

      Portb = 0

      Waitms Temp

   End If

   If Effect = 3 Then

    Portb.1 = 1

   End If

   If Effect = 0 Then Portb = 0

   Loop

   End

Отредактировано vtotoro (2015-05-19 02:00:11)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите с написание кода