Every now and then I need to turn pins on or off quickly (like in an interrupt service routine) and have to reach for my "pins mapping" sheet to see exactly what port I required, and what bit.
With a small Lua script I generated a file which has all the input/output read/write mappings you should need. This is for the Atmega328 (eg. Uno, Duemilanove).
To use, just skim down for the pinMode/digitalRead/digitalWrite you want, and copy and paste that line.
Atmega328:
// --- PIN MODE: OUTPUT ---
DDRD |= _BV (0); // pinMode (0, OUTPUT);
DDRD |= _BV (1); // pinMode (1, OUTPUT);
DDRD |= _BV (2); // pinMode (2, OUTPUT);
DDRD |= _BV (3); // pinMode (3, OUTPUT);
DDRD |= _BV (4); // pinMode (4, OUTPUT);
DDRD |= _BV (5); // pinMode (5, OUTPUT);
DDRD |= _BV (6); // pinMode (6, OUTPUT);
DDRD |= _BV (7); // pinMode (7, OUTPUT);
DDRB |= _BV (0); // pinMode (8, OUTPUT);
DDRB |= _BV (1); // pinMode (9, OUTPUT);
DDRB |= _BV (2); // pinMode (10, OUTPUT);
DDRB |= _BV (3); // pinMode (11, OUTPUT);
DDRB |= _BV (4); // pinMode (12, OUTPUT);
DDRB |= _BV (5); // pinMode (13, OUTPUT);
DDRC |= _BV (0); // pinMode (A0, OUTPUT);
DDRC |= _BV (1); // pinMode (A1, OUTPUT);
DDRC |= _BV (2); // pinMode (A2, OUTPUT);
DDRC |= _BV (3); // pinMode (A3, OUTPUT);
DDRC |= _BV (4); // pinMode (A4, OUTPUT);
DDRC |= _BV (5); // pinMode (A5, OUTPUT);
// --- PIN MODE: INPUT ---
DDRD &= ~_BV (0); // pinMode (0, INPUT);
DDRD &= ~_BV (1); // pinMode (1, INPUT);
DDRD &= ~_BV (2); // pinMode (2, INPUT);
DDRD &= ~_BV (3); // pinMode (3, INPUT);
DDRD &= ~_BV (4); // pinMode (4, INPUT);
DDRD &= ~_BV (5); // pinMode (5, INPUT);
DDRD &= ~_BV (6); // pinMode (6, INPUT);
DDRD &= ~_BV (7); // pinMode (7, INPUT);
DDRB &= ~_BV (0); // pinMode (8, INPUT);
DDRB &= ~_BV (1); // pinMode (9, INPUT);
DDRB &= ~_BV (2); // pinMode (10, INPUT);
DDRB &= ~_BV (3); // pinMode (11, INPUT);
DDRB &= ~_BV (4); // pinMode (12, INPUT);
DDRB &= ~_BV (5); // pinMode (13, INPUT);
DDRC &= ~_BV (0); // pinMode (A0, INPUT);
DDRC &= ~_BV (1); // pinMode (A1, INPUT);
DDRC &= ~_BV (2); // pinMode (A2, INPUT);
DDRC &= ~_BV (3); // pinMode (A3, INPUT);
DDRC &= ~_BV (4); // pinMode (A4, INPUT);
DDRC &= ~_BV (5); // pinMode (A5, INPUT);
// --- DIGITAL WRITE: HIGH ---
PORTD |= _BV (0); // digitalWrite (0, HIGH);
PORTD |= _BV (1); // digitalWrite (1, HIGH);
PORTD |= _BV (2); // digitalWrite (2, HIGH);
PORTD |= _BV (3); // digitalWrite (3, HIGH);
PORTD |= _BV (4); // digitalWrite (4, HIGH);
PORTD |= _BV (5); // digitalWrite (5, HIGH);
PORTD |= _BV (6); // digitalWrite (6, HIGH);
PORTD |= _BV (7); // digitalWrite (7, HIGH);
PORTB |= _BV (0); // digitalWrite (8, HIGH);
PORTB |= _BV (1); // digitalWrite (9, HIGH);
PORTB |= _BV (2); // digitalWrite (10, HIGH);
PORTB |= _BV (3); // digitalWrite (11, HIGH);
PORTB |= _BV (4); // digitalWrite (12, HIGH);
PORTB |= _BV (5); // digitalWrite (13, HIGH);
PORTC |= _BV (0); // digitalWrite (A0, HIGH);
PORTC |= _BV (1); // digitalWrite (A1, HIGH);
PORTC |= _BV (2); // digitalWrite (A2, HIGH);
PORTC |= _BV (3); // digitalWrite (A3, HIGH);
PORTC |= _BV (4); // digitalWrite (A4, HIGH);
PORTC |= _BV (5); // digitalWrite (A5, HIGH);
// --- DIGITAL WRITE: LOW ---
PORTD &= ~_BV (0); // digitalWrite (0, LOW);
PORTD &= ~_BV (1); // digitalWrite (1, LOW);
PORTD &= ~_BV (2); // digitalWrite (2, LOW);
PORTD &= ~_BV (3); // digitalWrite (3, LOW);
PORTD &= ~_BV (4); // digitalWrite (4, LOW);
PORTD &= ~_BV (5); // digitalWrite (5, LOW);
PORTD &= ~_BV (6); // digitalWrite (6, LOW);
PORTD &= ~_BV (7); // digitalWrite (7, LOW);
PORTB &= ~_BV (0); // digitalWrite (8, LOW);
PORTB &= ~_BV (1); // digitalWrite (9, LOW);
PORTB &= ~_BV (2); // digitalWrite (10, LOW);
PORTB &= ~_BV (3); // digitalWrite (11, LOW);
PORTB &= ~_BV (4); // digitalWrite (12, LOW);
PORTB &= ~_BV (5); // digitalWrite (13, LOW);
PORTC &= ~_BV (0); // digitalWrite (A0, LOW);
PORTC &= ~_BV (1); // digitalWrite (A1, LOW);
PORTC &= ~_BV (2); // digitalWrite (A2, LOW);
PORTC &= ~_BV (3); // digitalWrite (A3, LOW);
PORTC &= ~_BV (4); // digitalWrite (A4, LOW);
PORTC &= ~_BV (5); // digitalWrite (A5, LOW);
// --- DIGITAL READ ---
x = (PIND & _BV (0)) == 0; // digitalRead (0);
x = (PIND & _BV (1)) == 0; // digitalRead (1);
x = (PIND & _BV (2)) == 0; // digitalRead (2);
x = (PIND & _BV (3)) == 0; // digitalRead (3);
x = (PIND & _BV (4)) == 0; // digitalRead (4);
x = (PIND & _BV (5)) == 0; // digitalRead (5);
x = (PIND & _BV (6)) == 0; // digitalRead (6);
x = (PIND & _BV (7)) == 0; // digitalRead (7);
x = (PINB & _BV (0)) == 0; // digitalRead (8);
x = (PINB & _BV (1)) == 0; // digitalRead (9);
x = (PINB & _BV (2)) == 0; // digitalRead (10);
x = (PINB & _BV (3)) == 0; // digitalRead (11);
x = (PINB & _BV (4)) == 0; // digitalRead (12);
x = (PINB & _BV (5)) == 0; // digitalRead (13);
x = (PINC & _BV (0)) == 0; // digitalRead (A0);
x = (PINC & _BV (1)) == 0; // digitalRead (A1);
x = (PINC & _BV (2)) == 0; // digitalRead (A2);
x = (PINC & _BV (3)) == 0; // digitalRead (A3);
x = (PINC & _BV (4)) == 0; // digitalRead (A4);
x = (PINC & _BV (5)) == 0; // digitalRead (A5);
Lua code to generate this:
pins = {
{ name = "0", port = "D", bit = 0 },
{ name = "1", port = "D", bit = 1 },
{ name = "2", port = "D", bit = 2 },
{ name = "3", port = "D", bit = 3 },
{ name = "4", port = "D", bit = 4 },
{ name = "5", port = "D", bit = 5 },
{ name = "6", port = "D", bit = 6 },
{ name = "7", port = "D", bit = 7 },
{ name = "8", port = "B", bit = 0 },
{ name = "9", port = "B", bit = 1 },
{ name = "10", port = "B", bit = 2 },
{ name = "11", port = "B", bit = 3 },
{ name = "12", port = "B", bit = 4 },
{ name = "13", port = "B", bit = 5 },
{ name = "A0", port = "C", bit = 0 },
{ name = "A1", port = "C", bit = 1 },
{ name = "A2", port = "C", bit = 2 },
{ name = "A3", port = "C", bit = 3 },
{ name = "A4", port = "C", bit = 4 },
{ name = "A5", port = "C", bit = 5 },
} -- end of pins
print ""
print ("// --- PIN MODE: OUTPUT --- ")
print ""
for k, pin in ipairs (pins) do
print (" DDR" .. pin.port .. " |= _BV (" .. pin.bit .. "); // pinMode (" .. pin.name .. ", OUTPUT);")
end -- for
print ""
print ("// --- PIN MODE: INPUT --- ")
print ""
for k, pin in ipairs (pins) do
print (" DDR" .. pin.port .. " &= ~_BV (" .. pin.bit .. "); // pinMode (" .. pin.name .. ", INPUT);")
end -- for
print ""
print ("// --- DIGITAL WRITE: HIGH --- ")
print ""
for k, pin in ipairs (pins) do
print (" PORT" .. pin.port .. " |= _BV (" .. pin.bit .. "); // digitalWrite (" .. pin.name .. ", HIGH);")
end -- for
print ""
print ("// --- DIGITAL WRITE: LOW --- ")
print ""
for k, pin in ipairs (pins) do
print (" PORT" .. pin.port .. " &= ~_BV (" .. pin.bit .. "); // digitalWrite (" .. pin.name .. ", LOW);")
end -- for
print ""
print ("// --- DIGITAL READ --- ")
print ""
for k, pin in ipairs (pins) do
print (" x = (PIN" .. pin.port .. " & _BV (" .. pin.bit .. ")) == 0; // digitalRead (" .. pin.name .. ");")
end -- for