#define SER 0 #define RCLK 1 #define SRCLK 2 #define CLK 3 #define DAT 4 #define WAIT_HIGH while(digitalRead(CLK) == LOW); #define WAIT_LOW while(digitalRead(CLK) == HIGH); const PROGMEM uint8_t left[] = { 0x7e, 0x48, 0x3d, 0x6d, 0x4b, 0x67, 0x77, 0x4e, 0x7f, 0x6f }; const PROGMEM uint8_t right[] = { 0xe7, 0x84, 0xd3, 0xd6, 0xb4, 0x76, 0x77, 0xe4, 0xf7, 0xf6 }; void setup() { pinMode(SER, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(SRCLK, OUTPUT); pinMode(CLK, INPUT_PULLUP); pinMode(DAT, INPUT_PULLUP); delay(5); setNumber(0, false, false); } void loop() { static bool l = false, r = true; if(digitalRead(CLK) == LOW) //スタートビット { setNumber(getNumber(), l, r); l = !l; r = !r; } } void setNumber(uint8_t number, bool ldot, bool rdot) { uint8_t num; //左 num = pgm_read_byte(left + number / 10); if(ldot) num |= 0x80; for(int i=0; i<8; i++) { if((num & (1 << i)) == 0) digitalWrite(SER, LOW); else digitalWrite(SER, HIGH); digitalWrite(SRCLK, LOW); digitalWrite(SRCLK, HIGH); } //右 num = pgm_read_byte(right + number % 10); if(rdot) num |= 8; for(int i=0; i<8; i++) { if((num & (1 << i)) == 0) digitalWrite(SER, LOW); else digitalWrite(SER, HIGH); digitalWrite(SRCLK, LOW); digitalWrite(SRCLK, HIGH); } digitalWrite(RCLK, LOW); digitalWrite(RCLK, HIGH); } uint8_t getNumber() { uint8_t number, bi; number = 0; WAIT_HIGH for(int n = 0; n < 8; n++) { WAIT_LOW bi = digitalRead(DAT); number |= bi << n; WAIT_HIGH } return number; }