This program shows how to make an LED blink on and off. It helps you learn how to control hardware using code.
You want to test if your microcontroller board is working.
You want to learn how to control pins on a microcontroller.
You want to create a simple signal or indicator using an LED.
You want to understand timing and delays in embedded systems.
Syntax
Embedded C
#include <avr/io.h>#include <util/delay.h>int main(void) {
DDRB |= (1 << PB0); // Set pin PB0 as output
while (1) {
PORTB |= (1 << PB0); // Turn LED on
_delay_ms(500); // Wait 500 milliseconds
PORTB &= ~(1 << PB0); // Turn LED off
_delay_ms(500); // Wait 500 milliseconds
}
return0;
}
DDRB sets the direction of pins on port B (output or input).
PORTB controls the voltage level on pins (high or low).
Examples
This sets pin PB0 as an output pin.
Embedded C
DDRB |= (1 << PB0);
This sets pin PB0 to high voltage, turning the LED on.
Embedded C
PORTB |= (1 << PB0);
This clears pin PB0 to low voltage, turning the LED off.
Embedded C
PORTB &= ~(1 << PB0);
This pauses the program for 500 milliseconds (half a second).
Embedded C
_delay_ms(500);
Sample Program
This program makes the LED connected to pin PB0 blink on and off every half second.
Embedded C
#include <avr/io.h>#include <util/delay.h>int main(void) {
DDRB |= (1 << PB0); // Set PB0 as output
while (1) {
PORTB |= (1 << PB0); // LED on
_delay_ms(500); // Wait 500 ms
PORTB &= ~(1 << PB0); // LED off
_delay_ms(500); // Wait 500 ms
}
return0;
}
OutputSuccess
Important Notes
Make sure the LED is connected to the correct pin (PB0) with a resistor to avoid damage.
The _delay_ms() function needs the util/delay.h library.
This code runs forever because of the while(1) loop.
Summary
You learned how to set a pin as output and control it to blink an LED.
Delays help create visible blinking by pausing the program.
This is the first step to controlling hardware with embedded C.
Practice
(1/5)
1. What is the main purpose of the first embedded program that blinks an LED?
easy
A. To read data from a sensor
B. To turn the LED on and off repeatedly
C. To send data over a network
D. To display text on a screen
Solution
Step 1: Understand the program's goal
The program is designed to control an LED by switching it on and off.
Step 2: Identify the blinking action
Blinking means turning the LED on, then off repeatedly to create a visible effect.
Final Answer:
To turn the LED on and off repeatedly -> Option B
Quick Check:
LED blinking = on/off repeatedly [OK]
Hint: Blinking means LED toggles on and off repeatedly [OK]
Common Mistakes:
Confusing blinking with sensor reading
Thinking it sends data over network
Assuming it displays text
2. Which line correctly sets the pin connected to the LED as an output in embedded C?
easy
A. DDRB |= (1 << 5);
B. PORTB |= (1 << 5);
C. PINB |= (1 << 5);
D. DDRB &= ~(1 << 5);
Solution
Step 1: Understand DDR register usage
DDRB controls the data direction of port B pins; setting a bit to 1 makes it output.
Step 2: Analyze each option
DDRB |= (1 << 5); sets bit 5 of DDRB to 1, configuring pin 5 as output. PORTB |= (1 << 5); sets PORTB bit, which controls output level, not direction. PINB |= (1 << 5); sets PINB, which reads input pins. DDRB &= ~(1 << 5); clears bit 5 in DDRB, making it input.
Final Answer:
DDRB |= (1 << 5); -> Option A
Quick Check:
Set DDRB bit = output pin [OK]
Hint: Use DDRx |= (1 << pin) to set output pin [OK]
Common Mistakes:
Using PORT register to set direction
Using PIN register instead of DDR
Clearing DDR bit instead of setting
3. Given the code snippet below, what will be the output behavior of the LED?
A. DDRB should use |= instead of = to avoid clearing other pins
B. PORTB should use &= ~ instead of = to turn off LED
C. _delay_ms function is missing a header file
D. The code has no errors and will blink LED correctly
Solution
Step 1: Check DDRB assignment
Using DDRB = (1 << 5) overwrites all other bits, possibly affecting other pins. Using DDRB |= (1 << 5) sets only bit 5 without changing others.
Step 2: Verify PORTB usage
PORTB = (1 << 5) and PORTB = 0 are valid to turn LED ON and OFF by setting and clearing all bits respectively.
Final Answer:
DDRB should use |= instead of = to avoid clearing other pins -> Option A
Quick Check:
Use |= to set bits without clearing others [OK]
Hint: Use |= to set bits, not = which clears others [OK]
Common Mistakes:
Overwriting DDRB clears other pin directions
Confusing PORTB clearing methods
Assuming no header needed for delay
5. You want to modify the LED blink program to blink twice as fast without changing the delay function. Which change should you make?
hard
A. Change the LED pin to a different port
B. Reduce both delay calls to 250ms
C. Toggle the LED pin twice inside the same delay period
D. Increase the delay calls to 1000ms
Solution
Step 1: Understand blinking speed relation
Blink speed depends on how often the LED state changes. Delays control timing between toggles.
Step 2: Analyze options
Reduce both delay calls to 250ms changes delay times, but question says without changing delay function. Toggle the LED pin twice inside the same delay period toggles LED pin twice in same delay period, effectively doubling blink frequency. Change the LED pin to a different port changes port, unrelated to speed. Increase the delay calls to 1000ms increases delay, slowing blink.
Final Answer:
Toggle the LED pin twice inside the same delay period -> Option C
Quick Check:
More toggles per delay = faster blink [OK]
Hint: Toggle LED more often per delay to speed up blink [OK]
Common Mistakes:
Changing delay values despite instructions
Changing port does not affect blink speed
Increasing delay slows blinking
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.