eight_segment/
lib.rs

1#![no_std]
2
3extern crate embedded_hal;
4
5use embedded_hal::digital::OutputPin;
6
7///An eight segment display that can display a single digit from 0x0 to 0xF at a time.
8/// Intended for use with the HDSP-H101 and HDSP-H103.
9///
10/// The labels on the segments are as described in the H101 and H103 datasheet:
11///```text
12///    _______
13///   |   a   |
14///   |f     b|
15///   |   g   |
16///   |-------|
17///   |e     c|
18///   |   d   |
19///   '-------'  .
20///              p
21///```
22///Some like the H101 have the segment turned on being pin-low, and some like the H103 have on being pin-high.
23///Set the `high_on` boolean as appropriate.
24///
25/// # Examples
26///```rust,ignore
27///    // in this case using the `atsamd21_hal` library to provide access to the pins
28///    // but any embedded-hal implementation should work
29///    let mut peripherals = Peripherals::take().unwrap();
30///    let mut pins = peripherals.PORT.split();
31///    let mut seg_a = pins.pa21.into_open_drain_output(&mut pins.port);
32///    let mut seg_b = pins.pa20.into_open_drain_output(&mut pins.port);
33///    let mut seg_c = pins.pa11.into_open_drain_output(&mut pins.port);
34///    let mut seg_d = pins.pb10.into_open_drain_output(&mut pins.port);
35///    let mut seg_e = pins.pb11.into_open_drain_output(&mut pins.port);
36///    let mut seg_f = pins.pa16.into_open_drain_output(&mut pins.port);
37///    let mut seg_g = pins.pa17.into_open_drain_output(&mut pins.port);
38///    let mut seg_p = pins.pa10.into_open_drain_output(&mut pins.port);
39///    let mut eight_segment = EightSegment {
40///        high_on: false,
41///        seg_a: &mut seg_a,
42///        seg_b: &mut seg_b,
43///        seg_c: &mut seg_c,
44///        seg_d: &mut seg_d,
45///        seg_e: &mut seg_e,
46///        seg_f: &mut seg_f,
47///        seg_g: &mut seg_g,
48///        seg_p: &mut seg_p,
49///    };
50///    eight_segment.blank(); // All segments off
51///    eight_segment.display(0xb, false); // Display 'b' with decimal point off
52///```
53
54pub struct EightSegment<'a> {
55    pub high_on: bool,
56    pub seg_a: &'a mut OutputPin,
57    pub seg_b: &'a mut OutputPin,
58    pub seg_c: &'a mut OutputPin,
59    pub seg_d: &'a mut OutputPin,
60    pub seg_e: &'a mut OutputPin,
61    pub seg_f: &'a mut OutputPin,
62    pub seg_g: &'a mut OutputPin,
63    pub seg_p: &'a mut OutputPin,
64}
65
66impl<'a> EightSegment<'a> {
67    pub fn blank(&mut self) {
68        if self.high_on {self.seg_a.set_low()} else {self.seg_a.set_high()};
69        if self.high_on {self.seg_b.set_low()} else {self.seg_b.set_high()};
70        if self.high_on {self.seg_c.set_low()} else {self.seg_c.set_high()};
71        if self.high_on {self.seg_d.set_low()} else {self.seg_d.set_high()};
72        if self.high_on {self.seg_e.set_low()} else {self.seg_e.set_high()};
73        if self.high_on {self.seg_f.set_low()} else {self.seg_f.set_high()};
74        if self.high_on {self.seg_g.set_low()} else {self.seg_g.set_high()};
75        if self.high_on {self.seg_p.set_low()} else {self.seg_p.set_high()};
76    }
77
78    pub fn set_segments(&mut self,
79                        seg_a_on: bool,
80                        seg_b_on: bool,
81                        seg_c_on: bool,
82                        seg_d_on: bool,
83                        seg_e_on: bool,
84                        seg_f_on: bool,
85                        seg_g_on: bool,
86                        seg_p_on: bool) {
87
88        if seg_a_on ^ !self.high_on {self.seg_a.set_high()} else {self.seg_a.set_low()};
89        if seg_b_on ^ !self.high_on {self.seg_b.set_high()} else {self.seg_b.set_low()};
90        if seg_c_on ^ !self.high_on {self.seg_c.set_high()} else {self.seg_c.set_low()};
91        if seg_d_on ^ !self.high_on {self.seg_d.set_high()} else {self.seg_d.set_low()};
92        if seg_e_on ^ !self.high_on {self.seg_e.set_high()} else {self.seg_e.set_low()};
93        if seg_f_on ^ !self.high_on {self.seg_f.set_high()} else {self.seg_f.set_low()};
94        if seg_g_on ^ !self.high_on {self.seg_g.set_high()} else {self.seg_g.set_low()};
95        if seg_p_on ^ !self.high_on {self.seg_p.set_high()} else {self.seg_p.set_low()};
96    }
97
98    pub fn display(&mut self, count: u8, seg_p_on: bool) {
99        let (seg_a_on, seg_f_on, seg_b_on, seg_g_on, seg_e_on, seg_c_on, seg_d_on) = match count {
100            0x0 => (true, true, true, false, true, true, true),
101            0x1 => (false, false, true, false, false, true, false),
102            0x2 => (true, false, true, true, true, false, true),
103            0x3 => (true, false,  true, true, false, true, true),
104            0x4 => (false, true, true, true, false, true, false),
105            0x5 => (true, true, false, true, false, true, true),
106            0x6 => (true, true, false, true, true, true, true),
107            0x7 => (true, false, true, false, false, true, false),
108            0x8 => (true, true, true, true, true, true, true),
109            0x9 => (true, true, true, true, false, true, false),
110            0xA => (true, true, true, false, true, true, false),
111            0xB => (false, true, false, true, true, true, true),
112            0xC => (false, false, false, true, true, false, true),
113            0xD => (false, false, true, true, true, true, true),
114            0xE => (true, true, false, true, true, false, true),
115            0xF => (true, true, false, true, true, false, false),
116            _ => (true, true, true, true, true, true, true),
117        };
118
119        self.set_segments(
120            seg_a_on,
121            seg_b_on,
122            seg_c_on,
123            seg_d_on,
124            seg_e_on,
125            seg_f_on,
126            seg_g_on,
127            seg_p_on
128        );
129    }
130}