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_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<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
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<CLK_PIN, DATA_PIN>(
fn shift_out_bits<ClockPin, DataPin>(
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<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]
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);
}
}