Test code to read a tyco dpl12 quadrature encoder and vary the level of the 2 inbuilt leds. Fades colour from red, through orange and yellow, to green. Push button momentarily extinguishes the leds.

Dependencies:   mbed

main.cpp

Committer:
James1208
Date:
2011-02-23
Revision:
0:791f5d1a8275

File content as of revision 0:791f5d1a8275:

#include "mbed.h"

DigitalIn sw_in (p5);
InterruptIn enc_a (p6);
InterruptIn enc_b (p7);
PwmOut led1 (p22);
PwmOut led2 (p23);

void enc_a_int_routine (void);
void enc_b_int_routine (void);

bool enc_a_state;
bool enc_b_state;
bool old_enc_a_state;
bool old_enc_b_state;
int val_min = 0;
int val_max = 100;
int val = ((val_max - val_min) / 2) + val_min;
int val_old = val;

int main() {
    sw_in.mode(PullUp);
    enc_a.mode(PullUp);
    enc_b.mode(PullUp);
    enc_a_state = enc_a;
    enc_b_state = enc_b;
    enc_a.rise(&enc_a_int_routine);
    enc_b.rise(&enc_b_int_routine);
    enc_a.fall(&enc_a_int_routine);
    enc_b.fall(&enc_b_int_routine);
    while (1) {
        if (val != val_old) {
            printf("\n\r%i",val);
        } // if (val != val_old)
        val_old = val;
        if (sw_in) {
            led1 = val / 100.0;
            led2 = 1.0 - (val / 100.0);
        } else {
            printf("button\n\r");
            led1 = 0;
            led2 = 0;
        } // if (sw_in)
    } // while(1)
} // end main

void enc_a_int_routine (void) {
    old_enc_a_state = enc_a_state;
    old_enc_b_state = enc_b_state;
    enc_a_state = enc_a;
    enc_b_state = enc_b;
    if (((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) || ((enc_a_state == old_enc_a_state) && (enc_b_state == old_enc_b_state))) {
        val = val;
    } else {
        if (enc_a_state ^ old_enc_b_state) {
            val -= 1;
        } else {
            val += 1;
        } // (enc_a_state ^ old_enc_b_state)
    } // if ((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state))
} // end enc_a_int_routine

void enc_b_int_routine (void) {
    old_enc_a_state = enc_a_state;
    old_enc_b_state = enc_b_state;
    enc_a_state = enc_a;
    enc_b_state = enc_b;
    if (((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) || ((enc_a_state == old_enc_a_state) && (enc_b_state == old_enc_b_state))) {
        val = val;
    } else {
        if (enc_a_state ^ old_enc_b_state) {
            val -= 1;
        } else {
            val += 1;
        } // (enc_a_state ^ old_enc_b_state)
    } // if ((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state))
} // end enc_a_int_routine