Add simple screen

This commit is contained in:
Sofia 2025-09-10 19:51:16 +03:00
parent fad56304e2
commit a4204239a0
3 changed files with 174 additions and 26 deletions

61
Cargo.lock generated
View File

@ -50,12 +50,24 @@ dependencies = [
"unwrap-infallible", "unwrap-infallible",
] ]
[[package]]
name = "az"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
[[package]] [[package]]
name = "bare-metal" name = "bare-metal"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603"
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.3" version = "1.0.3"
@ -68,6 +80,16 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]]
name = "embedded-graphics-core"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba9ecd261f991856250d2207f6d8376946cd9f412a2165d3b75bc87a0bc7a044"
dependencies = [
"az",
"byteorder",
]
[[package]] [[package]]
name = "embedded-hal" name = "embedded-hal"
version = "0.2.7" version = "0.2.7"
@ -100,6 +122,37 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "723dce4e9f25b6e6c5f35628e144794e5b459216ed7da97b7c4b66cdb3fa82ca" checksum = "723dce4e9f25b6e6c5f35628e144794e5b459216ed7da97b7c4b66cdb3fa82ca"
[[package]]
name = "hash32"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
dependencies = [
"byteorder",
]
[[package]]
name = "heapless"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
dependencies = [
"hash32",
"stable_deref_trait",
]
[[package]]
name = "mipidsi"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ba34dcbf61182ffa6992b5a4d9b566d5a99df127fd93f6d314213347329e92f"
dependencies = [
"embedded-graphics-core",
"embedded-hal 1.0.0",
"heapless",
"nb 1.1.0",
]
[[package]] [[package]]
name = "nb" name = "nb"
version = "0.1.3" version = "0.1.3"
@ -145,6 +198,12 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "stable_deref_trait"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.109" version = "1.0.109"
@ -162,7 +221,9 @@ version = "0.1.0"
dependencies = [ dependencies = [
"atmega-hal", "atmega-hal",
"avr-device", "avr-device",
"embedded-graphics-core",
"embedded-hal 1.0.0", "embedded-hal 1.0.0",
"mipidsi",
"panic-halt", "panic-halt",
"ufmt", "ufmt",
] ]

View File

@ -5,11 +5,13 @@ edition = "2024"
[dependencies] [dependencies]
panic-halt = "1.0.0" panic-halt = "1.0.0"
avr-device = { version = "0.7", features = ["rt"] } avr-device = { version = "*", features = ["rt"] }
embedded-hal = "1.0" embedded-hal = "1.0.0"
atmega-hal = { git = "https://github.com/Rahix/avr-hal?tab=readme-ov-file", rev="cd3edea", version = "0.1.0", features=["atmega328p"] } atmega-hal = { git = "https://github.com/Rahix/avr-hal?tab=readme-ov-file", rev="cd3edea", version = "0.1.0", features=["atmega328p"] }
ufmt = "0.2.0" ufmt = "0.2.0"
mipidsi = "0.9.0"
embedded-graphics-core = "0.4.0"
# nb = "1.1.0" # nb = "1.1.0"
# pwm-pca9685 = "1.0.0" # pwm-pca9685 = "1.0.0"
# infrared = "0.14.1" # infrared = "0.14.1"

View File

@ -4,40 +4,71 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
use atmega_hal::{Usart, usart::Baudrate}; use core::convert::Infallible;
use embedded_hal::delay::DelayNs;
use atmega_hal::{
Spi, Usart,
prelude::_embedded_hal_blocking_spi_Write,
spi::{self, Settings},
usart::Baudrate,
};
use embedded_graphics_core::{
draw_target::DrawTarget,
pixelcolor::Rgb565,
prelude::{Point, RgbColor, Size},
primitives::Rectangle,
};
use embedded_hal::spi::{Operation, SpiBus};
use embedded_hal::{delay::DelayNs, spi::ErrorType, spi::SpiDevice};
use panic_halt as _; use panic_halt as _;
type CoreClock = atmega_hal::clock::MHz8; type CoreClock = atmega_hal::clock::MHz8;
struct Device<T: DelayNs> {
spi: Spi,
delay: T,
}
impl<T: DelayNs> embedded_hal::spi::ErrorType for Device<T> {
type Error = Infallible;
}
impl<T: DelayNs> embedded_hal::spi::SpiDevice for Device<T> {
fn transaction(
&mut self,
operations: &mut [embedded_hal::spi::Operation<'_, u8>],
) -> Result<(), Self::Error> {
for op in operations {
match op {
Operation::Read(items) => {
self.spi.read(*items)?;
}
Operation::Write(items) => {
SpiBus::write(&mut self.spi, *items)?;
}
Operation::Transfer(read, write) => {
self.spi.transfer(read, write)?;
}
Operation::TransferInPlace(items) => {
self.spi.transfer_in_place(items)?;
}
Operation::DelayNs(time) => {
self.delay.delay_ns(*time);
}
}
}
Ok(())
}
}
#[avr_device::entry] #[avr_device::entry]
fn main() -> ! { fn main() -> ! {
let dp = atmega_hal::Peripherals::take().unwrap(); let dp = atmega_hal::Peripherals::take().unwrap();
let pins = atmega_hal::pins!(dp); let pins = atmega_hal::pins!(dp);
let a0 = pins.pc0;
let a1 = pins.pc1;
let a2 = pins.pc2;
let a3 = pins.pc3;
let mosi = pins.pb3;
let miso = pins.pb4;
let sck = pins.pb5;
let rx = pins.pd0; let rx = pins.pd0;
let tx = pins.pd1; let tx = pins.pd1;
let d2 = pins.pd2;
let d3 = pins.pd3;
let d4 = pins.pd4;
let d5 = pins.pd5;
let d6 = pins.pd6;
let d7 = pins.pd7;
let d9 = pins.pb1;
let d10 = pins.pb2;
let mut led = pins.pb0.into_output();
led.set_high();
let mut delay = atmega_hal::delay::Delay::<CoreClock>::new();
let mut serial = Usart::new( let mut serial = Usart::new(
dp.USART0, dp.USART0,
rx, rx,
@ -45,9 +76,63 @@ fn main() -> ! {
Baudrate::<CoreClock>::new(57600), Baudrate::<CoreClock>::new(57600),
); );
let (mut spi, mut cs) = spi::Spi::new(
dp.SPI,
pins.pb5.into_output(),
pins.pb3.into_output(),
pins.pb4.into_pull_up_input(),
pins.pb2.into_output(),
Settings {
data_order: spi::DataOrder::MostSignificantFirst,
clock: spi::SerialClockRate::OscfOver2,
mode: embedded_hal::spi::Mode {
polarity: embedded_hal::spi::Polarity::IdleHigh,
phase: embedded_hal::spi::Phase::CaptureOnFirstTransition,
},
},
);
// Create a buffer
let mut buffer = [0_u8; 512];
let di = mipidsi::interface::SpiInterface::new(
Device {
spi,
delay: atmega_hal::delay::Delay::<CoreClock>::new(),
},
pins.pb1.into_output(),
&mut buffer,
);
let mut builder_delay = atmega_hal::delay::Delay::<CoreClock>::new();
let mut display = mipidsi::Builder::new(mipidsi::models::ST7789, di)
.reset_pin(pins.pd7.into_output())
.init(&mut builder_delay)
.unwrap();
display.clear(Rgb565::GREEN).unwrap();
let mut delay = atmega_hal::delay::Delay::<CoreClock>::new();
let mut color = 0;
loop { loop {
led.toggle(); display
.clear(Rgb565::new(color % 255, color % 40, color % 100))
.unwrap();
display
.fill_solid(
&Rectangle {
top_left: Point { x: 50, y: 50 },
size: Size {
width: 100,
height: 100,
},
},
Rgb565::RED,
)
.unwrap();
color += 40;
// inner_led.toggle();
// other_led.toggle();
delay.delay_ms(1000); delay.delay_ms(1000);
ufmt::uwriteln!(&mut serial, "Hello from ATmega!\r").unwrap(); ufmt::uwriteln!(&mut serial, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA").unwrap();
} }
} }