Пт июн 07, 2019 12:59:47
TFT_command(ST7789_SWRESET);
delay_ms(120);
TFT_command(ST7789_SLEEPOUT);
delay_ms(120);
TFT_command(ST7789_DISPON);
TFT_command(ST7789_MADCTL_RGB);
TFT_data(0b00001000);
TFT_command(ST7789_COLMOD);
TFT_data(5);
MOSI_pin = 1;
DC_pin = 1;
SCK_pin = 1;
RESET_pin = 0;
delay_ms(120);
RESET_pin = 1;
delay_ms(120);
// последовательность инициализации дисплея
TFT_command(0x11); // проснулись
delay_ms(10); // пауза 10 мс
TFT_command(0x3A); // режим цвета:
TFT_data(0x05); // 16 бит
TFT_command(0x29); // включаем изображение
// закрасим экран тремя цветами на черном фоне
for (y=0;y<240;y++)
for (x=0;x<240;x++) {
unsigned int color=0x0;
if (y<20) color=0xFC00;
else {
if (y<40) color=0x02E0;
else { if (y<60) color=0x001F; }
}
lcd7735_pix(x, y, color);
}
Пт июн 07, 2019 13:17:14
Пт июн 07, 2019 13:19:18
Пт июн 07, 2019 13:46:17
Пт июн 07, 2019 14:08:19
Пт июн 07, 2019 14:18:10
Пт июн 07, 2019 14:33:39
Пн июн 10, 2019 15:20:00
Чт окт 17, 2019 14:46:04
void write_byte(unsigned char c,unsigned char com)//0-command 1-data
{ unsigned char i;
CS_pin = 0;
if(com==0)
DC_pin = 0;
else
DC_pin = 1;
SCK_pin = 1;
for(i=0;i<8;i++)
{
if(((c>>(7-i))&1) == 1){
MOSI_pin = 1;}
else {
MOSI_pin = 0;}
SCK_pin = 0;
delay_us(1);
SCK_pin = 1;
}
CS_pin = 1;
}
void Reset()
{
RESET_pin = 0;
delay_ms(10);
RESET_pin = 1;
delay_ms(150);
}
void TFTInit()
{ unsigned int i=0;
DDRB.2 = 1;
DDRD.4 = 1;
DDRD.5 = 1;
DDRD.6 = 1;
DDRD.7 = 1;
RESET_pin = 1;
CS_pin = 1;
DC_pin = 1;
SCK_pin = 1;
MOSI_pin = 1;
Reset();
write_byte(0x01,0);
delay_ms(150);
write_byte(0x11,0);
delay_ms(100);
write_byte(0x3A,0);
write_byte(0x05,1);
write_byte(0x36,0);
write_byte(0x14,1);
write_byte(0x21,0);
write_byte(0x13,0);
write_byte(0x29,0);
}
void WriteTwoByte(unsigned char LCD_DataH,unsigned char LCD_DataL)
{
write_byte(LCD_DataH,1);
write_byte(LCD_DataL,1);
}
void OutColor(unsigned int color)
{
WriteTwoByte((color>>8),((color<<8)>>8));
}
void TFTSingleColor(unsigned int color)
{
unsigned char i,j;
for (i=0;i<WIDTH;i++)
for (j=0;j<HEIGH;j++)
OutColor(color);
}
void Area(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1)
{
write_byte(0x2a,0);
write_byte(0,1);
write_byte(y0,1);
write_byte(0,1);
write_byte(y1,1);
write_byte(0x2b,0);
write_byte(0,1);
write_byte(x0,1);
write_byte(0,1);
write_byte(x1,1);
write_byte(0x2c,0);
}
void DrawPixel(unsigned char x0, unsigned char y0, unsigned int color)
{
Area((WIDTH-x0),y0,(WIDTH-x0),y0);
OutColor(color);
}
void WriteChar8x11(unsigned char x0, unsigned char y0, unsigned char s, unsigned int color)
{
unsigned char x,y,c;
Area((19-y0)*8, x0*11, (19-y0)*8+7, x0*11+10); // Area((19-x0)*8, y0*11, (19-x0)*8+7, y0*11+10);
for(y=0;y<8;y++){
for(x=0;x<11;x++)
{
if(s>=192)
c=65;
else
c=0;
if((Font_8x11[s-32-c][y]&(1<<x))!=0)
OutColor(color);
else
OutColor(BLACK);
}
}
}
void WriteString8x11(unsigned char x0,unsigned char y0,unsigned char *s,unsigned int color)
{
int i,x,y,xx,c;
xx=19-x0;
for(i = 0;s[i]!='\0';i++)
{
Area(xx*8, y0*11, xx*8+7, y0*11+10);//откуда тут взялись константы - тоже не понятно, как их высчитывать..
for(y=0;y<8;y++)
for(x=0;x<11;x++)
{
if(s[i]>=192)
c=65;
else
c=0;
if((Font_8x11[s[i]-32-c][x]&(1<<y))!=0)
OutColor(color);
else
OutColor(BLACK);
}
if(xx==0)
{
xx=19;
y0++;
}
else
xx--;
if(y0>10)
y0=0;
}
}
Вт окт 22, 2019 09:03:56
Вт окт 22, 2019 10:44:45
Ср янв 15, 2020 16:50:35
Чт янв 16, 2020 10:36:57
void SPI1_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; /* Enable SPI1 clock */
/* Configure PA6 to MISO, PA7 to MOSI, PB3 to SCK */
GPIOA->AFR[0] &= ~((15ul << 4* 6) | (15ul << 4* 7));
GPIOA->AFR[0] |= (( 0ul << 4* 6) | ( 0ul << 4* 7));
GPIOB->AFR[0] &= ~(15ul << 4* 3);
GPIOB->AFR[0] |= ( 0ul << 4* 3);
GPIOA->MODER &= ~(( 3ul << 2* 6) | ( 3ul << 2* 7));
GPIOA->MODER |= (( 2ul << 2* 6) | ( 2ul << 2* 7));
GPIOB->MODER &= ~( 3ul << 2* 3);
GPIOB->MODER |= ( 2ul << 2* 3);
SPI1->CR1 = 0x00000000; /* Reset SPI1 CR1 Registry*/
SPI1->CR1 = (( 0ul << 0) | /* CPHA=0 */
( 1ul << 1) | /* CPOL=1 */
( 1ul << 2) | /* MSTR=1 */
( 0ul << 3) | /* BR (fPCLK/2) ~= Max SPEED */
( 0ul << 7) | /* MSBFIRST */
( 0ul << 8) | /* SSI */
( 1ul << 14) | /* SSI */
( 1ul << 9)); /* SSM */
SPI1->CR2 = 0x00000000; /* Reset SPI1 CR2 Registry*/
SPI1->CR2 |= (SPI_CR2_NSSP | SPI_CR2_DS_0 | SPI_CR2_DS_1 | SPI_CR2_DS_2 | SPI_CR2_FRXTH);
SPI1->CRCPR = 0x0007;
SPI1->CR1 |= SPI_CR1_SPE; /* Enable SPI1 */
}
void SPI1_Write_byte (uint8_t wr)
{
*(volatile uint8_t *)&(SPI1->DR) = wr;
while (!(SPI1->SR & SPI_SR_TXE));
while (SPI1->SR & SPI_SR_BSY);
}
Чт янв 16, 2020 12:45:24
Вт мар 09, 2021 19:52:57
Пт апр 23, 2021 10:36:59
Ср апр 28, 2021 14:43:19
Делал инициализацию на основе этих данныхmab72 писал(а):-последовательность первоначальной инициализации
// Инициализация
void lcd_st7739_init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_1LINE;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
hspi1.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi1);
// CS=0 - начали сеанс работы с дисплеем
LCD_ST7739_CS_0;
// аппаратный сброс дисплея
LCD_ST7739_RES_0; // RST=0
// lcd_st7739_send_cmd(0x01);
HAL_Delay(LCD_RESET_DELAY); // пауза
LCD_ST7739_RES_1; // RST=1
HAL_Delay(LCD_DELAY); // пауза
// инициализация дисплея
lcd_st7739_send_cmd(0x11); // после сброса дисплей спит - даем команду проснуться
HAL_Delay(LCD_DELAY); // пауза
lcd_st7739_send_cmd(0x3A); // режим цвета:
lcd_st7739_send_data(0x05); //16 бит
lcd_st7739_send_cmd(0x36); // направление вывода изображения:
lcd_st7739_send_data(0x14); // снизу вверх, справа налево, порядок цветов RGB
lcd_st7739_send_cmd(0x21); // инверсия цвета
lcd_st7739_send_cmd(0x29); // включаем изображение
lcd_st7739_send_cmd(0x51); // установка контрастности?
lcd_st7739_send_cmd(0x0); // параметр
LCD_ST7739_CS_1;
}
mab72 писал(а):-режим работы SPI (CPOL, CPHA)
Пн май 31, 2021 22:55:20
#define DISP_Enable PORTB &= ~(1<<CS_BIT);
#define DISP_Disable PORTB |= (1<<CS_BIT);
#define DISP_Reset_ON PORTB &= ~(1<<RES_BIT);
#define DISP_Reset_OFF PORTB |= (1<<RES_BIT);
#define DISP_Mode_Command PORTB &= ~(1<<DC_BIT);
#define DISP_Mode_Data PORTB |= (1<<DC_BIT);
#define SCK_L PORTB &= ~(1<<SCK_BIT);
#define SCK_H PORTB |= (1<<SCK_BIT);
#define MOSI_L PORTB &= ~(1<<MOSI_BIT);
#define MOSI_H PORTB |= (1<<MOSI_BIT);
// Номера выводов аппаратного SPI
#define DC_BIT 0 // #08 - DC (режим передачи: 1 - данные; 0 - команда)
#define RES_BIT 1 // #09 - RES (аппаратный сброс: 1 - нормальная работа; 0 - сброс)
#define CS_BIT 2 // #10 - CS дисплея (выбор устройства: 0 - активен; 1 - неактивен)
#define MOSI_BIT 3 // #11 - MOSI/SDA (данные от МК к ведомому устройству)
#define SCK_BIT 5 // #13 - SCK/SCL (тактовая частота)
// Функции
void InitSPI(void); // инициализация SPI (частота, тип, выводы)
#include <avr/io.h>
#include "SPI.h"
void InitSPI(void) { // настройка SPI
// SPSR |= (1<<SPI2X); // удвоение частоты работы SPI
SPCR |= ((1<<SPE)|(1<<MSTR));
// SPE - включение SPI; MSTR - режим "мастер"
// SPR1 и SPR0 по умолчанию равны 0: частота /4 -> 16 МГц/4 = 4 МГц
SPCR &= ~(1<<CPOL);
SPCR &= ~(1<<CPHA);
DDRB |= ((1<<MOSI_BIT)|(1<<SCK_BIT)); // MOSI, SCK - выход
DDRB |= ((1<<RES_BIT)|(1<<DC_BIT)); // RES, DC - выход
DDRB |= (1<<CS_BIT); // CS - выход
MOSI_H; // в 1
SCK_H; // в 1
DISP_Mode_Data; // в 1 (режим работы с данными)
DISP_Reset_OFF; // в 1 (нормальная работа)
DISP_Disable; // в 1 (дисплей неактивен)
}
#ifndef ST7789V_H
#define ST7789V_H
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define SLPOUT 0x11 // Sleep Out (p. 184)
//#define FRCTRL1 0xB1 // Frame Rate Control 1 (p. 264)
#define INVOFF 0x20 // Display Inversion Off - 188
#define INVON 0x21 // Display Inversion ON - 188
#define MADCTL 0x36 // Memory Data Access Control - 215
#define COLMOD 0x3A // Interface Pixel Format - 224
#define CASET 0x2A // Column Address Set - 198
#define RASET 0x2B // Row Address Set - 200
#define NORON 0x13 // Normal Display Mode On - 187
#define DISPON 0x29 // Display On - 196
#define RAMWR 0x2C // Memory Write - 202
#define SWRESET 0x01 // Software Reset - 163
void Init_ST7789V(void); // Функция инициализации дисплея
void ST7789V_fill_screen(uint16_t color);
void ST7789V_draw_pixel(int16_t x, int16_t y, uint16_t color);
#endif
#include <stdbool.h>
#include <avr/io.h>
#define F_CPU 16000000UL // 8 MHz
#include <util/delay.h> // для задержки
#include "ST7789V.h"
#include "SPI.h"
void Write(unsigned char mode, char data) { // передача данных в дисплей
// mode: данные - 1; команда - 0
if (mode) {DISP_Mode_Data;} // в 1 - режим передачи данных
else {DISP_Mode_Command;} // в 0 - режим передачи команд
SPDR = data; // передача информации
while(!(SPSR & (1<<SPIF))); // ожидание окончания передачи информации
}
void Init_ST7789V(void) { // инициализация дисплея
DISP_Enable; // в 0 - дисплей активен
PORTD &= ~(1<<PORTD1);
DISP_Reset_ON; _delay_ms(50); // в 0 - сброс дисплея (аппаратный) и задержка 50 мс
DISP_Reset_OFF; _delay_ms(120); // в 1 - нормальная работа
// задержка 120 мс (с. 48, 49)
// после этого Sleep in / Normal display mode on / Idle mode off (с.139)
Write(0, SWRESET); _delay_ms(120); // 0x01 - программный RESET задержка 120 мс (с. 163)
Write(0, SLPOUT); _delay_ms(120); // 0x11 - выход из режима сна и задержка в 120 мс (с. 184)
Write(0, COLMOD); // 0x3A - формат вывода изображения
Write(1, 0x05); // (с. 224)
// 0101 - 65K of RGB interface?
// 0101 - 16bit/pixel
Write(0, MADCTL); // 0x36 - управление способом отображения информации
Write(1, 0x14); // 0b00010100); // (с. 215)
// MY-0 (сверху вниз), MX-0 (слева направо)
// MV-0 (нормальный режим адресации страниц/столбцов), ML-1 (обновление снизу вверх)
// RGB-0 (формат RGB, а не BGR), MH-1 (обновление справа налево)
Write(0, CASET); // 0x2A - установка адресации столбцов
Write(1, 0x00); Write(1, 0x00); // слева - от 0
Write(1, 0x00); Write(1, 0x86); // справа - до 0x86 - 134
Write(0, RASET); // 0x2B - установка адресации строк
Write(1, 0x00); Write(1, 0x00); // слева - от 0
Write(1, 0x00); Write(1, 0x86); // справа - до 0xEF - 239
Write(0, INVON); // 0x20 - отключить инверсию цвета
Write(0, NORON); // 0x13 - нормальный режим работы дисплея (с. 187)
Write(0, DISPON); // 0x29 - включение дисплея
DISP_Disable; // в 1 - дисплей неактивен
}
void ST7789V_fill_screen(uint16_t color) {
DISP_Enable;
Write(0, RAMWR); // 0x2C
for(uint16_t counter = 0; counter < (128*128); counter++) {
Write(1, color >> 8);
Write(1, color);
}
DISP_Disable;
}
void ST7789V_draw_pixel(int16_t x, int16_t y, uint16_t color) {
DISP_Enable;
Write(0, CASET);
Write(1, x >> 8); Write(1, x);
Write(1, (x + 1) >> 8); Write(1, x + 1);
Write(0, RASET);
Write(1, y >> 8); Write(1, y);
Write(1, (y + 1) >> 8); Write(1, y + 1);
Write(0, RAMWR);
Write(1, color >> 8);
Write(1, color);
DISP_Disable;
}
#include <avr/io.h>
#include "SPI.h"
#include "ST7789V.h"
#define F_CPU 16000000UL // 16 MHz
#include <util/delay.h> // для задержки
int main(void){
_delay_us(1000000); // задержка
InitSPI();
Init_ST7789V();
//ST7789V_draw_pixel(2, 2, RED);
ST7789V_fill_screen(YELLOW);
while (1) {
}
}
Вт июн 01, 2021 12:36:46
void InitSPI(void) { // настройка SPI
#if(SPItype)
SPSR |= (1<<SPI2X); // удвоение частоты работы SPI
SPCR = 0b01011000;
// 0101: SPE - включение SPI; MSTR - режим "мастер"; 11: CPOL и CPHA
// 00: SPR1 и SPR0 по умолчанию равны 0: частота /4 -> 16 МГц/4 = 4 МГц
// до этого запускался при 11: CPOL и CPHA. Теперь работает при 10...
// другие комбинации CPOL и CPHA - зависает
#endif
DDRB |= ((1<<MOSI_BIT)|(1<<SCK_BIT)); // MOSI, SCK - выход
DDRB |= ((1<<RES_BIT)|(1<<DC_BIT)); // RES, DC - выход
DDRB |= (1<<CS_BIT); // CS - выход
MOSI_H; // в 1
SCK_H; // в 1
DISP_Mode_Data; // в 1 (режим работы с данными)
DISP_Reset_OFF; // в 1 (нормальная работа)
DISP_Disable; // в 1 (дисплей неактивен)
}
void Write(unsigned char mode, unsigned char data) { // передача данных в дисплей
// mode: данные - 1; команда - 0
//DISP_Enable; // дисплей активен
if (mode == 1) {DISP_Mode_Data;} // в 1 - режим передачи данных
else {DISP_Mode_Command;} // в 0 - режим передачи команд
#if(SPItype)
SPDR = data; // передача информации
while(!(SPSR & (1<<SPIF))); // ожидание окончания передачи информации
#else
// SCK ??|__||??|__||??|__||??
// MOSI ???????|______|_______
// . 1 . 0 . 0 .
// Моя ошибка в том, что оставил код от OLED-дисплея, где сначала было
// SCK_H, а потом SCK_L. Инициализация проходила, но дисплей был чёрным.
unsigned char i;
SCK_H;
for(i = 0; i < 8; i++) {
if(( (data >> (7-i) ) & 1) == 1) {MOSI_H;} else {MOSI_L;}
SCK_L; asm("nop"); SCK_H;
}
#endif
// DISP_Disable; // дисплей неактивен
}
void Init_ST7789V(void) { // инициализация дисплея
DISP_Enable; // в 0 - дисплей активен
PORTD &= ~(1<<PORTD1);
DISP_Reset_ON; _delay_ms(50); // в 0 - сброс дисплея (аппаратный) и задержка 5 мкс
DISP_Reset_OFF; _delay_ms(120); // в 1 - нормальная работа
// задержка 120 мс (с. 48, 49)
// после этого Sleep in / Normal display mode on / Idle mode off (с.139)
PORTD |= (1<<PORTD1);
Write(0, SWRESET); _delay_ms(120); // 0x01 - программный RESET задержка 120 мс (с. 163)
PORTD &= ~(1<<PORTD0);
Write(0, SLPOUT); // 0x11 - выход из режима сна
// =========
// Сюда при аппаратном SPI доходит редко
// =========
_delay_ms(120); // задержка в 120 мс (с. 184)
PORTD |= (1<<PORTD0);
Write(0, COLMOD); // 0x3A - формат вывода изображения
Write(1, 0x55); // (с. 224)
// 0101 - 65K of RGB interface
// 0101 - 16bit/pixel
Write(0, MADCTL); // 0x36 - управление способом отображения информации
Write(1, 0b00000000); // 0x14); (с. 215)
// MY / MX / MV / ML / RGB / MH
// MY-0 (0-вверх, 1-вниз),
// MX-0 (0-вправо, 1-влево)
// MV-0 (0-нормальный режим,1-инверсный),
// ML-0 (0-обновление вниз,1-вверх)
// RGB-0 (0-формат RGB, 1-BGR),
// MH-0 (0-обновление вправо,1-влево)
Write(0, CASET); // установка адресации столбцов
Write(1, 0x00); Write(1, 0x00); // слева - от 0
Write(1, 0x00); Write(1, COLUMN-1); // справа - до 128 0x86 - 134
Write(0, RASET); // установка адресации строк
Write(1, 0x00); Write(1, 0x00); // слева - от 0
Write(1, 0x00); Write(1, ROW-1); // справа - до 128 0xEF - 239
Write(0, INVON); // 0x20 - отключить инверсию цвета
Write(0, NORON); // 0x13 - нормальный режим работы дисплея (с. 187)
Write(0, DISPON); // 0x29 - включение дисплея
//DISP_Disable; // в 1 - дисплей неактивен
}
Ср июн 02, 2021 00:12:33
void Write(unsigned char mode, unsigned char data) { // передача данных в дисплей
// mode: данные - 1; команда - 0
if (mode == 1) {DISP_Mode_Data;} // в 1 - режим передачи данных
else {DISP_Mode_Command;} // в 0 - режим передачи команд
SCK_H;
DISP_Enable; // дисплей активен
SPDR = data;
while(!(SPSR & (1<<SPIF)));
DISP_Disable; // дисплей неактивен
}
void InitSPI(void) { // настройка SPI
#if(SPItype)
SPSR |= (1<<SPI2X); // удвоение частоты работы SPI
SPCR = 0b01010000;
// 0101: SPE - включение SPI; MSTR - режим "мастер"; 00: CPOL,CPHA - любые
// 00: SPR1 и SPR0 по умолчанию равны 0: частота /4 -> 16 МГц/4 = 4 МГц
#endif
DDRB |= ((1<<MOSI_BIT)|(1<<SCK_BIT)); // MOSI, SCK - выход
DDRB |= ((1<<RES_BIT)|(1<<DC_BIT)); // RES, DC - выход
DDRB |= (1<<CS_BIT); // CS - выход
MOSI_H; // в 1
SCK_H; // в 1
DISP_Mode_Data; // в 1 (режим работы с данными)
DISP_Reset_OFF; // в 1 (нормальная работа)
DISP_Disable; // в 1 (дисплей неактивен)
}
uint8_t SPInit = 0; // при инициализации будет программный SPI
void Write(unsigned char mode, unsigned char data) { // передача данных в дисплей
// mode: данные - 1; команда - 0
if (mode == 1) {DISP_Mode_Data;} // в 1 - режим передачи данных
else {DISP_Mode_Command;} // в 0 - режим передачи команд
SCK_H;
DISP_Enable; // дисплей активен
if(SPInit == 0) {
SPDR = data; // передача информации
while(!(SPSR & (1<<SPIF)));
} else {
// SCK ??|__||??|__||??|__||??
// MOSI ???????|______|_______
// . 1 . 0 . 0 .
// Моя ошибка в том, что оставил код от OLED-дисплея, где сначала было
// SCK_H, а потом SCK_L. Инициализация проходила, но дисплей был чёрным.
// Хотя здесь - с. 56 - SDA is sampled at the rising edge of SCL
unsigned char i;
for(i = 0; i < 8; i++) {
if(( (data >> (7-i) ) & 1) == 1) {MOSI_H;} else {MOSI_L;}
SCK_L; asm("nop"); SCK_H;
}
}
DISP_Disable; // дисплей неактивен
}
void HDRESET(void){
DISP_Reset_ON; _delay_us(5); // в 0 - сброс дисплея (аппаратный) и задержка 5 мкс
DISP_Reset_OFF; _delay_ms(120); // в 1 - нормальная работа
// задержка 120 мс (с. 48, 49)
// после этого Sleep in / Normal display mode on / Idle mode off (с.139)
}
void Init_ST7789V(void) { // инициализация дисплея
SPInit = 1;
SPSR = 0;
SPCR = 0;
DISP_Enable; // в 0 - дисплей активен
PORTD &= ~(1<<PORTD1);
HDRESET();
PORTD |= (1<<PORTD1);
// Write(0, SWRESET); _delay_ms(120); // 0x01 - программный RESET задержка 120 мс (с. 163)
PORTD &= ~(1<<PORTD0);
Write(0, SLPOUT); _delay_ms(120); // 0x11 - выход из режима сна и задержка в 120 мс (с. 184)
Write(0, COLMOD); // 0x3A - формат вывода изображения
PORTD |= (1<<PORTD0); // <------- Сюда при аппартаном SPI доходит редко
Write(1, 0x55); // (с. 224)
// 0101 - 65K of RGB interface
// 0101 - 16bit/pixel
Write(0, MADCTL); // 0x36 - управление способом отображения информации
Write(1, 0b00000000); // 0x14); (с. 215)
// MY / MX / MV / ML / RGB / MH
// MY-0 (0-вверх, 1-вниз),
// MX-0 (0-вправо, 1-влево)
// MV-0 (0-нормальный режим,1-инверсный),
// ML-0 (0-обновление вниз,1-вверх)
// RGB-0 (0-формат RGB, 1-BGR),
// MH-0 (0-обновление вправо,1-влево)
Write(0, INVON); // 0x21 - включить инверсию цвета
Write(0, NORON); // 0x13 - нормальный режим работы дисплея (с. 187)
Write(0, DISPON); // 0x29 - включение дисплея
SPInit = 0;
SPSR |= (1<<SPI2X); // удвоение частоты работы SPI
SPCR = 0b01010000;
}