I know there have been many projects using a micro as the controller, but for LED's the current limit loop should be fast to prevent voltage overshoot. I'm probably in the minority but for a 'testing' power supply that may be used for almost anything (as in, not hardwired to power a particular circuit) I wouldn't use a micro for it.
But with that said, if your micro is just handling the user input, the display and outputting a value to the DAC, it'll have more than enough room, and execution time for many extra features should you wish to add them. And it's enough for *some* maths (16x-16 bit multiplication, or division) that will of course be done just in software but it'll still take less than a millisecond at 4MHz.
I can see why you were a bit unhappy with the various switch-case statements. They can start to look clumbsy and out of hand, and sometimes is just nicer to merge things into what appears to be a more efficient loop. But depends on the restrictions you impose, with little int he way of memory/execution time restrictions, there is still 'readability'. I often go back to old projects I've done for PIC's and AVR's and have to spend far too long re-familiarizing myself with the algorithm - not because its bad, but because it was highly optimised and not obvious what its actually doing. Sure its nice to seem clever to yourself, but it becomes a real pain if you, or someone else has to modify it.