Deleted

Deleted

You seem to have a very long interval (500 msecs) between reads of your button - why is that?

How is your button wired? If it pulls the pin HIGH when pressed you should have an external pulldown resistor. However it is more usual to use pinMode (pin, INPUT_PULLUP) and wire the button so it registers LOW when pressed. Without a pullxxx resistor the pin will float and give unstable values when the button is not pressed.

The demo Several Things at a Time illustrates the use of millis() to manage timing without blocking. It may help with understanding the technique.

Have a look at Using millis() for timing. A beginners guide if you need more explanation.

...R

your code only runs while the button is pressed. I believe what you are looking for is to turn on and off your processing with each button press.

void circuitCheck() {
    static byte swInpLst = HIGH;
           byte swInp    = digitalRead (pinBut);
    if (swInpLst != swInp) {
        swInpLst = swInp;
        if (LOW == swInp)
            buttonState = ! buttonState;
        delay (10);     // debounce
    }
}

however, i don't think simply using button state to execute you're sequence functions does what you want.

you use millis() to time each dot or dash, but there's nothing to step thru each morse code word in your T(), R() and B() functions. in B(), for example, you call dash(), dot(), dot() and dot() without waiting for each to be transmitted before sending the next.

when sending each codeword, millis() needs to be used for the duration of a dot, dash, the intra-character space and inter-character space and only after each dot/dash advance to the next in the codeword (dot-dot-dash).

you need to track the state of each character (dot) and the entire codeword