• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
Desert _Eagl.5

Переключение С Помощью 1 Одной Кнопки, At89C51

5 сообщений в этой теме

Здраствуйте

Немогу понять как реализовать следующий алгоритм: есть кнопка, она замыкает пин контроллера на землю, этот же пин подтянут к + через резистор. Вообщем хочу сделать структуру CASE, которая будет управляться этой кнопкой. Так вот как можно реализовать такое?

Опрос кнопки делаю так

m1:
setb p1.0
mov c, p1.0
jc m2
call функция
jmp m1
m2:
 call функция
 jmp m1

И есть вот такая реализация вышеописанного алгоритма, которая не работает из за того что некоторые функции непонимает Keil c51

 mov	 ax,I
 cmp	 ax,0		 ; проверка на 0
 jne	 not0
 call	 case0
 jmp	 endcase
not0: cmp	 ax,1		 ; проверка на 1
 jne	 not1
 call	 case1
 jmp	 endcase
not1: cmp	 ax,2		 ; проверка на 2
 jne	 not2
 call	 case2
not2:
endcase:

еще более лучший вариант

 mov	 bx,I
 shl	 bx,1	

 jmp	 cs:jump_table[bx]	

jump_table		 dw foo0,foo1,foo2 ; таблица переходов
foo0: call	 case0
 jmp	 endcase
foo1: call	 case1
 jmp	 endcase
foo2: call	 case2
 jmp	 endcase

Изменено пользователем Desert _Eagl.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
o_l_e_g    1 638

Ну и "намутили"!

Делается одной строчкой:

perekluychenie:
  CPL C  ' С- любой прямоадресуемый бит
RETI

Подпрограмму вызывать по прерыванию по фронту импульса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

дак у меня несколько подпрограмм( до 30 штук), с одной подпрограммой и без прерывания сделать можно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Cobban    114

Вполне можно использовать инструкцию jnb:

   jnb   p1.0, m2
  call   функция
  jmp   m1
m2:
  call функция
  jmp   m1

А два последних примера из 1-го поста скорее для x86, а не x51.

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вообщем применил cjne

LoopMain:
m1:
setb p1.0
mov c, p1.0
jc m2
inc r4

q:
cjne r4, #1, w
тут код какойто
jmp start

w:
cjne r4, #2, t
тут код какойто
jmp start
t:
.
.
.

qqq:
cjne r4, #254, ee
тут код какойто
jmp start

ee:
jmp start
m2:

jmp m1
sjmp LoopMain

в итоге имеем case на 255 ячеек...

всем спасибо за участие

Изменено пользователем Desert _Eagl.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас