el_supremo:
Just a guess but I think that when you write the two bits separately, select_freq_reg sets/clears the FSEL bit. Then calling set_waveform sets/clears the MODE bit but it will implicitly clear the FSEL bit also so that you would always get frequency zero with either a sine or triangle wave. To do this correctly, you should probably have a function to set the control register.
Thank you again for your reply and help.
Last night when I posted the second question, I had been at it all day and was bleary-eyed.
This morning the solution popped into my mind and it's so obvious I could kick myself.
First of all, you mentioned my use of uint8_t. That is correct. Those are actually used as boolean (0 or 1).
Anyway, I saw clearly that if I set one thing (like for example selecting frequency register 1), the bit pattern ONLY selected frequency register 1 and wiped out anything previous (such as a waveform select bit).
The solution is simple: I have a shadow "register" (a single uint16_t variable) that saves the state of the control register. So, to select frequency register 0 or 1, I AND off or OR on the appropriate bit in the "shadow" and then write it to the DDS.
So, anything PREVIOUSLY set gets re-written to the DDS and selections now "stick".
Here's a piece of the code to explain what I'm doing (although I know you already "get it") 
void AD9833::reset (void)
{
// assert reset & 28 bit mode
_ctrl_reg = (B28 | RESET);
_dds_write (_ctrl_reg);
// de-assert reset, leave 28 bit mode
_ctrl_reg = B28;
_dds_write (_ctrl_reg);
}
void AD9833::set_fclock (uint8_t on)
{
// set sleep1 bit on or off (stops or starts FCLK)
on ? _ctrl_reg &= ~SLEEP1 : _ctrl_reg |= SLEEP1;
_dds_write (_ctrl_reg);
}
void AD9833::set_waveform (uint8_t mode)
{
// set sine or triangle waveform
mode ? _ctrl_reg |= MODE : _ctrl_reg &= ~MODE;
_dds_write (_ctrl_reg);
}
This is even useful in places that I didn't suspect. For example, setting the value of a phase register seems to be considered by the chip as a single 16 bit write (12 actually) whereas setting a frequency register is a full 32 bit (28 actually) write.
Because writing to a phase register is only a single 16 bit write, it clears the "B28" (28 bits dual write select) bit, causing future 32 bit writes (such as a frequency register write) to fail.
By doing a....
_dds_write (_ctrl_reg);
...immediately after setting a phase register, it re-establishes the proper setting of all control bits. I even do it after a 32 bit frequency register update "just for good luck" even though it's not necessary.
This insures that the control register is always "current" (i.e. up to date).
It took me quite a while to finally figure out and get the feel for the AD983x chips. Their data sheets leave a lot to be desired. They seem to be written by someone who knows the chip inside and out and as a result they leave out little (but important) bits of information.
Anyway, thanks again for all your help! I'd still be beating my head against the wall without your input.