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

 
 
> Макроопределение, Работа макроопределения
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
Ответов
Genius1
сообщение Oct 19 2011, 08:48
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 14-05-08
Пользователь №: 37 515



1) #define MASK_BUTTONS ((1<<DOWN)|(1<<UP)|(1<<ENTER)) // обясните это выражение в двоичном коде
(1<<DOWN) - сдвиг 1 влево на 4. Т.е. из 0b00000001 получаем 0b00010000
(1<<UP) - сдвиг 1 влево на 5. Т.е. из 0b00000001 получаем 0b00100000
(1<<ENTER) - сдвиг 1 влево на 6. Т.е. из 0b00000001 получаем 0b01000000

((1<<DOWN)|(1<<UP)|(1<<ENTER)) - побитная операция или полученных выше результатов.
Т.е. 0b00010000 ИЛИ 0b00100000 ИЛИ 0b01000000 = 0b01110000
Таким образом, вместо MASK_BUTTONS в программе будет подставляться число 0b01110000

2) #define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0)
Это проверка на равенство нулю выражения reg & (1<<(bit)). Величины reg и bit задаются в программе. Сначала мы сдвигаем 1 влево bit раз и с полученным результатом производим операцию побитовое И с числом reg. Для примера возьмем reg = 0b01000000, bit = 5
Сдвигаем 1 влево на 5(bit) = 0b00100000
Побитовове И = 0b01000000 & 0b00100000 = 0. В этом случае общий результат выражения ((reg & (1<<(bit))) == 0) будет ИСТИНА(=1)


Go to the top of the page
 
+Quote Post



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

 


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


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