Skip to main content
LibreTexts - Ukrayinska

4.5: Налаштування, очищення та читання бітів регістра

  • Page ID
    29719
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Побітові операції можуть здатися дещо таємничими для непосвячених, але насправді часто використовуються. Основне використання полягає в налаштуванні, очищенні та тестуванні конкретних бітів у регістрах. Один із прикладів передбачає налаштування двонаправлених портів для режиму введення або виведення за допомогою регістра напрямків даних, як правило, скорочено DDR. Кожен біт DDR представляє певний вихідний контакт. Високий рівень логіки може вказувати на режим виведення, тоді як логічний низький буде вказувати на режим введення. Припускаючи, що DDR є 8-бітовим регістром, якщо ви хочете встановити всі біти, крім 0-го біта, у режим введення, ви можете написати 1:

    DDR = 0x01; // set bit zero to output mode

    Якщо колись пізніше ви хотіли також встановити 1-й і 2-й біти в режим виведення, зберігаючи все інше недоторканим, простий спосіб зробити це просто або біти, які ви хочете:

    DDR = DDR | 0x06;

    Попередня операція може бути виконана за допомогою більш поширеної стенографії:

    DDR |= 0x06;

    Зверніть увагу, що попередній код не впливає на жоден з інших бітів, тому вони залишаються в будь-якому режимі, в якому вони були спочатку. До речі, набір конкретних бітів (таких як 0x06 вище) часто називають бітовим шаблоном або бітовою маскою.

    Щоб побачити, чи встановлений певний біт, просто І замість АБО. Отже, щоб побачити, чи встановлений 1-й біт DDR для режиму виведення, ви можете використовувати щось на кшталт:

    if ( DDR & 0x02 )       // true if set
    

    Очищення бітів вимагає ізавершення з бітовою маскою, яка була доповнена. Іншими словами, всі 1s і 0s були змінені в бітовому шаблоні. Якщо, наприклад, ми хочемо очистити 0-й і 4-й біти, ми спочатку доповнимо бітовий шаблон 0x11, що дає 0xee. Тоді ми І:

    DDR &= 0xee;

    Найчастіше простіше просто використовувати логічний оператор комплементу на вихідному бітовому шаблоні, а потім І це:

    DDR &= (~0x11);

    Якщо ви маєте справу з одним бітом, ви можете використовувати оператор зсуву вліво, так що вам навіть не доведеться турбуватися про з'ясування бітового шаблону в шістнадцятковій. Щоб встановити 3-й біт, а потім очистити 4-й біт DDR, можна використовувати наступне:

    DDR |= (0x01<<3); DDR &= ~(0x01<<4);

    Ці операції настільки поширені, що вони часто викликаються за допомогою вбудованого розширення через #define.


    1. У C підрахунок бітових позицій, як і більшість послідовностей, починається з позиції 0, а не з позиції 1.