From 9a0856634e9ddb15cc9196975870b9e98f921bfc Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 20:31:23 +0100 Subject: [PATCH] struct to hold display pins --- src/main.rs | 199 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 128 insertions(+), 71 deletions(-) diff --git a/src/main.rs b/src/main.rs index ea150a4..89f0042 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,13 @@ #![no_std] #![no_main] -use arduino_hal::prelude::*; -use embedded_hal::digital::OutputPin; +use arduino_hal::{ + hal::port::{ + PB0, PB1, PB2, PB3, PB4, PC0, PC1, PC2, PC3, PC4, PC5, PD2, PD3, PD4, PD5, PD6, PD7, + }, + port::{mode::Output, Pin}, + prelude::*, +}; // NOTE: 115200 @ 16MHz is 3.5% off, try 9600 or 1M if it causes issues (https://wormfood.net/avrbaudcalc.php) const SERIAL_BAUD: u32 = 115200; @@ -43,89 +48,141 @@ enum SegmentState { Dot, } +struct SegmentPins { + kd_seg_a: Pin, + kd_seg_b: Pin, + kd_seg_c: Pin, + kd_seg_d: Pin, + kd_seg_e: Pin, + kd_seg_f: Pin, + kd_seg_g: Pin, + kd_seg_dp: Pin, +} + +impl SegmentPins { + fn new( + kd_seg_a: Pin, + kd_seg_b: Pin, + kd_seg_c: Pin, + kd_seg_d: Pin, + kd_seg_e: Pin, + kd_seg_f: Pin, + kd_seg_g: Pin, + kd_seg_dp: Pin, + ) -> SegmentPins { + let mut out = SegmentPins { + kd_seg_a, + kd_seg_b, + kd_seg_c, + kd_seg_d, + kd_seg_e, + kd_seg_f, + kd_seg_g, + kd_seg_dp, + }; + + out.set_off(); + out + } + + fn set_off(&mut self) { + self.kd_seg_a.set_high(); + self.kd_seg_b.set_high(); + self.kd_seg_c.set_high(); + self.kd_seg_d.set_high(); + self.kd_seg_e.set_high(); + self.kd_seg_f.set_high(); + self.kd_seg_g.set_high(); + 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(); + } + } +} + +struct DispalyPins([Pin; 9]); + +impl DispalyPins { + fn new( + kd_d1_1c: Pin, + kd_d2_5div: Pin, + kd_d3_6mul: Pin, + kd_d4_7up: Pin, + kd_d5_8e: Pin, + kd_d6_90: Pin, + kd_d7_2down: Pin, + kd_d8_3plus: Pin, + kd_d9_4min: Pin, + ) -> DispalyPins { + DispalyPins([ + kd_d1_1c.downgrade(), + kd_d2_5div.downgrade(), + kd_d3_6mul.downgrade(), + kd_d4_7up.downgrade(), + kd_d5_8e.downgrade(), + kd_d6_90.downgrade(), + kd_d7_2down.downgrade(), + kd_d8_3plus.downgrade(), + kd_d9_4min.downgrade(), + ]) + } + + 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_low(); + } + } +} + #[arduino_hal::entry] fn main() -> ! { let dp = arduino_hal::Peripherals::take().unwrap(); let pins = arduino_hal::pins!(dp); - let mut led = pins.d13.into_output(); + // let mut led = pins.d13.into_output(); let mut serial = arduino_hal::default_serial!(dp, pins, SERIAL_BAUD); ufmt::uwriteln!(&mut serial, "Hello from Arduino!").unwrap_infallible(); // let mut kd_KN = pins..into_input(); // let mut kd_KO = *pins.a.into_output(); - let mut kd_d1_1c = pins.d2.into_output(); - let mut kd_d2_5div = pins.d3.into_output(); - let mut kd_d3_6mul = pins.d4.into_output(); - let mut kd_d4_7up = pins.a3.into_output(); - let mut kd_d5_8e = pins.a2.into_output(); - let mut kd_d6_90 = pins.d7.into_output(); - let mut kd_d7_2down = pins.a1.into_output(); - let mut kd_d8_3plus = pins.d11.into_output(); - let mut kd_d9_4min = pins.d12.into_output(); - let mut kd_seg_a = pins.d5.into_output(); - kd_seg_a.set_high(); - let mut kd_seg_b = pins.d8.into_output(); - kd_seg_b.set_high(); - let mut kd_seg_c = pins.d10.into_output(); - kd_seg_c.set_high(); - let mut kd_seg_d = pins.a5.into_output(); - kd_seg_d.set_high(); - let mut kd_seg_e = pins.d9.into_output(); - kd_seg_e.set_high(); - let mut kd_seg_f = pins.d6.into_output(); - kd_seg_f.set_high(); - let mut kd_seg_g = pins.a0.into_output(); - kd_seg_g.set_high(); - let mut kd_seg_dp = pins.a4.into_output(); - kd_seg_dp.set_high(); + let mut dp = DispalyPins::new( + pins.d2.into_output(), + pins.d3.into_output(), + pins.d4.into_output(), + pins.a3.into_output(), + pins.a2.into_output(), + pins.d7.into_output(), + pins.a1.into_output(), + pins.d11.into_output(), + pins.d12.into_output(), + ); + + let mut seg = SegmentPins::new( + pins.d5.into_output(), + pins.d8.into_output(), + pins.d10.into_output(), + pins.a5.into_output(), + pins.d9.into_output(), + pins.d6.into_output(), + pins.a0.into_output(), + pins.a4.into_output(), + ); loop { - for d in 1u8..=9 { - match d { - 1 => { - kd_d9_4min.set_low(); - kd_d1_1c.set_high(); - } - 2 => { - kd_d1_1c.set_low(); - kd_d2_5div.set_high(); - } - 3 => { - kd_d2_5div.set_low(); - kd_d3_6mul.set_high(); - } - 4 => { - kd_d3_6mul.set_low(); - kd_d4_7up.set_high(); - } - 5 => { - kd_d4_7up.set_low(); - kd_d5_8e.set_high(); - } - 6 => { - kd_d5_8e.set_low(); - kd_d6_90.set_high(); - } - 7 => { - kd_d6_90.set_low(); - kd_d7_2down.set_high(); - } - 8 => { - kd_d7_2down.set_low(); - kd_d8_3plus.set_high(); - } - 9 => { - kd_d8_3plus.set_low(); - kd_d9_4min.set_high(); - } - _ => unreachable!(), - }; - kd_seg_g.set_low(); - arduino_hal::delay_ms(1); - } + dp.scan(|no| { + seg.set_a(true); + }); + arduino_hal::delay_ms(200); } // loop {