diff --git a/src/config_gram.y b/src/config_gram.y
index dd92d340..9df42478 100644
--- a/src/config_gram.y
+++ b/src/config_gram.y
@@ -44,6 +44,7 @@ int yylex(void);
 int yyerror(char * errmsg, ...);
 int yywarning(char * errmsg, ...);
 
+static int clear_pin(int pinfunc);
 static int assign_pin(int pinfunc, TOKEN *v, int invert);
 static int assign_pin_list(int invert);
 static int which_opcode(TOKEN * opcode);
@@ -650,16 +651,16 @@ pin_list:
 ;
 
 prog_parm_pins:
-  K_VCC    TKN_EQUAL {pin_name = PPI_AVR_VCC;  } pin_list |
-  K_BUFF   TKN_EQUAL {pin_name = PPI_AVR_BUFF; } pin_list |
-  K_RESET  TKN_EQUAL {pin_name = PIN_AVR_RESET;} pin_number { free_token($1); } |
-  K_SCK    TKN_EQUAL {pin_name = PIN_AVR_SCK;  } pin_number { free_token($1); } |
-  K_SDO    TKN_EQUAL {pin_name = PIN_AVR_SDO;  } pin_number |
-  K_SDI    TKN_EQUAL {pin_name = PIN_AVR_SDI;  } pin_number |
-  K_ERRLED TKN_EQUAL {pin_name = PIN_LED_ERR;  } pin_number |
-  K_RDYLED TKN_EQUAL {pin_name = PIN_LED_RDY;  } pin_number |
-  K_PGMLED TKN_EQUAL {pin_name = PIN_LED_PGM;  } pin_number |
-  K_VFYLED TKN_EQUAL {pin_name = PIN_LED_VFY;  } pin_number
+  K_VCC    TKN_EQUAL {pin_name = PPI_AVR_VCC; clear_pin(pin_name);  } pin_list |
+  K_BUFF   TKN_EQUAL {pin_name = PPI_AVR_BUFF; clear_pin(pin_name); } pin_list |
+  K_RESET  TKN_EQUAL {pin_name = PIN_AVR_RESET; clear_pin(pin_name);} pin_number { free_token($1); } |
+  K_SCK    TKN_EQUAL {pin_name = PIN_AVR_SCK; clear_pin(pin_name);  } pin_number { free_token($1); } |
+  K_SDO    TKN_EQUAL {pin_name = PIN_AVR_SDO; clear_pin(pin_name);  } pin_number |
+  K_SDI    TKN_EQUAL {pin_name = PIN_AVR_SDI; clear_pin(pin_name);  } pin_number |
+  K_ERRLED TKN_EQUAL {pin_name = PIN_LED_ERR; clear_pin(pin_name);  } pin_number |
+  K_RDYLED TKN_EQUAL {pin_name = PIN_LED_RDY; clear_pin(pin_name);  } pin_number |
+  K_PGMLED TKN_EQUAL {pin_name = PIN_LED_PGM; clear_pin(pin_name);  } pin_number |
+  K_VFYLED TKN_EQUAL {pin_name = PIN_LED_VFY; clear_pin(pin_name);  } pin_number
 ;
 
 opcode :
@@ -1545,6 +1546,17 @@ static char * vtypestr(int type)
 #endif
 
 
+static int clear_pin(int pinfunc) {
+  if(pinfunc < 0 || pinfunc >= N_PINS) {
+    yyerror("pin function must be in the range [0, %d]", N_PINS-1);
+    return -1;
+  }
+
+  pin_clear_all(&(current_prog->pin[pinfunc]));
+
+  return 0;
+}
+
 static int assign_pin(int pinfunc, TOKEN *v, int invert) {
   if(pinfunc < 0 || pinfunc >= N_PINS) {
     yyerror("pin function must be in the range [0, %d]", N_PINS-1);