aboutsummaryrefslogtreecommitdiffstats
path: root/sw/deps/hd44780-driver/examples/metro_m0/examples/scrolling.rs
blob: f02a7528d67fce6dca1362dc166694fe23b303c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#![feature(used)]
#![no_std]

extern crate cortex_m_semihosting;

#[cfg(not(feature = "use_semihosting"))]
extern crate panic_abort;

#[cfg(feature = "use_semihosting")]
extern crate panic_semihosting;

extern crate cortex_m;
extern crate cortex_m_rt;
extern crate atsamd21_hal;
extern crate metro_m0;

use metro_m0::clock::GenericClockController;
use metro_m0::delay::Delay;
use metro_m0::{CorePeripherals, Peripherals};

extern crate hd44780_driver;

use hd44780_driver::{HD44780, DisplayMode, Display, Cursor, CursorBlink};

extern crate embedded_hal;

fn busy_loop(){
    #[allow(unused_variables)]
    let mut i = 0;

    for _ in 0..50000 {
        i += 1;
    }
}

fn main() {
    let mut peripherals = Peripherals::take().unwrap();

    let core = CorePeripherals::take().unwrap();

    let mut clocks = GenericClockController::new(
        peripherals.GCLK,
        &mut peripherals.PM,
        &mut peripherals.SYSCTRL,
        &mut peripherals.NVMCTRL,
    );

    let mut pins = metro_m0::pins(peripherals.PORT);
    let delay = Delay::new(core.SYST, &mut clocks);

    let mut lcd = HD44780::new_8bit(
    
        pins.d4.into_open_drain_output(&mut pins.port), // Register Select pin
        pins.d3.into_open_drain_output(&mut pins.port), // Enable pin

        pins.d5.into_open_drain_output(&mut pins.port),  // d0
        pins.d6.into_open_drain_output(&mut pins.port),  // d1
        pins.d7.into_open_drain_output(&mut pins.port),  // d2
        pins.d8.into_open_drain_output(&mut pins.port),  // d3
        pins.d9.into_open_drain_output(&mut pins.port),  // d4
        pins.d10.into_open_drain_output(&mut pins.port), // d5
        pins.d11.into_open_drain_output(&mut pins.port), // d6
        pins.d12.into_open_drain_output(&mut pins.port), // d7

        delay,
    );

    //lcd.set_cursor_mode(CursorMode::Increment);
    lcd.set_autoscroll(true);

    lcd.set_display_mode(DisplayMode {
        cursor_visible  : Cursor::Invisible,
        cursor_blink    : CursorBlink::On,
        display_visible : Display::On,
    });

    let string = "Hello, world! ";

    // Display the following string
    loop {
        
        for c in string.chars() {
            lcd.write_char(c);

            busy_loop();
        }

    }
 
    
}