Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Pin1999
21 / 15 / 5
Регистрация: 16.08.2013
Сообщений: 1,217
1

Матричная клавиатура

03.07.2015, 21:07. Просмотров 611. Ответов 6
Метки нет (Все метки)

Народ, все ни как не могу разобраться с матричной клавиатурой (3x3)...
Контроллер ATmega8
Вешаю на порт C
Делаю так (В Arduino IDE подобный способ работает, в обычном AVRGCC пин на выдачу с "0" не замыкает пин на прием с "1"...):

Кликните здесь для просмотра всего текста

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

#include "n3310.h"

#define F_CPU 8000000UL

#define set_pin_mode(portdir, pin, mode) { if(mode==1) { portdir |= (1 << pin); } else if(mode==0) { portdir &= ~(1 << pin); } }
#define set_pin_state(port, pin, state) { if(state==1) { port |= (1 << pin); } else if(state==0) { port &= ~(1 << pin); } }

int main(void)
{
set_pin_mode(PORTC, 0, 0);
set_pin_state(PORTC, 0, 1);
set_pin_mode(PORTC, 1, 0);
set_pin_state(PORTC, 1, 1);
set_pin_mode(PORTC, 2, 0);
set_pin_state(PORTC, 2, 1);
set_pin_mode(PORTC, 3, 1);
set_pin_state(PORTC, 3, 1);
set_pin_mode(PORTC, 4, 1);
set_pin_state(PORTC, 4, 1);
set_pin_mode(PORTC, 5, 1);
set_pin_state(PORTC, 5, 1);

LcdInit();

while(1)
{

LcdClear();

LcdGotoXYFont(0, 0);
//first column
set_pin_state(PORTC, 5, 0);
_delay_ms(100);
if (!bit_is_set(PINC, 0))
{ LcdInt(FONT_1X, 1); }
if (!bit_is_set(PINC, 1))
{ LcdInt(FONT_1X, 2); }
if (!bit_is_set(PINC, 2))
{ LcdInt(FONT_1X, 3); }
set_pin_state(PORTC, 5, 1);
//second column
set_pin_state(PORTC, 4, 0);
_delay_ms(100);
if (!bit_is_set(PINC, 0))
{ LcdInt(FONT_1X, 4); }
if (!bit_is_set(PINC, 1))
{ LcdInt(FONT_1X, 5); }
if (!bit_is_set(PINC, 2))
{ LcdInt(FONT_1X, 6); }
set_pin_state(PORTC, 4, 1);
//third column
set_pin_state(PORTC, 3, 0);
_delay_ms(100);
if (!bit_is_set(PINC, 0))
{ LcdInt(FONT_1X, 7); }
if (!bit_is_set(PINC, 1))
{ LcdInt(FONT_1X, 8); }
if (!bit_is_set(PINC, 2))
{ LcdInt(FONT_1X, 9); }
set_pin_state(PORTC, 3, 1);
_delay_ms(100);
LcdUpdate();
}
}


Дайте рабочий способ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 21:07
Ответы с готовыми решениями:

Матричная клавиатура
Подскажите пожалуйста.Матричная клавиатура,столбцы подтянуты к 0 и...

Клавиатура микроконтроллера
Добрый день, такой вопрос, никто не описывал клавиатуру в симуляторе MSC8052,...

PS/2 клавиатура на AVR
Хочу собрать свою клавиатуру PS/2 на AVR (mega16). Может у кого примерчик...

PC клавиатура+AVR
Здравствуйте. В интернете конечно много всего по этой теме, но пока что я не...

AVR+клавиатура PS/2
Поискал в Сети и нашёл 2 адекватных статьи: 1)...

6
Pin1999
21 / 15 / 5
Регистрация: 16.08.2013
Сообщений: 1,217
03.07.2015, 21:36  [ТС] 2
На всякий случай распиновка моей каливиатуры:
0
Миниатюры
Матричная клавиатура  
raxp
10185 / 6568 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
04.07.2015, 10:35 3
keyboard.c из проекта.

0
Pin1999
21 / 15 / 5
Регистрация: 16.08.2013
Сообщений: 1,217
04.07.2015, 17:37  [ТС] 4
raxp, Извините, а по проще нету?
Мне бы реализовать функцию int которая при ее вызове будет выводить номер нажатой клавиши...
И по умолчанию будет выводить на пример 99.
0
Ethereal
Нарушитель
4144 / 1755 / 228
Регистрация: 17.02.2013
Сообщений: 2,638
05.07.2015, 06:01 5
Да что-нибудь вроде такого :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
unsigned int drebezg = 0 ;
 
int key()
{
  int i, m ;
 
  if (drebezg != 0)
  {
   PORTC = 7 ;
   delay(10мс) ;
   drebezg-- ;
   if ((PINC & 7) != 7) drebezg = 5 ;
   return -1 ;
  }
  drebezg = 5 ;
  m = 0x20 ;
  for (i = 1 ; i < 8 ; i += 3)
  {
   PORTC = ~m ;
   delay(чуток) ;
   if ((PINC & 1) == 0) return i   ;
   if ((PINC & 2) == 0) return i+1 ;
   if ((PINC & 4) == 0) return i+2 ;
   m >>= 1 ;
  }
  drebezg = 0 ;
  return -1 ;
}
0
Pin1999
21 / 15 / 5
Регистрация: 16.08.2013
Сообщений: 1,217
05.07.2015, 08:32  [ТС] 6
Ethereal, Как настроить?

Добавлено через 57 минут
Тема закрыта, изначальный код работает.
Мой затуп...
set_pin_mode(PORTC, 0, 0);
Вместо PORTC надо было писать DDRC.


Всем спасибо за старания!
0
Meaning
0 / 0 / 1
Регистрация: 05.07.2015
Сообщений: 5
05.07.2015, 10:04 7
Pin1999
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int GetKey()
{
    int key_ = -1;
    
    pin_set(PORTC, 5, 0);
    _delay_ms(100);
    if(!pin_get(PINC, 2)) { key_ = 1; }
    if(!pin_get(PINC, 1)) { key_ = 2; }
    if(!pin_get(PINC, 0)) { key_ = 3; }
    pin_set(PORTC, 5, 1);
    if(key_ >= 0) { return key_; }
    
    pin_set(PORTC, 4, 0);
    _delay_ms(100);
    if(!pin_get(PINC, 2)) { key_ = 4; }
    if(!pin_get(PINC, 1)) { key_ = 5; }
    if(!pin_get(PINC, 0)) { key_ = 6; }
    pin_set(PORTC, 4, 1);
    if(key_ >= 0) { return key_; }
    
    pin_set(PORTC, 3, 0);
    _delay_ms(100);
    if(!pin_get(PINC, 2)) { key_ = 7; }
    if(!pin_get(PINC, 1)) { key_ = 8; }
    if(!pin_get(PINC, 0)) { key_ = 9; }
    pin_set(PORTC, 3, 1);
    return key_;
}


И с пропуском дребезга контактов.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
int GetKey()
{
    int key_ = -1;
    
    pin_set(PORTC, 5, 0);
    _delay_ms(100);
    if(!pin_get(PINC, 2))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 2))
        { key_ = 1; }
    }
    if(!pin_get(PINC, 1))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 1))
        { key_ = 2; }
    }
    if(!pin_get(PINC, 0))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 0))
        { key_ = 3; }
    }
    pin_set(PORTC, 5, 1);
    if(key_ >= 0) { return key_; }
    
    pin_set(PORTC, 4, 0);
    _delay_ms(100);
    if(!pin_get(PINC, 2))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 2))
        { key_ = 4; }
    }
    if(!pin_get(PINC, 1))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 1))
        { key_ = 5; }
    }
    if(!pin_get(PINC, 0))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 0))
        { key_ = 6; }
    }
    pin_set(PORTC, 4, 1);
    if(key_ >= 0) { return key_; }
    
    pin_set(PORTC, 3, 0);
    _delay_ms(100);
    if(!pin_get(PINC, 2))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 2))
        { key_ = 7; }
    }
    if(!pin_get(PINC, 1))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 1))
        { key_ = 8; }
    }
    if(!pin_get(PINC, 0))
    {
        _delay_ms(100);
        if(!pin_get(PINC, 0))
        { key_ = 9; }
    }
    pin_set(PORTC, 3, 1);
    return key_;
}
0
05.07.2015, 10:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2015, 10:04

не работает клавиатура на Atmega16
Здравствуйте. в своем проекте сделал четырехкнопочную клавиатуру. для этого...

Клавиатура 4х4 к Pic18F4520
Как можно реализовать взаимодействие клавиатуры с pic18f4520? Клавиатура - 4х4,...

Клавиатура своими руками с гироскопом
Здравствуйте! Появилась задача, а точнее цель, создать клавиатуру с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru