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

 
 
> Макроопределение, Работа макроопределения
Nixon83
сообщение Oct 19 2011, 07:52
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 23-05-11
Пользователь №: 65 204



Доброго времени суток помогите разобраться в коде, если не трудно объясните пожалуйста в двоичном коде!!!
CODE
//порт, к которому подключены кнопки
#define PORT_BUTTON PORTA
#define PIN_BUTTON PINA
#define DDRX_BUTTON DDRA

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

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


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

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

//_______________________________________
//#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;
}


Сообщение отредактировал IgorKossak - Oct 19 2011, 08:19
Причина редактирования: [codebox], грамматика
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Oct 19 2011, 08:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Nixon83 @ Oct 19 2011, 11:52) *
#define MASK_BUTTONS ((1<<DOWN)|(1<<UP)|(1<<ENTER)) // обясните это выражение в двоичном коде
Не понимаю, что значит "объяснить в двоичном коде"...
Выражение вида (1<<X) в языке Си означает сдвиг единицы влево на Х разрядов. Т.е. получаем результат: единица в разряде Х, а остальные разряды - ноль.
Например, (1<<DOWN). Выше определено, что DOWN то же самое, что и 4. Т.е. это то же сомое, что (1 << 4), или единица сдвинутая влево на четыре разряда (00010000).
Аналогично с остальными частями выражения.
Все три части побитово складываются (побитовое ИЛИ), и получаем результат, где в разрядах 4,5 и 6 единицы, а в остальных - нули (01110000).

Цитата(Nixon83 @ Oct 19 2011, 11:52) *
#define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0) // обясните это выражение в двоичном коде
Выше было объяснено (1 << (bit) ). Затем reg побитово умножается (побитовое И) на число с единицей в бите bit и остальными нулями, и получаем результат: в бите bit тот же бит, что был в reg, а остальные биты - нули. Это число сравнивается с нулём и получаем "истина/ложь". Таким образом BitIsClear(reg, bit) - истина, если бит bit числа reg равен нулю, и ложь в противном случае.


Цитата(Nixon83 @ Oct 19 2011, 11:52) *
void BUT_Init(void) // что мы получаем здесь? Если можно тоже в двоичном коде???
{
DDRX_BUTTON &= ~(MASK_BUTTONS);
PORT_BUTTON |= MASK_BUTTONS;
}
Выражение типа A &= B, эквивалентно А= А & B. Операция & - побитовое И, ~ - побитовая инверсия (т.е. 0 -> 1, 1 -> 0). Первое выражение очищает (сбрасывает в ноль) все биты DDRX_BUTTON для которых в MASK_BUTTONS установлены единицы (т.е. биты 4,5,6), остальные биты DDRX_BUTTON остаются неизменными.
Второе выражение, напротив, в PORT_BUTTON устанавливает биты в единицу, для которых в MASK_BUTTONS установлены единицы (т.е. биты 4,5,6), остальные биты - остаются неизменными

Go to the top of the page
 
+Quote Post



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

 


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


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