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();
}
}
}
|