реклама на сайте
подробности

 
 
> клавиатура и 7и сегментник, не работает (
manial
сообщение Aug 17 2007, 10:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 15-04-07
Пользователь №: 27 057



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

      };
...

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

Прикрепленное изображение


Сообщение отредактировал manial - Aug 17 2007, 10:50
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
zhevak
сообщение Aug 17 2007, 11:01
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



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

Пример, если ты пытаешься вывесть "1", а вывод замкнут на землю (сопля там или Б-Э переход транзистора), то чтение PORT даст 1, а чтение PIN даст "0".

Сообщение отредактировал zhevak - Aug 17 2007, 11:02


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
manial
сообщение Aug 17 2007, 11:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 15-04-07
Пользователь №: 27 057



zhevak
Действительно! Теперь буду знать. спасибо большое yeah.gif
Go to the top of the page
 
+Quote Post
bvn123
сообщение Aug 17 2007, 12:49
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 9-08-04
Пользователь №: 468



Кроме PINB в качестве регистра, содержащего инф. о состоянии соотв.линии порта B (см.ответ ZHEVAK),
не плохо перевести эту линию в режим приема (0 в соотв. разряде регистра DDRB) и установить высокий уровень в соотв.разряде PORTB
Go to the top of the page
 
+Quote Post
aleksey_g
сообщение Aug 17 2007, 14:00
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066



Цитата(bvn123 @ Aug 17 2007, 14:49) *
установить высокий уровень в соотв.разряде PORTB

Чем включите внутренний подтягивающий к питанию резистор.
Если эта линия используется, только как вход, не всегда этот резистор полезен!
Go to the top of the page
 
+Quote Post
manial
сообщение Aug 17 2007, 17:17
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 15-04-07
Пользователь №: 27 057



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


Если вы про PORTB.0..PORTB.2 то я так и сделал (в первом посту написано): на вход с подтяжкой.
Теперь надо что то придумать чтоб на портб.3..портб.6 ставился 0L поочередно...

Сообщение отредактировал manial - Aug 17 2007, 17:22
Go to the top of the page
 
+Quote Post
Coolrunner
сообщение Aug 17 2007, 18:18
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 24-03-07
Пользователь №: 26 485



char buf = 0x08;
for(;;)
{
PORTB = ~buf;
if(buf == 0x80) buf = 0x08;
else buf <<= 1;// или buf = buf<<1;
}
Go to the top of the page
 
+Quote Post
manial
сообщение Aug 17 2007, 19:12
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 15-04-07
Пользователь №: 27 057



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 раза мигает как то
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 13:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016