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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите с написанием управления 8 нагрузками и выводом на дисплей.


Помогите с написанием управления 8 нагрузками и выводом на дисплей.

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

1

Привет. Извините но дуб-дубом не могу никак освоить управление кнопками, уже попробовал на примере  с одной кнопкой
но вот с 2 и больше никак, просто есть следующая задача. 8 кнопок - 8 нагрузок , в последующем с выводом на LCD дисплей нажатых команд.
и все вроде как просто нажал- включил , нажал еще раз выключил , вставлял в код примера одной кнопки и никак.
Использую Atmega8 , порт B к примеру кнопки , порт D нагрузка, порт C - вывод на LCD
Помогите плиз очень нужно.

Отредактировано vtotoro (2014-12-02 03:58:43)

0

2

Примерно так.

Код:
$regfile = "m8def.dat"
$Crystal=10000000
$hwstack=40
$swstack=16
$framesize=32

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6



Config Portb = Input
Kn1 Alias Portb.0
Kn2 Alias Portb.1
Kn3 Alias Portb.2
Kn4 Alias Portb.3
Kn5 Alias Portb.4
Kn6 Alias Portb.5
Kn7 Alias Portb.6
Kn8 Alias Portb.7

Config Portd = Output
Led1 Alias Portd.0
Led2 Alias Portd.1
Led3 Alias Portd.2
Led4 Alias Portd.3
Led5 Alias Portd.4
Led6 Alias Portd.5
Led7 Alias Portd.6
Led8 Alias Portd.7



Config Int0 = Falling
On Int0 Кнопка
Enable Interrupts
Enable Int0


Dim A As Byte
Portd = 0


Do

    If A = 1 Then
    Toggle Led1
    End If

    If A = 2 Then
    Toggle Led2
    End If

    If A = 3 Then
    Toggle Led3
    End If

    If A = 4 Then
    Toggle Led4
    End If

    If A = 5 Then
    Toggle Led5
    End If

    If A = 6 Then
    Toggle Led6
    End If

    If A = 7 Then
    Toggle Led7
    End If

    If A = 8 Then
    Toggle Led8
    End If

    Idle

Loop


Кнопка:
 Do

  If Kn1 = 0 Then
  A = 1
  End If

  If Kn2 = 0 Then
  A = 2
  End If

  If Kn3 = 0 Then
  A = 3
  End If

  If Kn4 = 0 Then
  A = 4
  End If

  If Kn5 = 0 Then
  A = 5
  End If

  If Kn6 = 0 Then
  A = 6
  End If

  If Kn7 = 0 Then
  A = 7
  End If

  If Kn8 = 0 Then
  A = 8
  End If

 Loop Until A <> 0
 Waitms 50
 Gifr = 64

Return

0

3

Спасибо. А если при компиляции ошибки ?

0

4

Убрал LCD , ошибки при компиляции пропали. И еще вопрос  по какой схеме подключены кнопки , просто на землю ? не понимаю принципа только раз нажал и все , или тут все же вкл. выкл. ?
спасбо

Отредактировано vtotoro (2014-12-02 08:14:43)

0

5

Код:
$regfile = "m8def.dat"
$crystal = 8000000                                                              ' от внутреннего генератора, иначе нужно подключить кварц к порту B
$hwstack=40
$swstack=16
$framesize=32

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.0 , Rs = Portc.1



Config Portb = Input
Portb = &B11111111                                                              ' Включаем подтяжку пинов
Kn1 Alias Pinb.0
Kn2 Alias Pinb.1
Kn3 Alias Pinb.2
Kn4 Alias Pinb.3
Kn5 Alias Pinb.4
Kn6 Alias Pinb.5
Kn7 Alias Pinb.6
Kn8 Alias Pinb.7

Config Portd = Output
Led1 Alias Portd.0
Led2 Alias Portd.1
Led3 Alias Portd.2
Led4 Alias Portd.3
Led5 Alias Portd.4
Led6 Alias Portd.5
Led7 Alias Portd.6
Led8 Alias Portd.7


' Вывод INT0 - PIIND.2  , который занят реле
'Config Int0 = Falling
'On Int0 Кнопка


Config Timer1 = Timer , Prescale = 8 : On Timer1 Кнопка                         ' Прерывание раз в  0,065 сек

Enable Timer1
Start Timer1
Enable Interrupts
'Enable Int0


Dim A As Byte                                                                   ' Переменная состояния нагрузок
Dim B As Byte                                                                   ' Промежуточная переменная
Dim Button_flag As Bit                                                          ' Флаг нажатой кнопки

Portd = 0


Do

    Led1 = A.0                                                                  ' PORTD = &B00000000 ; A = &B00000000
    Led2 = A.1
    Led3 = A.2
    Led4 = A.3
    Led5 = A.4
    Led6 = A.5
    Led7 = A.6
    Led8 = A.7


' То же самое:
'Portd = A

Loop


Кнопка:                                                                         ' Прерывание от переполнения таймера1, каждые 0,065 сек

If Button_flag = 0 And Pinb <> &B11111111 Then                                  ' Если флаг нажатия кнопки сброшен и кнопка нажата

   B = Pinb Xor &B11111111                                                      ' Тут получаем лог. 1 в бите нажатой кнопки. Например: PINB.2 = 0 --> B = &B00000100
   A = A Xor B                                                                  ' Тут операция XOR с старым значением А. Изменяются только новые значения (биты)

' то же самое:
'If Kn1 = 0 Then Toggle A.0
'If Kn2 = 0 Then Toggle A.1
'If Kn3 = 0 Then Toggle A.2
'If Kn4 = 0 Then Toggle A.3
'If Kn5 = 0 Then Toggle A.4
'If Kn6 = 0 Then Toggle A.5
'If Kn7 = 0 Then Toggle A.6
'If Kn8 = 0 Then Toggle A.7


   Set Button_flag                                                              ' Устанавливаем флаг

End If

If Pinb = &B11111111 Then Reset Button_flag                                     ' Если пины порта подтянуты к + питания и на всех лог. 1, значит ни одна кнопка не нажата, сбрасываем флаг

Return

0

6

Спасибо преогромное ! В Протеусе работает ) Посмотрю как на деле )

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите с написанием управления 8 нагрузками и выводом на дисплей.