![]() |
|
![]() |
#1 | |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 ![]() ![]() ![]() |
![]() Цитата:
Допустим есть unsigned char x = 0x15; как проверить что первая часть равно единице и получить '5' для передачи в DDRD |=(_BV('5')); ? Я могу завести вторую переменную, например так: unsigned char x[2] ={0x01;0x05} и обрабатывать : if (x[0]==1){ DDRD |=(_BV(x[1])); } if (x[0]==0){ DDRD &= ~(_BV(x[1])); } Второй вариант легче в написании, как мне кажется.. а первый я себе пока не представляю. |
|
![]() |
![]() |
![]() |
#2 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#3 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 ![]() ![]() ![]() |
![]()
Первая часть байта в шестнадцатеричном виде 00 - FF.
В десятеричной системе аналогом будут десятки. То есть я хочу сравнивать только первый знак двузначной записи. А что будет если я напишу: char x = 0xF5; //данная переменная содержит байт, получаемый по сети clunet, поэтому значение нужно проверить. if ((x/10)==0xF){ DDRD |=(_BV(x-0xF0)); } на калькуляторе получается то что надо. |
![]() |
![]() |
![]() |
#4 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Сравнивать через маску & if (x/10==(DDRD &=B11110000)) или if (x/10==(DDRD &=0xF0)) или if (x/10==(DDRD &=240)) |
|
![]() |
![]() |
![]() |
#5 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 ![]() ![]() ![]() |
![]()
Никак не могу понять что происходит в части: DDRD &=B11110000
Можно на примере? char x = 0xF5; x&=B11110000; Что будет содержать х? Есть ли на примете книги/статьи где данный аспект рассматривается в подаче "для детей с проблемами развития"? У меня никак не возникает понимание битовых операций типа |=; ~&=; >>; <<. Вроде и читал, вроде и в примерах все понятно, но применять или понять что происходит в коде никак не могу... И сразу еще вопрос: есть у меня массив char data [128]. Предположительно (!) ему присваивается значение либо {0x15,0x72}, либо "1572" (не могу пока чужой код разобрать) пытаюсь вернуть в UART data[0] - приходит 0004. А если возвращаю просто data, то приходит как и требуется 1572 Может моя ошибка очевидна, и найти проблему легко - буду благодарен за помощь. Если нет - то я продолжу эксперименты... UPD: Кажется что-то нашел DEC 1572 = Hex 624. Метод "тыка" конечно, но цифра совпала... Как при присвоении значений убедить компилятор работать исключительно в hex? Последний раз редактировалось Tohin; 25.02.2017 в 18:12. |
![]() |
![]() |
![]() |
#6 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0. |
|
![]() |
![]() |
![]() |
#7 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 ![]() ![]() ![]() |
![]()
Развел мне добрый человек с форума плату для выключателя, за что ему ОГРОМНЫЙ респект и спасибо.
А теперь вопрос: Есть 4 кнопки подключенные к PB2-PB5, как бы мне прочитав весь регистр PINB определить номера (1-4) нажатых кнопок? |
![]() |
![]() |
![]() |
#8 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Конфигурируем порт на вход:
#define portb_In DDRB = 0 Или каждый по отдельности: #define D8_In DDRB &= B11111110 #define D9_In DDRB &= B11111101 #define D10_In DDRB &=B11111011 #define D11_In DDRB &=B11110111 #define D12_In DDRB &=B11101111 #define D13_In DDRB &=B11011111 Читаем весь порт: uint8_t ReadPortB=PINB; Читаем каждый вход по отдельности: #define D8_Read (PINB & B00000001) #define D9_Read ((PINB & B00000010)>>1) #define D10_Read ((PINB & B00000100)>>2) #define D11_Read ((PINB & B00001000)>>3) #define D12_Read ((PINB & B00010000)>>4) #define D13_Read ((PINB & B00100000)>>5) |
![]() |
![]() |
![]() |
#9 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 ![]() ![]() ![]() |
![]()
Т.к планирую повесить прерывание PCINT.
ставлю бит PCIE0 в регистре PCICR Ставлю в PCMSK0 = 00111100 // для PB2-5 Дальше в обработчике прерывания записываю состояние регистра в глобальную переменную: volatile uint8_t ReadPortB=PINB; Как дальше определить кнопку? Кучей if'ов или циклом со сдвигом по биту? |
![]() |
![]() |
![]() |
#10 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
можно Switch case
|
![]() |
![]() |
![]() |
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|