diff --git a/src/main.rs b/src/main.rs index 89f0042..287b05c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,9 +43,122 @@ fn panic(info: &core::panic::PanicInfo) -> ! { } enum SegmentState { - Num(u8), + Num(u8, bool), Minus, - Dot, + Off, +} + +impl SegmentState { + fn apply(&self, seg: &mut SegmentPins) { + seg.set_off(); + match self { + SegmentState::Num(no, dp) => { + match no { + 0 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + seg.set_d(); + seg.set_e(); + seg.set_f(); + } + 1 => { + seg.set_b(); + seg.set_c(); + } + 2 => { + seg.set_a(); + seg.set_b(); + seg.set_g(); + seg.set_e(); + seg.set_d(); + } + 3 => { + seg.set_a(); + seg.set_b(); + seg.set_g(); + seg.set_c(); + seg.set_d(); + } + 4 => { + seg.set_f(); + seg.set_g(); + seg.set_b(); + seg.set_c(); + } + 5 => { + seg.set_a(); + seg.set_f(); + seg.set_g(); + seg.set_c(); + seg.set_d(); + } + 6 => { + seg.set_a(); + seg.set_f(); + seg.set_g(); + seg.set_c(); + seg.set_d(); + seg.set_e(); + } + 7 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + } + 8 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + seg.set_d(); + seg.set_e(); + seg.set_f(); + seg.set_g(); + } + 9 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + seg.set_d(); + seg.set_f(); + seg.set_g(); + } + _ => panic!("Can't dispaly {}", no), + } + if *dp { + seg.set_dp() + } + } + SegmentState::Minus => seg.set_g(), + SegmentState::Off => (), + } + } +} + +struct DispalyState(pub [SegmentState; 9]); + +impl Default for DispalyState { + fn default() -> DispalyState { + DispalyState([ + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + ]) + } +} + +impl DispalyState { + fn scan(&self, dp: &mut DispalyPins, seg: &mut SegmentPins) { + dp.scan(|no| { + self.0[no].apply(seg); + }) + } } struct SegmentPins { @@ -96,12 +209,29 @@ impl SegmentPins { self.kd_seg_dp.set_high(); } - fn set_a(&mut self, state: bool) { - if state { - self.kd_seg_a.set_low(); - } else { - self.kd_seg_a.set_high(); - } + fn set_a(&mut self) { + self.kd_seg_a.set_low(); + } + fn set_b(&mut self) { + self.kd_seg_b.set_low(); + } + fn set_c(&mut self) { + self.kd_seg_c.set_low(); + } + fn set_d(&mut self) { + self.kd_seg_d.set_low(); + } + fn set_e(&mut self) { + self.kd_seg_e.set_low(); + } + fn set_f(&mut self) { + self.kd_seg_f.set_low(); + } + fn set_g(&mut self) { + self.kd_seg_g.set_low(); + } + fn set_dp(&mut self) { + self.kd_seg_dp.set_low(); } } @@ -134,9 +264,9 @@ impl DispalyPins { fn scan(&mut self, mut segment: impl FnMut(usize) -> ()) { for (no, d) in self.0.iter_mut().enumerate() { - d.set_high(); segment(no); - arduino_hal::delay_ms(100); + d.set_high(); + arduino_hal::delay_ms(1); d.set_low(); } } @@ -167,7 +297,7 @@ fn main() -> ! { pins.d12.into_output(), ); - let mut seg = SegmentPins::new( + let mut sp = SegmentPins::new( pins.d5.into_output(), pins.d8.into_output(), pins.d10.into_output(), @@ -178,11 +308,20 @@ fn main() -> ! { pins.a4.into_output(), ); + let mut display = DispalyState::default(); + display.0[0] = SegmentState::Num(0, true); + display.0[1] = SegmentState::Num(1, false); + display.0[2] = SegmentState::Num(2, false); + display.0[3] = SegmentState::Num(3, false); + display.0[4] = SegmentState::Num(4, false); + display.0[5] = SegmentState::Num(5, false); + display.0[6] = SegmentState::Num(6, false); + display.0[7] = SegmentState::Num(7, false); + display.0[8] = SegmentState::Num(8, false); + loop { - dp.scan(|no| { - seg.set_a(true); - }); - arduino_hal::delay_ms(200); + display.scan(&mut dp, &mut sp); + arduino_hal::delay_ms(10); } // loop {