📖 Scenario: You are working on a simple embedded system where you need to control an LED and read a button state. To do this, you must configure a microcontroller pin as either input or output.
🎯 Goal: Learn how to configure a microcontroller pin as input or output using C code.
📋 What You'll Learn
Create a variable representing the pin configuration register
Define a constant for the pin number
Write code to set the pin as output
Write code to set the pin as input
Print the pin configuration register value
💡 Why This Matters
🌍 Real World
Microcontrollers use pin configuration registers to control hardware pins for sensors, LEDs, buttons, and communication.
💼 Career
Embedded software engineers must know how to configure pins correctly to interface with hardware devices.
Progress0 / 4 steps
1
Create pin configuration register and pin number
Create an unsigned int variable called PIN_CONFIG and set it to 0. Then create a constant int called PIN_NUMBER and set it to 3.
Embedded C
Hint
Use unsigned int for the register and const int for the pin number.
2
Define output mode mask
Create a constant unsigned int called OUTPUT_MODE and set it to 1 << PIN_NUMBER.
Embedded C
Hint
Use bit shifting to create a mask for the pin.
3
Set pin as output and then as input
Set PIN_CONFIG to output mode by using PIN_CONFIG |= OUTPUT_MODE;. Then set PIN_CONFIG to input mode by using PIN_CONFIG &= ~OUTPUT_MODE;.
Embedded C
Hint
Use bitwise OR to set the bit and bitwise AND with NOT to clear the bit.
4
Print the final pin configuration
Use printf to print the value of PIN_CONFIG as an unsigned integer with the format "%u\n".
Embedded C
Hint
Use printf("%u\n", PIN_CONFIG); inside main().
Practice
(1/5)
1. Which register is used in embedded C to configure a microcontroller pin as input or output?
easy
A. PORT (Data Register)
B. TIMER Register
C. PIN (Input Register)
D. DDR (Data Direction Register)
Solution
Step 1: Understand pin configuration registers
The DDR register controls whether a pin is input or output by setting bits to 0 or 1.
Step 2: Identify the correct register for direction
PORT controls output values, PIN reads input values, TIMER is unrelated to pin direction.
2. Which of the following lines correctly sets pin 3 of PORTB as output in embedded C?
easy
A. DDRB |= (1 << 3);
B. DDRB &= ~(1 << 3);
C. PORTB |= (1 << 3);
D. PINB |= (1 << 3);
Solution
Step 1: Understand setting pin as output
To set a pin as output, set its bit in DDR register to 1 using bitwise OR.
Step 2: Analyze each option
DDRB |= (1 << 3); uses DDRB |= (1 << 3) which sets bit 3 to 1 correctly. DDRB &= ~(1 << 3); clears bit 3 (input). Options C and D affect PORTB and PINB, not direction.
Final Answer:
DDRB |= (1 << 3); -> Option A
Quick Check:
Use |= with DDR to set output [OK]
Hint: Use |= with DDR to set output bit [OK]
Common Mistakes:
Using &= ~ instead of |= to set output
Modifying PORT or PIN instead of DDR
Shifting wrong bit position
3. What is the effect of the following code snippet?
DDRC |= (1 << 2); // Line 1
DDRC &= ~(1 << 2); // Line 2
medium
A. Pin 2 of PORTC is set as output then input
B. Pin 2 of PORTC remains output
C. Pin 2 of PORTC remains input
D. Syntax error in code
Solution
Step 1: Analyze Line 1
DDRC |= (1 << 2) sets bit 2 to 1, configuring pin 2 as output.
Step 2: Analyze Line 2
DDRC &= ~(1 << 2) clears bit 2 to 0, configuring pin 2 as input.
Final Answer:
Pin 2 of PORTC is set as output then input -> Option A
Quick Check:
Set then clear bit changes pin direction [OK]
Hint: |= sets output, &=~ clears to input [OK]
Common Mistakes:
Thinking both lines set output
Ignoring second line effect
Confusing PORTC with DDRC
4. Identify the error in this code that tries to set pin 5 of PORTD as input:
DDRD |= (0 << 5);
medium
A. DDRD cannot be modified directly
B. Bit shift is incorrect, should be (1 << 5)
C. Should use &= ~ instead of |= to set input
D. No error, code is correct
Solution
Step 1: Understand setting pin as input
To set a pin as input, clear its bit in DDR register using &= ~ (bitwise AND with NOT).
Step 2: Analyze the code
DDRD |= (0 << 5) does nothing because (0 << 5) is 0; it does not clear bit 5. Correct way is DDRD &= ~(1 << 5).
Final Answer:
Should use &= ~ instead of |= to set input -> Option C
Quick Check:
Use &= ~ to clear bit for input [OK]
Hint: Use &= ~ to clear bit for input, not |= [OK]
Common Mistakes:
Using |= with 0 does not clear bit
Confusing bitwise OR and AND
Not using bitwise NOT (~) when clearing
5. You want to configure pins 0, 1, and 2 of PORTA as outputs and pins 3 and 4 as inputs without changing other pins. Which code snippet correctly does this?