Added generic write display routine

This commit is contained in:
Sebastian 2022-10-06 18:51:35 +02:00
parent 9c4e0c109e
commit e648234467
1 changed files with 131 additions and 58 deletions

View File

@ -8,6 +8,7 @@ use bsp::entry;
use defmt::*; use defmt::*;
use defmt_rtt as _; use defmt_rtt as _;
use embedded_hal::digital::v2::OutputPin; use embedded_hal::digital::v2::OutputPin;
use num_traits::{Float, FloatConst};
use panic_probe as _; use panic_probe as _;
// Provide an alias for our BSP so we can switch targets quickly. // Provide an alias for our BSP so we can switch targets quickly.
@ -22,25 +23,25 @@ use bsp::hal::{
watchdog::Watchdog, watchdog::Watchdog,
}; };
fn toggle_clock<PIN>(clock_pin: &mut PIN, delay: &mut cortex_m::delay::Delay) fn toggle_clock<ClockPin>(clock_pin: &mut ClockPin, delay: &mut cortex_m::delay::Delay)
where where
PIN: OutputPin, ClockPin: OutputPin,
{ {
clock_pin.set_high(); clock_pin.set_high();
delay.delay_ms(1); delay.delay_us(1);
clock_pin.set_low(); clock_pin.set_low();
delay.delay_ms(1); delay.delay_us(1);
} }
fn shift_out_bits<CLK_PIN, DATA_PIN>( fn shift_out_bits<ClockPin, DataPin>(
data: u32, data: u32,
len: u8, len: u8,
clock_pin: &mut CLK_PIN, clock_pin: &mut ClockPin,
data_pin: &mut DATA_PIN, data_pin: &mut DataPin,
delay: &mut cortex_m::delay::Delay, delay: &mut cortex_m::delay::Delay,
) where ) where
CLK_PIN: OutputPin, ClockPin: OutputPin,
DATA_PIN: OutputPin, DataPin: OutputPin,
{ {
for i in 0..len { for i in 0..len {
if data & (1 << (len - i - 1) as u32) != 0 { if data & (1 << (len - i - 1) as u32) != 0 {
@ -52,6 +53,52 @@ fn shift_out_bits<CLK_PIN, DATA_PIN>(
} }
} }
fn write_display<
ColClockPin,
ColDataPin,
RowClockPin,
RowDataPin,
StrobePin,
WhiteOEPin,
BlackOEPin,
>(
pixels: &[u32; 16],
col_clock_pin: &mut ColClockPin,
col_data_pin: &mut ColDataPin,
row_clock_pin: &mut RowClockPin,
row_data_pin: &mut RowDataPin,
strobe_pin: &mut StrobePin,
white_oe_pin: &mut WhiteOEPin,
black_oe_pin: &mut BlackOEPin,
delay: &mut cortex_m::delay::Delay,
) where
ColClockPin: OutputPin,
ColDataPin: OutputPin,
RowClockPin: OutputPin,
RowDataPin: OutputPin,
StrobePin: OutputPin,
WhiteOEPin: OutputPin,
BlackOEPin: OutputPin,
{
for y in 0..16 {
shift_out_bits(pixels[y], 24, col_clock_pin, col_data_pin, delay);
shift_out_bits(1 << y, 16, row_clock_pin, row_data_pin, delay);
strobe_pin.set_high();
delay.delay_us(1);
strobe_pin.set_low();
white_oe_pin.set_high();
delay.delay_ms(10);
white_oe_pin.set_low();
black_oe_pin.set_high();
delay.delay_ms(10);
black_oe_pin.set_low();
}
}
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
info!("Program start"); info!("Program start");
@ -95,58 +142,84 @@ fn main() -> ! {
let mut black_pin = pins.gpio7.into_push_pull_output(); let mut black_pin = pins.gpio7.into_push_pull_output();
let mut strobe_pin = pins.gpio8.into_push_pull_output(); let mut strobe_pin = pins.gpio8.into_push_pull_output();
write_display(
&[0; 16],
&mut col_clock_pin,
&mut col_data_pin,
&mut row_clock_pin,
&mut row_data_pin,
&mut strobe_pin,
&mut white_pin,
&mut black_pin,
&mut delay,
);
let pattern1 = [
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0100_0000_0101_0101,
0b1010_1010_1111_0010_1010,
0b0101_0100_0001_0101_0101,
0b1010_1010_0001_0010_1010,
0b0101_0100_1001_0101_0101,
0b1010_1010_0000_0010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
];
let pattern2 = [
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_0000_0010_1010,
0b0101_0100_1111_0101_0101,
0b1010_1010_0001_0010_1010,
0b0101_0100_0001_0101_0101,
0b1010_1010_1001_0010_1010,
0b0101_0100_0000_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
0b0101_0101_0101_0101_0101,
0b1010_1010_1010_1010_1010,
];
loop { loop {
for y in 0..16 { led_pin.set_low().unwrap();
for x in 0..20 { write_display(
shift_out_bits( &pattern1,
1 << y, &mut col_clock_pin,
16, &mut col_data_pin,
&mut row_clock_pin, &mut row_clock_pin,
&mut row_data_pin, &mut row_data_pin,
&mut delay, &mut strobe_pin,
); &mut white_pin,
&mut black_pin,
shift_out_bits( &mut delay,
1 << x, );
24, delay.delay_ms(1000);
&mut col_clock_pin,
&mut col_data_pin,
&mut delay,
);
black_pin.set_high();
strobe_pin.set_high();
delay.delay_ms(5);
strobe_pin.set_low();
black_pin.set_low();
delay.delay_ms(10);
}
}
led_pin.set_high().unwrap(); led_pin.set_high().unwrap();
write_display(
for y in 0..16 { &pattern2,
shift_out_bits(0, 24, &mut col_clock_pin, &mut col_data_pin, &mut delay); &mut col_clock_pin,
&mut col_data_pin,
shift_out_bits( &mut row_clock_pin,
1 << y, &mut row_data_pin,
16, &mut strobe_pin,
&mut row_clock_pin, &mut white_pin,
&mut row_data_pin, &mut black_pin,
&mut delay, &mut delay,
); );
delay.delay_ms(1000);
white_pin.set_high();
strobe_pin.set_high();
delay.delay_ms(5);
strobe_pin.set_low();
white_pin.set_low();
delay.delay_ms(10);
}
led_pin.set_low().unwrap();
} }
} }