struct to hold display pins
This commit is contained in:
199
src/main.rs
199
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<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 {
|
||||
|
||||
Reference in New Issue
Block a user