Toggling between 3 frequencies
Since you tagged your question with verilog, I'll assume that you're really looking for an HDL solution targeted at an FPGA. In this case, using a single programmable divider makes a whole lot more sense than having multiple dividers followed by a multiplexer. Something like this:

module clockdiv (
  input         master_clock,
  input         reset,
  input   [1:0] select,
  output reg    clock_out
)

  reg    [15:0] divider;

  always @* begin
    case (select)
      2'b00: divider &lt;= X; // defined elsewhere
      2'b01: divider &lt;= Y; //
      2'b10: divider &lt;= Z; //
      2'b11: divider &lt;= W; // ... etc.
    endcase
  end

  reg    [15:0] counter;

  always @(posedge master_clock) begin
    if (reset) begin
      counter &lt;= 0;
      clock_out &lt;= 0;
    end else begin
      if (counter &gt;= divider) begin
        counter &lt;= 0;
        clock_out &lt;= !clock_out;
      end else begin
        counter &lt;= counter + 1;
      end
    end
  end
endmodule


Define X, Y, Z, etc. to give you the clock division ratios you're looking for, keeping in mind that the output clock is further divided by 2 to produce a square wave.

This solution will never produce a bad clock pulse, even if the select input changes in the middle of an output cycle.



Addressing your secondary problem of controlling the select lines, the key here is to bring the two debounced pushbutton signals into the same clock domain as the rest of the logic. Something like this:

module up_down (
  input            master_clock,
  input            reset,
  input            button_up,
  input            button_down,
  output reg [1:0] count
)

  // Synchronizers and edge detectors for asynchronous inputs
  reg              button_up_a, button_up_b, button_up_c;
  reg              button_down_a, button_down_b, button_down_c;

  always @(posedge master_clock) begin
    button_up_a &lt;= button_up;
    button_up_b &lt;= button_up_a;
    button_up_c &lt;= button_up_b;

    button_down_a &lt;= button_down;
    button_down_b &lt;= button_down_a;
    button_down_c &lt;= button_down_b;

    if (reset) begin
      count &lt;= 0;
    end else begin
      if (button_up_b &amp;&amp; !button_up_c) begin
        //rising edge on button_up detected
        count &lt;= count + 1;
      end else if (button_down_b &amp;&amp; !button_down_c) begin
        //rising edge on button_down detected
        count &lt;= count - 1;
      end
    end
  end
endmodule


Connect the count output of this module to the select input of the previous module.