diff --git a/pycardium/modules/buttons.c b/pycardium/modules/buttons.c
index ab8dabd7d28692f7e586dc64d717c4c3cfb6aa31..ace61e722efdb977d12951a4eb96031dbb9dd005 100644
--- a/pycardium/modules/buttons.c
+++ b/pycardium/modules/buttons.c
@@ -5,13 +5,24 @@
 
 #include "epicardium.h"
 
-static mp_obj_t mp_buttons_read(mp_obj_t mask_in)
+static mp_obj_t mp_buttons_read(size_t n_args, const mp_obj_t *args)
 {
-	uint8_t mask          = mp_obj_get_int(mask_in);
+	uint8_t mask;
+	if (n_args == 1) {
+		mp_int_t mask_int = mp_obj_get_int(args[0]);
+		if (mask_int > 255) {
+			mp_raise_ValueError("mask must be less than 256");
+		}
+		mask = (uint8_t)mask_int;
+	} else {
+		mask = 0xff;
+	}
 	uint8_t button_states = epic_buttons_read(mask);
 	return MP_OBJ_NEW_SMALL_INT(button_states);
 }
-static MP_DEFINE_CONST_FUN_OBJ_1(buttons_read_obj, mp_buttons_read);
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
+	buttons_read_obj, 0, 1, mp_buttons_read
+);
 
 static const mp_rom_map_elem_t buttons_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_buttons) },