Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: клавиатура и 7и сегментник
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
manial
Здравствуйте, я только начал осваивать программирование МК. Вот решил взять ATmega16, научился зажигать лампочки через него и т.д. и решил сразу перейти на клавиатуру с которой можно будет вводить цифру и она будет высвечиваться на дисплее в 7 сегментов. Схема в протеусе вроде получилась (картинку прикрепил), а вот с программированием что то не так, в CVAVR сделал начальный код, 3 бита порта что относятся к столбикам клавиатуры сделал входами, 4 что за строки выходами, при нажатии на кнопку "1" 0й бит порта переходит в 0L, вот я и подумал, просто для проверки напишу следующее:
Код
...
while (1)
      {
      // Place your code here
      if(PORTB.0==0)
      PORTC.0=1;    

      };
...

Как мне думалось это будет зажигать сегмент при нажатии.. Подскажите пожалуйста что не так help.gif

Нажмите для просмотра прикрепленного файла
zhevak
Особо не вникал, но думаю что тебе нужно вместо if(PORTB.0==0) написать if (PINB.0 == 0)
PORT -- это то, что ты выводишь из контроллера,
а PIN -- это то, что реально есть у него на ногах.

Пример, если ты пытаешься вывесть "1", а вывод замкнут на землю (сопля там или Б-Э переход транзистора), то чтение PORT даст 1, а чтение PIN даст "0".
manial
zhevak
Действительно! Теперь буду знать. спасибо большое yeah.gif
bvn123
Кроме PINB в качестве регистра, содержащего инф. о состоянии соотв.линии порта B (см.ответ ZHEVAK),
не плохо перевести эту линию в режим приема (0 в соотв. разряде регистра DDRB) и установить высокий уровень в соотв.разряде PORTB
aleksey_g
Цитата(bvn123 @ Aug 17 2007, 14:49) *
установить высокий уровень в соотв.разряде PORTB

Чем включите внутренний подтягивающий к питанию резистор.
Если эта линия используется, только как вход, не всегда этот резистор полезен!
manial
Цитата
Кроме PINB в качестве регистра, содержащего инф. о состоянии соотв.линии порта B (см.ответ ZHEVAK),
не плохо перевести эту линию в режим приема (0 в соотв. разряде регистра DDRB) и установить высокий уровень в соотв.разряде PORTB


Если вы про PORTB.0..PORTB.2 то я так и сделал (в первом посту написано): на вход с подтяжкой.
Теперь надо что то придумать чтоб на портб.3..портб.6 ставился 0L поочередно...
Coolrunner
char buf = 0x08;
for(;;)
{
PORTB = ~buf;
if(buf == 0x80) buf = 0x08;
else buf <<= 1;// или buf = buf<<1;
}
manial
Coolrunner

Спасибо. Надо будет в этом разобраться чуток. я со смещениями еще не особо дружу smile3046.gif так что сделал пока что так:
Код
while (1)
      {
      // Place your code here
      
      //первая линия      
      
      PORTB.3=0;                  
      if(PINB.3==0&&PINB.0==0)
      {      
        PORTC=0;
        PORTC=0b00110000;  //1
        PORTB.3=1;
      }
      else if(PINB.3==0&&PINB.1==0)  
      {      
        PORTC=0;
        PORTC=0b01101101;  //2
        PORTB.3=1;
      }
      else if(PINB.3==0&&PINB.2==0)  
      {      
        PORTC=0;
        PORTC=0b01111001;    //3
        PORTB.3=1;
      }  
      else PORTB.3=1;
      ...
      }


в принципе все работает только сразу после высвечивания цифры она 1 или 2 раза мигает как то
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.