LPC1114ちょっと進んだ~ロータリーエンコーダ~ | 遥かなるひよこ道
ロータリーエンコーダーの前にポートのプルアップ設定のやり方
リセット値がプルアップとなっているのになぜかGNDに引っ張ってるくさい。
意味不明だわ・・・
もうすこしデータシーツを見る必要がありそうだけど後回しにして(結局読まないパターン)ピンモードの設定でプルアップにすることにした

でーたしーつ
データシーツにはこうあった。
LPC_IOCON->PIO1_4をいじれ
ということで0xD0を代入してやった。まるで囲んだところでそのまんまいれたわけだ。
(本当は初期状態でまるの数字がセットされてるつもりだったんだけどね)

これでプルアップが効いた。やったね。

本題のろーたりえんこうだ
単純に言えばロリータ円光ね

void sample_encoder()

{

    static uint8_t i;                   /* インデックス */

    uint8_t a, b;

    a = (~PIN_BYTE0 & (0x1 << LA)) >> LA;

    b = (~PIN_BYTE0 & (0x1 << LB)) >> LB;


    i = (i << 2) + (a | (b << 1));  /

    i &= 15;

    switch (i) {                     

        case 0x7:                      /* 1→3 */

            CMD = 1;

            break;

        case 0xd:                      /* 3→1 */

            CMD = -1;

            break;

    }

}

ロータリーエンコーダーはつまみを回すと下のような波形が出るダイヤル。
A端子とB端子がある(A相B相)ちなみにZ相があるものもあって値段もぴんきりこ

ろたり
上のわかりやすい絵はダイヤルを1クリック回したときの波形。上波形が時計周り、下波形が反時計周り。
青字で書いてあるとおり時計回りだとレベルB,Aは0,1,3,2,0となる
反時計だとその反対でB,Aは0,2,3,1,0となる
んで、1→3だったら時計、3→1だったら反時計と判断するわけ
ちなみにこの波形の周期はまわし方しだいでだいたい0.5msecから10msecまでとかなりばらつく(秋月の安いやつの話)
タイマー割り込みで見るなら1msecくらいが妥当かなと。

世の中の機器ってロータリーエンコーダよく使ってるんだけどものによってはまわしたのに反応が遅いとかあって、そういうのはたいていメインループで拾ってるから取りこぼしが出てるというパターンが多いです