struct to hold display pins

This commit is contained in:
2025-07-18 20:31:23 +01:00
parent ca69073313
commit 9a0856634e

View File

@@ -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<Output, PD5>,
kd_seg_b: Pin<Output, PB0>,
kd_seg_c: Pin<Output, PB2>,
kd_seg_d: Pin<Output, PC5>,
kd_seg_e: Pin<Output, PB1>,
kd_seg_f: Pin<Output, PD6>,
kd_seg_g: Pin<Output, PC0>,
kd_seg_dp: Pin<Output, PC4>,
}
impl SegmentPins {
fn new(
kd_seg_a: Pin<Output, PD5>,
kd_seg_b: Pin<Output, PB0>,
kd_seg_c: Pin<Output, PB2>,
kd_seg_d: Pin<Output, PC5>,
kd_seg_e: Pin<Output, PB1>,
kd_seg_f: Pin<Output, PD6>,
kd_seg_g: Pin<Output, PC0>,
kd_seg_dp: Pin<Output, PC4>,
) -> 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<Output>; 9]);
impl DispalyPins {
fn new(
kd_d1_1c: Pin<Output, PD2>,
kd_d2_5div: Pin<Output, PD3>,
kd_d3_6mul: Pin<Output, PD4>,
kd_d4_7up: Pin<Output, PC3>,
kd_d5_8e: Pin<Output, PC2>,
kd_d6_90: Pin<Output, PD7>,
kd_d7_2down: Pin<Output, PC1>,
kd_d8_3plus: Pin<Output, PB3>,
kd_d9_4min: Pin<Output, PB4>,
) -> 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 {