buttons_sleep() now first sleeps until the rocker switch is turned off
before then sleeping until it is turned on. This allows the function to
be used for the auto-off case, where the lamp must stay in auto-off when
the rocker switch is still in position B. To wake from auto-off manually,
one simply turns the rocker off then back to either position A or B.
#include <htc.h>
#include "buttons.h"
+#include "timer.h"
void buttons_sleep()
{
+ /* If the rocker is on, sleep until it is placed in the off position */
+ IOCBN4 = 0; IOCBP4 = 1;
+ IOCBN5 = 0; IOCBP5 = 1;
+ while ((buttons_read() & (IN_ROCKERA | IN_ROCKERB))) {
+ IOCIE = 1;
+ SLEEP();
+ IOCIE = 0;
+ timer_mwait(50); /* debounce */
+ }
+
+ /* Now that the rocker is off, sleep until it is turned on */
+ IOCBN4 = 1; IOCBP4 = 0; IOCBF4 = 0;
+ IOCBN5 = 1; IOCBP5 = 0; IOCBF5 = 0;
if ((buttons_read() & (IN_ROCKERA | IN_ROCKERB)) == 0) {
- IOCBF4 = 0;
- IOCBF5 = 0;
IOCIE = 1;
SLEEP();
IOCIE = 0;
*/
#define buttons_init() do { \
nWPUEN = 0; /* enable weak pull-ups on PortB */ \
- IOCBN4 = 1; \
- IOCBN5 = 1; \
TRISB |= IN_MASK; \
ANSELB &= ~IN_MASK; \
} while (0)