From 23369dcf9b3d2eb40a01d1eac7423df142f41894 Mon Sep 17 00:00:00 2001 From: Gabe Venberg Date: Tue, 28 Nov 2023 12:17:05 -0600 Subject: [PATCH] lcd *should* work? --- Cargo.toml | 1 + README.md | 2 +- src/main.rs | 23 ++++++++++++++++++----- wiring.fzz | Bin 47649 -> 54153 bytes 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d71645..435cb3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ panic-probe = { version = "0.3", features = ["print-defmt"] } # We're using a Pico by default on this template rp-pico = "0.8" max31855 = "0.1.0" +hd44780-driver = "0.4.0" # cargo build/run [profile.dev] diff --git a/README.md b/README.md index bf9c416..3ee132d 100644 --- a/README.md +++ b/README.md @@ -11,5 +11,5 @@ pid temperature controller using the pi pico. ## crates to use: [thermocouple chip](https://crates.io/crates/max31855) -[lcd](https://crates.io/crates/lcd) +[lcd](https://crates.io/crates/hd44780-driver) [rotary encoder](https://crates.io/crates/rotary-encoder-embedded) diff --git a/src/main.rs b/src/main.rs index fae0a32..1b82560 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,6 @@ -//! Blinks the LED on a Pico board -//! -//! This will blink an LED attached to GP25, which is the pin the Pico uses for the on-board LED. #![no_std] #![no_main] -use core::fmt::Write; use bsp::{ entry, hal::{ @@ -12,10 +8,10 @@ use bsp::{ uart::{UartConfig, UartPeripheral}, }, }; +use core::fmt::Write; use defmt_rtt as _; use embedded_hal::digital::v2::OutputPin; use embedded_hal::spi::MODE_0; -use max31855::{Max31855, Unit}; use panic_probe as _; // Provide an alias for our BSP so we can switch targets quickly. @@ -31,6 +27,9 @@ use bsp::hal::{ watchdog::Watchdog, }; +use hd44780_driver as hd44780; +use max31855::{Max31855, Unit}; + #[entry] fn main() -> ! { let mut pac = pac::Peripherals::take().unwrap(); @@ -99,6 +98,20 @@ fn main() -> ! { MODE_0, ); + let mut lcd = hd44780::HD44780::new_4bit( + pins.gpio16.into_push_pull_output(), //rs + pins.gpio17.into_push_pull_output(), // enable + pins.gpio18.into_push_pull_output(), //d4 + pins.gpio19.into_push_pull_output(), //d5 + pins.gpio20.into_push_pull_output(), //d6 + pins.gpio21.into_push_pull_output(), //d6 + &mut delay, + ).unwrap(); + + lcd.reset(&mut delay).unwrap(); + lcd.clear(&mut delay).unwrap(); + lcd.write_str("lcd initalized", &mut delay).unwrap(); + loop { led_pin.set_high().unwrap(); external_led_pin.set_low().unwrap(); diff --git a/wiring.fzz b/wiring.fzz index 992636306ebd910122ebeef4bb065c8925bec6ea..c8fdb59f5c900d35d24f944b291338a61146a878 100644 GIT binary patch delta 14973 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 AD*ylh delta 8418 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 p#pQ|3o2MH~dPUnAB zKcB+ZSZG4}OMnQ?7*-XU^vvl5Go}3l^1Xtix(Th~YsPkN3iF+(A!wqzm<`xR{6|5vJ@SYE|%WQ*9d}MMAOvv*fG^IhrY2*@d*2q^H`| zKT%-C|2B16bul?TDQ$hEkW?HSIQuIubi7b?`5-6z#(vkK$+3%U_+uBMwSp@D7*Tq& znBGJWP!PG1bZ`Pb+r z3Yccm>ht8ruaf1oqQj+#ZY$fbIlmS%+~_~qOS+t=Vqyp`esL*WHb}!|NH*9|YF)!I z>u3n@H(9+%ezVA5w7-U1)^o+j#xETA5l&S0@0A3GBmFn^DAoO^Ka%gTadJ_$&5rFV z0=KR)xR|?+k%9mFrbWgZYm>zzl1cITwguJnn{VYgfkLO?zT1>Ec3Ap1-Kr>Kk)XgC zKxUMA^Qkn#@5*39Fas{06LA9w-kN<{QoTIr|6!iQ=QgLkp!T)Z@15=+n*3|T%S4rY z9omI$Mcolkp`8+fXae74?2bZ}y4GTE0?GAB#IYS~GWmG=tiKnsG3z=6y`ioGh!j0`Iy7T8OA}-jlS}KcY`JUN85S_ihe2jF|V; z%@XNA&$xYGZRWS8kV2b}Ke`>MPaPVB6bt4ktn|IpP!!Jn&?rnj<$&UlCB9q0;qpCB z;v4hVQDQB9)ejUJJE|DU)JlzZOi~*wCL$TVn=`3qwhdgSKnahvoX1s~vhez@sOF>O zBVv&dY3ECm9D^-t$5vx5n~;u4U$lxePFBLn$DQ3Ar0rO!u{v%99S2M7NJ&oYV1i80_1F!!<$i3R1s8#HVRmqa2u+_QE^3Og*J^1qQ7G zeA4NSQ5Ds|ig(Pds}rwgTzY#Qqm;~@BV#3NCkBIM;1Gz+A>9nW+1JFN=F8;k5|jjT z3g)>BGd5PD*=XK=T36D6=Ws`>8j`a5f^$+x@cqpoDAxFhQY-N;FV9*mkQBLTo9(yC z*=z7BwR}qKMV;vIJ}0N5N#J`|!uQt6C~P_(Lct)wUW<~6j0T6T<$pq7*m}G>Z5Mg- zEG1HkqXBWD(hBrVov!T;P?CLt z{{NN$D9IusQ6c}|a)X4OF@yi=1rnrwiT^{`FXw-VGOqCt^~Wv#;lQ}rKjfZ}{)fI3 aj{op{LJjBtD>F#Ym}Ez@tADOFK=@xo*F}&3