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

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


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

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

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

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

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

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


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

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

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


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

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

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

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

  • Одобряю 1

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


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

Найдите миллионы труднодоступных

электронных компонентов

вообщем применил 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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Уважаемые Господа Попросили увеличить выходную мощность в кЕтайской автомагнитоле В оригинале стояла TDA2005 В принципе места много собрал на двух TDA2030, но начали "терзать смутные сомнения". В оригинале питающих проводов три - общий, +12 от аккумулятора и +12 от замка зажигания (вроде так). Монтаж довольно мелкий вроде бы оба +12В развязаны диодом (SMD опознать не смог но звонится как диод). Вот меня и смущает - выдержит ли этот диод ток двух TDA2030. Как вариант могу поставить Д245 (места хватит) только на питание нового УМ
    • Еще раз услышу про калокуб...за яйки подвешаю.
    • 60 года однако - на то время это круто было - бабиник не в каждом доме стоял ...Меняется все в этом мире  -мода -техника-  люди
    • У Гугла не пробовал спросить...  Иногда подает
    • Здравствуйте, подскажите какие то модели в ценовом диапазоне между TL071 - OPA2134, если они существуют, неужели все сводится к эти двум? Спасибо! Еще раз напомню, с полевиками на входе и в ДИП корпусах.
    • всем большое спасибо. Перешли в личку. Фото результата выложу.
    •   1. c 8 по 15 название другое, вместо GPIO_AFR_AFRH9_0 идет GPIO_AFRH_AFSEL9_0 или GPIO_AFRH_AFRH1_0 //USART1_TX PA9
      GPIOA->AFR[1] |= GPIO_AFRH_AFSEL9_0 | GPIO_AFRH_AFSEL9_1 | GPIO_AFRH_AFSEL9_2;
      //USART1_RX PA10
      GPIOA->AFR[1] |= GPIO_AFRH_AFSEL10_0 | GPIO_AFRH_AFSEL10_1 | GPIO_AFRH_AFSEL10_2;   2. GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_1; и GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED14_1;  оба варианта рабочие (Legacy defines) 3. GPIO_OSPEEDR_OSPEED14_1 и GPIO_OSPEEDER_OSPEEDR14_1 оба варианта рабочие (Legacy defines) 4. Тактирование в 407 включать не нужно.   тогда так что ли  GPIOA->AFR [1]=0b00000000000000000000011101110000, или GPIOA->AFR [1]=0x770  ? Присваивать напрямую можно только если значение регистра было нулевым,  но есть состояние сброса где не нули, в противном случае вы получите ошибку. Поэтому категорически такие записи не допускаются, только через оператор |