64 lines
1.5 KiB
C
64 lines
1.5 KiB
C
|
#include "memecoder.h"
|
||
|
#include "ch32v20x.h"
|
||
|
|
||
|
|
||
|
int memecoder_prev_state = 0;
|
||
|
int memecoder_count = 0;
|
||
|
|
||
|
|
||
|
void memecoder_init() {
|
||
|
// Enable GPIOB
|
||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
|
||
|
|
||
|
// Set up GPIO on port B
|
||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
||
|
|
||
|
// PHASE_A - PB12
|
||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
|
||
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
|
||
|
// PHASE_A - PB13
|
||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
|
||
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
|
||
|
// PHASE_A - PB14
|
||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
|
||
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
}
|
||
|
|
||
|
void memecoder_update() {
|
||
|
u8 cur_state =
|
||
|
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) << 0 |
|
||
|
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) << 1 |
|
||
|
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) << 2;
|
||
|
|
||
|
if(cur_state != memecoder_prev_state) {
|
||
|
if( (memecoder_prev_state == 1 && cur_state == 3) ||
|
||
|
(memecoder_prev_state == 3 && cur_state == 2) ||
|
||
|
(memecoder_prev_state == 2 && cur_state == 6) ||
|
||
|
(memecoder_prev_state == 6 && cur_state == 4) ||
|
||
|
(memecoder_prev_state == 4 && cur_state == 5) ||
|
||
|
(memecoder_prev_state == 5 && cur_state == 1)) {
|
||
|
memecoder_count++;
|
||
|
} else {
|
||
|
memecoder_count--;
|
||
|
}
|
||
|
|
||
|
memecoder_prev_state = cur_state;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void memecoder_set(int value) {
|
||
|
memecoder_count = value;
|
||
|
}
|
||
|
|
||
|
int memecoder_get() {
|
||
|
return memecoder_count;
|
||
|
}
|
||
|
|
||
|
void memecoder_zero() {
|
||
|
memecoder_count = 0;
|
||
|
}
|