diff --git a/src/main.rs b/src/main.rs index e27afe1..665c774 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use bsp::entry; use defmt::*; use defmt_rtt as _; use embedded_hal::digital::v2::OutputPin; +use num_traits::{Float, FloatConst}; use panic_probe as _; // Provide an alias for our BSP so we can switch targets quickly. @@ -22,25 +23,25 @@ use bsp::hal::{ watchdog::Watchdog, }; -fn toggle_clock(clock_pin: &mut PIN, delay: &mut cortex_m::delay::Delay) +fn toggle_clock(clock_pin: &mut ClockPin, delay: &mut cortex_m::delay::Delay) where - PIN: OutputPin, + ClockPin: OutputPin, { clock_pin.set_high(); - delay.delay_ms(1); + delay.delay_us(1); clock_pin.set_low(); - delay.delay_ms(1); + delay.delay_us(1); } -fn shift_out_bits( +fn shift_out_bits( data: u32, len: u8, - clock_pin: &mut CLK_PIN, - data_pin: &mut DATA_PIN, + clock_pin: &mut ClockPin, + data_pin: &mut DataPin, delay: &mut cortex_m::delay::Delay, ) where - CLK_PIN: OutputPin, - DATA_PIN: OutputPin, + ClockPin: OutputPin, + DataPin: OutputPin, { for i in 0..len { if data & (1 << (len - i - 1) as u32) != 0 { @@ -52,6 +53,52 @@ fn shift_out_bits( } } +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] fn main() -> ! { info!("Program start"); @@ -95,58 +142,84 @@ fn main() -> ! { let mut black_pin = pins.gpio7.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 { - for y in 0..16 { - for x in 0..20 { - shift_out_bits( - 1 << y, - 16, - &mut row_clock_pin, - &mut row_data_pin, - &mut delay, - ); - - shift_out_bits( - 1 << x, - 24, - &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_low().unwrap(); + write_display( + &pattern1, + &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, + ); + delay.delay_ms(1000); led_pin.set_high().unwrap(); - - for y in 0..16 { - shift_out_bits(0, 24, &mut col_clock_pin, &mut col_data_pin, &mut delay); - - shift_out_bits( - 1 << y, - 16, - &mut row_clock_pin, - &mut row_data_pin, - &mut delay, - ); - - 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(); + write_display( + &pattern2, + &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, + ); + delay.delay_ms(1000); } }