Pull Down Resistors

Firstly, forget the 100 Ω resistor for now. It's not required for the working of the button, it's just there as a protection in case you would make a programming error.

  • If the button is pressed P2 will be directly connected to +5 V, so that will be seen as a high level, being "1".
  • If the button is released the +5 V doesn't count anymore, there's just the 10 kΩ between the port and ground.

A microcontroller's I/O pin is high impedance when used as input, meaning there flows only a small leakage current, usually much less than the 1 µA, which will be the maximum according to the datasheet. OK, lets' say it's 1 µA. Then according to Ohm's Law this will cause a voltage drop of 1 µA \$\times\$ 10 kΩ = 10 mV across the resistor. So the input will be at 0.01 V. That's a low level, or a "0". A typical 5 V microcontroller will see any level lower than 1.5 V as low.


Now the 100 Ω resistor. If you would accidentally made the pin output and set it low then pressing the button will cause a short-circuit: the microcontroller sets 0 V on the pin, and the switch +5 V on the same pin. The microcontroller doesn't like that, and the IC may be damaged. In those cases the 100 Ω resistor should limit the current to 50 mA. (Which still is a bit too much, a 1 kΩ resistor would be better.)

Since there won't flow current into an input pin (apart from the low leakage) there will hardly be any voltage drop across the resistor.

The 10 kΩ is a typical value for a pull-up or pull-down. A lower value will give you even a lower voltage drop, but 10 mV or 1 mV doesn't make much difference. But there's something else: if the button is pressed there's 5 V across the resistor, so there will flow a current of 5 V/ 10 kΩ = 500 µA. That's low enough not to cause any problems, and you won't be keeping the button pressed for a long time anyway. But you may replace the button with a switch, which may be closed for a long time. Then if you would have chosen a 1 kΩ pull-down you would have 5 mA through the resistor as long as the switch is closed, and that's a bit of a waste. 10 kΩ is a good value.


Note that you can turn this upside down to get a pull-up resistor, and switch to ground when the button is pressed.

enter image description here

This will invert your logic: pressing the button will give you a "0" instead of a "1", but the working is the same: pressing the button will make the input 0 V, if you release the button the resistor will connect the input to the +5 V level (with a negligible voltage drop).

This is the way it's usually done, and microcontroller manufacturers take this into account: most microcontrollers have internal pull-up resistors, which you can activate or deactivate in software. If you use the internal pull-up you only need to connect the button to ground, that's all. (Some microcontrollers also have configurable pull-downs, but these are much less common.)


Note that the switch is not a fancy device that takes power and creates some output signal -- instead, think of it as a wire that you're just adding or removing from the circuit by pushing the button.

If the switch is disconnected (not pressed), the only possible path for current is from P2 through both resistors to ground. Thus, the microcontroller will read a LOW.

If the switch is connected (pressed):

  • Current travels from the power supply through the switch

  • Some current travels through the 100 ohm resistor to P2. The microcontroller will read HIGH.

  • A small amount of current will flow through the 10 Kohm resistor to ground. This is basically wasted power.

Note that the 100 ohm resistor is just there to limit the maximum current going into P2. It's normally not included on a circuit like this, because the microcontroller's P2 input is already high-impedance and will not sink much current. However, including the 100 ohm resistor is useful in case your software has a bug or a logic error that causes it to try to use P2 as an output instead. In that case, if the microcontroller is trying to drive P2 low but the switch is shorted and connecting it to high, you'd possibly damage the microcontroller pin. To be safe, the 100 ohm resistor would limit the maximum current in that case.


When you press the button you place a logic high level (+5 V) on the input. But if you omit the resistor and the button is released, then the input pin would just be floating, which in HCMOS means that the level is undefined. That's something you don't want, so you pull the input down to ground with the resistor. The resistor is required because otherwise pushing the button would cause a short-circuit.

The input is high impedance, meaning that there will hardly flow any current through it. Zero current through the resistor means zero voltage across it (Ohm's Law), so the 0 V on one side will also be 0 V (or very near) on the input pin.

This is one way to connect a button, but you can also swap resistor and button, so that the resistor goes to +5 V and the button to ground. The logic is then inversed: pushing the button will give a low level on the input pin. This is often done, though, because most microcontrollers have pull-up resistors built-in, so that you only need the button, the external resistor can then be omitted. Note that you may have to enable the internal pull-up.



See also this answer.