Макроопределения

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Макроопределения

Сообщение Nixon83 »

Доброго времени суток помогите разобраться в коде, если не трудно объясните пожалуйста в двоичном коде!!!

Код: Выделить всё

//порт, к которому подключены кнопки
#define PORT_BUTTON 	PORTA
#define PIN_BUTTON 	PINA
#define DDRX_BUTTON 	DDRA

//номера выводов, к которым подключены кнопки
#define DOWN 		4
#define UP		5
#define ENTER 		6

[b]#define MASK_BUTTONS 	        ((1<<DOWN)|(1<<UP)|(1<<ENTER))[/b] обясните это выражение в двоичном коде	
[b]#define BitIsClear(reg, bit)    ((reg & (1<<(bit))) == 0)[/b] обясните это выражение в двоичном коде


//volatile unsigned char pressedKey = 0;
unsigned char comp = 0;

//________________________
[b]void BUT_Init(void)                                        что мы получаем сдесь? Если можно тоже в двоичном коде???
{
  DDRX_BUTTON &= ~(MASK_BUTTONS); 
  PORT_BUTTON |= MASK_BUTTONS;
}[/b]

//________________________
//#pragma inline = forced
void BUT_Debrief(void)
{
unsigned char key = 0;

  //последовательный опрос выводов мк
  if (BitIsClear(PIN_BUTTON, UP))     
    key = KEY_UP;
  else if (BitIsClear(PIN_BUTTON, DOWN))    
    key = KEY_DOWN;
  else if (BitIsClear(PIN_BUTTON, ENTER))        
    key = KEY_ENTER;    
  else {
    key = KEY_NULL;
  }
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Макроопределения

Сообщение SII »

#define MASK_BUTTONS ((1<<DOWN)|(1<<UP)|(1<<ENTER))

сформирует константу 1110000

#define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0)

формирует 1, если бит №bit в reg равен нулю, и 0 в противном случае. Здесь 1 и 0 рассматриваются как "истина" и "ложь", ну а само название макроса прямо говорит о его назначении, хотя не совсем грамотно, правильнее было бы IsBitClear (т.е. вопрос: "бит сброшен?").
Реклама
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Re: Макроопределения

Сообщение Nixon83 »

Хорошо получили константу только такую 01110000, как она работает сдесь:

void BUT_Init(void)
{
DDRX_BUTTON &= ~(MASK_BUTTONS);
PORT_BUTTON |= MASK_BUTTONS;
}


DDRX_BUTTON это тоже какое то двоичное число какое я не могу понять.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Макроопределения

Сообщение Мастер Ломастер »

вам станет понятнее, если дать такую подсказку:

a = a & b; полностью эквивалентно записи a &= b;
аналогично
a = a | b; a |= b;
a = a + b; a += b; и т.д.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Эиком - электронные компоненты и радиодетали
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Re: Макроопределения

Сообщение Nixon83 »

Мне запись как раз понятна!
не понятно другое:3
DDRX_BUTTON &= ~(MASK_BUTTONS);
DDRX_BUTTON ето число в двоичном коде значит оно инвертируется на какойто бит или биты MASK_BUTTONS просто не могу понять что мы делаем с портами???
Реклама
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Макроопределения

Сообщение GRAF »

Nixon83 писал(а):void BUT_Init(void)
{
DDRX_BUTTON &= ~(MASK_BUTTONS);
PORT_BUTTON |= MASK_BUTTONS;
}

DDRX_BUTTON это тоже какое то двоичное число какое я не могу понять.
В DDRX_BUTTON адрес регистра направления DDRA. PORT_BUTTON- это PORTA.

DDRX_BUTTON &= ~(MASK_BUTTONS);
Эквивалентно записи DDRA &= 0b10001111; Здесь 4,5, и 6-й выводы устанавливаются как входы, а все остальные на этом порте- выходы. Тильда в ~(MASK_BUTTONS) означает инвертирование разрядов.
Реклама
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Re: Макроопределения

Сообщение Nixon83 »

О этого ответа я ждал спасибо!!!!! :beer:
Значит изначально порт А все единицы ???
А можно это записать зразу без маски
DDRX_BUTTON=0х8f
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Макроопределения

Сообщение GRAF »

Чему изначально PORTA равен -это в даташите смотрите состояние регистров после Reset.
Можно как угодно извращаться, лишь бы понятно было компилятору.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Макроопределения

Сообщение Мастер Ломастер »

Nixon83 писал(а):А можно это записать зразу без маски
DDRX_BUTTON=0х8f
смысл макроопределний как раз в том, чтобы уйти от обезличенных цифр к осмысленным текстовым символам-именам. более того, если число или распределение по пинам кнопок у вас поменяется, то поменяются и соответствующие битовые констатны в программе. так что проще: найти и откорректировать все числа типа 0х8F, или изменить значение единственного макроса? в каком случае вероятность ошибки меньше?
битва с дураками проиграна, победители торжествуют. слава победителям!
Nixon83
Родился
Сообщения: 16
Зарегистрирован: Пн июн 20, 2011 20:19:48

Re: Макроопределения

Сообщение Nixon83 »

Всем спасибо за помощь. Разжували и в рот положили!!!!!
Особая благодарность GRAF и Мастер Ломастер :beer: :beer:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»