Skip to main content
Back to module
Power, Electronics & Signals · Electronics

Digital logic and microcontrollers

Reading37mLesson 3 of 3 in this module

What you'll learn

  • Explain gates, registers and GPIO
  • Build a full adder from AND, OR and XOR gates
  • Set, clear and read single register bits with bit masks
  • Protect GPIO pins with pull-ups, current limits and level shifting

Explain logic gates, adders, flip-flops and registers, and set, clear and read GPIO bits with bit masks.

Why it matters

Almost every electrical product now has a microcontroller in it: chargers, inverters, motor drives, protective relays, meters, sensors. Electrical engineers write firmware, read logic analyser traces and design the interface between digital pins and real loads. Underneath all of it are a few gates and the idea of a register: a row of bits, each one wired to something.

Logic levels and gates

Digital circuits treat a voltage as 1 (high) or 0 (low). A 3.3 V CMOS input typically reads anything above about 2 V as 1 and below about 0.8 V as 0; the band in between is undefined. Mixing 5 V and 3.3 V parts needs care: a 5 V output can damage a 3.3 V input that isn't "5 V tolerant", so you use a level shifter or a divider.

The basic gates and their truth tables:

A B | AND OR XOR NAND
0 0 |  0   0   0    1
0 1 |  0   1   1    1
1 0 |  0   1   1    1
1 1 |  1   1   0    0
NOT: 0 -> 1, 1 -> 0

NAND (and NOR) is universal: any logic function can be built from NAND gates alone. Inside a chip, each gate is a few CMOS transistors used as the switches from the previous lessons.

Combinational logic: adding numbers

A half adder adds two bits: sum = A XOR B, carry = A AND B. A full adder also takes a carry in:

sum  = A XOR B XOR Cin
Cout = (A AND B) OR (Cin AND (A XOR B))

Chain four full adders, passing each carry to the next, and you have a 4-bit ripple-carry adder. 0101 (5) + 0011 (3) gives 1000 (8). The output depends only on the present inputs, which is what "combinational" means.

Sequential logic: memory

A flip-flop stores one bit. A D flip-flop copies its D input to its Q output on each rising clock edge and holds it until the next edge. A register is a row of flip-flops sharing a clock, for example 8 or 32 bits. Counters, shift registers and the state machines in every controller are built from registers plus combinational logic. The clock sets the pace: the logic between registers must settle within one clock period.

Inside a microcontroller

A microcontroller (MCU) puts a CPU, flash memory for the program, RAM, and peripherals on one chip: GPIO, timers, PWM, ADCs, UART, SPI and I2C. Peripherals are controlled through memory-mapped registers: writing a number to a particular address changes the hardware.

GPIO (general-purpose input/output) pins are usually configured with registers like:

  • a direction register (bit = 1 for output),
  • an output register (bit = 1 drives the pin high),
  • an input register (read the pin's level).

You change one pin without disturbing the others with bit masks:

REG |=  (1 << 5);        // set bit 5   (pin 5 high)
REG &= ~(1 << 5);        // clear bit 5 (pin 5 low)
int on = (REG >> 5) & 1; // read bit 5
REG ^=  (1 << 5);        // toggle bit 5

Arduino's digitalWrite(pin, HIGH) does exactly this behind the scenes.

Worked example. A port register holds 0b00010010 (pins 1 and 4 high). Setting bit 0 gives 0b00010011 (19); then clearing bit 4 gives 0b00000011 (3). Reading bit 1 gives 1.

Pins meet the real world

  • Current limits: a GPIO pin can source or sink only a few to about 20 mA, and the whole port has a total limit. Use a transistor (previous lesson) for anything bigger.
  • Pull-up and pull-down resistors keep an input from floating when a button is open. Many MCUs have internal pull-ups you enable in a register.
  • Debouncing: mechanical switches bounce for a few milliseconds, so firmware waits or samples repeatedly before accepting a change.
  • Interrupts let the CPU react to an edge immediately instead of polling.

Simulate it

Wokwi (https://wokwi.com) simulates Arduino and other boards in the browser, with LEDs, buttons and a logic analyser. Logic simulators such as Logisim Evolution let you build adders from gates. No hardware is needed.

Common mistakes

  • Writing the whole register (REG = 1 << 5) and accidentally turning every other pin off.
  • Forgetting the NOT when clearing: REG &= (1 << 5) clears everything except bit 5.
  • Floating inputs with no pull-up, giving random readings.
  • Driving loads straight from a pin beyond its current rating.
  • Connecting 5 V signals to 3.3 V-only inputs.

Recap

  • Gates implement Boolean logic; NAND is universal; full adders chain into multi-bit adders.
  • Flip-flops and registers store state on clock edges.
  • MCUs control peripherals through registers; use |=, &= ~ and shifts to change single bits.

Try it

Open the Do tab to build a full adder, a 4-bit adder and GPIO bit helpers in JavaScript.

Key terms (6)

full adder
A logic circuit that adds two bits and a carry in, giving a sum bit and a carry out.
flip-flop
A circuit that stores one bit; a D flip-flop copies D to Q on each rising clock edge.
register
A row of flip-flops sharing a clock, such as 8 or 32 bits, often wired to hardware in an MCU.
bit masks
Numbers like 1 << n combined with |, & and ~ to change or read one bit without disturbing the others.
Pull-up
A resistor that holds an input high when nothing drives it, so it does not float.
Debouncing
Waiting or sampling repeatedly so the few milliseconds of switch bounce are not read as several presses.

Recap

  • Gates implement Boolean logic, and NAND is universal.
  • Full adders chain, carry to carry, into multi-bit ripple-carry adders.
  • Flip-flops and registers store state on clock edges.
  • MCUs control peripherals through memory-mapped registers; change single bits with |=, &= ~ and shifts.
  • Respect pin current limits, use pull-ups and never feed 5 V into 3.3 V-only inputs.
Also in this lesson: