Код: Выделить всё
/*
* ssd1963.h
*
* Created: 03.08.2016 19:19:29
* Author: Dmitriy
*/
#ifndef SSD1963_H_
#define SSD1963_H_
#include <avr/io.h>
#include <avr/delay.h>
#define D7 PORTA //так данные передаются по 16 битной шине,
#define D0 PORTC //под это дело мы используем два порта
#define COMMAND_PORT PORTD //управляющий порт
#define DDRD0 DDRA
#define DDRD7 DDRC
#define DDRCOMMAND_PORT DDRD
#define lcd_res 0 //(active - 0) сброс графического контроллера.
#define lcd_dc 1 //так же может называться Register Select (comm - 0; data - 1)
#define lcd_cs 2 //(chip_select_active - 0) активация/дезактивация графического дисплея.
#define lcd_rd 3 //(read_active - 0) строб чтения данных/параметров.
#define lcd_wr 4 //(write_active - 0) строб записи данных/команд.
//#define TFT320240
#define TFT800480
//#define TFT640480
//#define TFTCUSTOM
//=======================
// All numeric constants with "ULL" suffix !
//=======================
#define TFT_FPS 60ULL
#ifdef TFTCUSTOM
#define TFT_WIDTH 0ULL
#define TFT_HSYNC_BACK_PORCH 0ULL
#define TFT_HSYNC_FRONT_PORCH 0ULL
#define TFT_HSYNC_PULSE 0ULL
#define TFT_HEIGHT 0ULL
#define TFT_VSYNC_BACK_PORCH 0ULL
#define TFT_VSYNC_FRONT_PORCH 0ULL
#define TFT_VSYNC_PULSE 0ULL
#endif
#ifdef TFT320240
#define TFT_WIDTH 320ULL
#define TFT_HSYNC_BACK_PORCH 40ULL
#define TFT_HSYNC_FRONT_PORCH 20ULL
#define TFT_HSYNC_PULSE 28ULL
#define TFT_HEIGHT 240ULL
#define TFT_VSYNC_BACK_PORCH 17ULL
#define TFT_VSYNC_FRONT_PORCH 4ULL
#define TFT_VSYNC_PULSE 3ULL
#endif
#ifdef TFT800480
#define TFT_WIDTH 800ULL
#define TFT_HSYNC_BACK_PORCH 30LL
#define TFT_HSYNC_FRONT_PORCH 0ULL
#define TFT_HSYNC_PULSE 0ULL
#define TFT_HEIGHT 480ULL
#define TFT_VSYNC_BACK_PORCH 10ULL
#define TFT_VSYNC_FRONT_PORCH 0ULL
#define TFT_VSYNC_PULSE 0ULL
#endif
#ifdef TFT640480
#define TFT_WIDTH 640ULL
#define TFT_HSYNC_BACK_PORCH 56ULL
#define TFT_HSYNC_FRONT_PORCH 8ULL
#define TFT_HSYNC_PULSE 96ULL
#define TFT_HEIGHT 480ULL
#define TFT_VSYNC_BACK_PORCH 41ULL
#define TFT_VSYNC_FRONT_PORCH 2ULL
#define TFT_VSYNC_PULSE 2ULL
#endif
#define TFT_HSYNC_PERIOD (TFT_HSYNC_PULSE + TFT_HSYNC_BACK_PORCH + TFT_WIDTH + TFT_HSYNC_FRONT_PORCH)
#define TFT_VSYNC_PERIOD (TFT_VSYNC_PULSE + TFT_VSYNC_BACK_PORCH + TFT_HEIGHT + TFT_VSYNC_FRONT_PORCH)
#define TFT_PCLK (TFT_HSYNC_PERIOD * TFT_VSYNC_PERIOD * TFT_FPS)
//#define TFT_PCLK (928 * 525 * 60)
#define LCD_FPR ((TFT_PCLK * 1048576)/100000000)
#define mHIGH(x) (x >> 8)
#define mLOW(x) (x & 0xFF)
//=======================
// SSD1963 commands
//=======================
#define SSD1963_NOP 0x00
#define SSD1963_SOFT_RESET 0x01
#define SSD1963_GET_POWER_MODE 0x0A
#define SSD1963_GET_ADDRESS_MODE 0x0B
#define SSD1963_GET_DISPLAY_MODE 0x0D
#define SSD1963_GET_TEAR_EFFECT_STATUS 0x0E
#define SSD1963_ENTER_SLEEP_MODE 0x10
#define SSD1963_EXIT_SLEEP_MODE 0x11
#define SSD1963_ENTER_PARTIAL_MODE 0x12
#define SSD1963_ENTER_NORMAL_MODE 0x13
#define SSD1963_EXIT_INVERT_MODE 0x20
#define SSD1963_ENTER_INVERT_MODE 0x21
#define SSD1963_SET_GAMMA_CURVE 0x26
#define SSD1963_SET_DISPLAY_OFF 0x28
#define SSD1963_SET_DISPLAY_ON 0x29
#define SSD1963_SET_COLUMN_ADDRESS 0x2A
#define SSD1963_SET_PAGE_ADDRESS 0x2B
#define SSD1963_WRITE_MEMORY_START 0x2C
#define SSD1963_READ_MEMORY_START 0x2E
#define SSD1963_SET_PARTIAL_AREA 0x30
#define SSD1963_SET_SCROLL_AREA 0x33
#define SSD1963_SET_TEAR_OFF 0x34
#define SSD1963_SET_REAR_ON 0x35
#define SSD1963_SET_ADDRESS_MODE 0x36
#define SSD1963_SET_SCROLL_START 0x37
#define SSD1963_EXIT_IDLE_MODE 0x38
#define SSD1963_ENTER_IDLE_MODE 0x39
#define SSD1963_WRITE_MEMORY_CONTINUE 0x3C
#define SSD1963_READ_MEMORY_CONTINUE 0x3E
#define SSD1963_SET_TEAR_SCANLINE 0x44
#define SSD1963_GET_SCANLINE 0x45
#define SSD1963_READ_DDB 0xA1
#define SSD1963_SET_LCD_MODE 0xB0
#define SSD1963_GET_LCD_MODE 0xB1
#define SSD1963_SET_HORI_PERIOD 0xB4
#define SSD1963_GET_HORI_PERIOD 0xB5
#define SSD1963_SET_VERT_PERIOD 0xB6
#define SSD1963_GET_VERT_PERIOD 0xB7
#define SSD1963_SET_GPIO_CONF 0xB8
#define SSD1963_GET_GPIO_CONF 0xB9
#define SSD1963_SET_GPIO_VALUE 0xBA
#define SSD1963_GET_GPIO_STATUS 0xBB
#define SSD1963_SET_POST_PROC 0xBC
#define SSD1963_GET_POST_PROC 0xBD
#define SSD1963_SET_PWM_CONF 0xBE
#define SSD1963_GET_PWM_CONF 0xBF
#define SSD1963_GET_LCD_GEN0 0xC0
#define SSD1963_SET_LCD_GEN0 0xC1
#define SSD1963_GET_LCD_GEN1 0xC2
#define SSD1963_SET_LCD_GEN1 0xC3
#define SSD1963_GET_LCD_GEN2 0xC4
#define SSD1963_SET_LCD_GEN2 0xC5
#define SSD1963_GET_LCD_GEN3 0xC6
#define SSD1963_SET_LCD_GEN3 0xC7
#define SSD1963_SET_GPIO0_ROP 0xC8
#define SSD1963_GET_GPIO0_ROP 0xC9
#define SSD1963_SET_GPIO1_ROP 0xCA
#define SSD1963_GET_GPIO1_ROP 0xCB
#define SSD1963_SET_GPIO2_ROP 0xCC
#define SSD1963_GET_GPIO2_ROP 0xCD
#define SSD1963_SET_GPIO3_ROP 0xCE
#define SSD1963_GET_GPIO3_ROP 0xCF
#define SSD1963_SET_DBC_CONF 0xD0
#define SSD1963_GET_DBC_CONF 0xD1
#define SSD1963_SET_DBC_TH 0xD4
#define SSD1963_GET_DBC_TH 0xD5
#define SSD1963_SET_PLL 0xE0
#define SSD1963_SET_PLL_MN 0xE2
#define SSD1963_GET_PLL_MN 0xE3
#define SSD1963_GET_PLL_STATUS 0xE4
#define SSD1963_SET_DEEP_SLEEP 0xE5
#define SSD1963_SET_LSHIFT_FREQ 0xE6
#define SSD1963_GET_LSHIFT_FREQ 0xE7
#define SSD1963_SET_PIXEL_DATA_INTERFACE 0xF0
#define SSD1963_PDI_8BIT 0
#define SSD1963_PDI_12BIT 1
#define SSD1963_PDI_16BIT 2
#define SSD1963_PDI_16BIT565 3
#define SSD1963_PDI_18BIT 4
#define SSD1963_PDI_24BIT 5
#define SSD1963_PDI_9BIT 6
#define SSD1963_GET_PIXEL_DATA_INTERFACE 0xF1
void SSD1963_WriteCommand(unsigned int commandToWrite);
void SSD1963_WriteData(unsigned int dataToWrite);
void SSD1963_Init (void);
void SSD1963_SetArea(unsigned int sx, unsigned int ex, unsigned int sy, unsigned int ey);
void SSD1963_FillArea(unsigned int sx, unsigned int ex, unsigned int sy, unsigned int ey, int color);
void SSD1963_ClearScreen(unsigned long color);
void GLCD_SetPixel(int x, int y, int color);
#endif /* SSD1963_H_ */
Код: Выделить всё
/*
* ssd1963.c
*
* Created: 03.08.2016 19:19:09
* Author: Dmitriy
*/
#include "ssd1963.h";
//=======================
// Write command to SSD1963
//=======================
void SSD1963_WriteCommand(unsigned int commandToWrite)
{
COMMAND_PORT &= ~(1<<lcd_dc); //режим передачи команды
COMMAND_PORT |= (1<<lcd_rd);
COMMAND_PORT &= ~(1<<lcd_cs); //активируем чип
D0 = (commandToWrite & 0X00FF); //через D0 шлем младший байт
D7 = (commandToWrite & 0XFF00)>>8; //затем через D7 старший
COMMAND_PORT &= ~(1<<lcd_wr); //теперь стробируем битом записи
_delay_us(5);
COMMAND_PORT |= (1<<lcd_wr);
COMMAND_PORT |= (1<<lcd_cs); //деактивируем чип
}
//=======================
// Write data to SSD1963
//=======================
void SSD1963_WriteData(unsigned int dataToWrite)
{
COMMAND_PORT |= (1<<lcd_dc) ; //режим передачи данных
COMMAND_PORT |= (1<<lcd_rd);
COMMAND_PORT &= ~(1<<lcd_cs); //активируем чип
D0 = (dataToWrite & 0X00FF); //через D0 шлем младший байт
D7 = (dataToWrite & 0XFF00)>>8; //затем через D7 старший
COMMAND_PORT &= ~(1<<lcd_wr); //теперь стробируем битом записи
_delay_us(5);
COMMAND_PORT |= (1<<lcd_wr);
COMMAND_PORT |= (1<<lcd_cs); //деактивируем чип
}
//=======================
// функция инициализации
//=======================
void SSD1963_Init (void)
{
DDRD0 = 0xFF; //инициализируем порты на вывод
DDRD7 = 0xFF;
DDRCOMMAND_PORT = 0xFF;
COMMAND_PORT = 0x00;
D0 = 0x00;
D7 = 0x00;
_delay_us(200);
COMMAND_PORT &= ~(1<<lcd_res);
_delay_us(10);
COMMAND_PORT |= (1<<lcd_res);
_delay_us(10);
SSD1963_WriteCommand(SSD1963_SOFT_RESET); // записать команду софтрезет.
SSD1963_WriteCommand(SSD1963_SET_PLL_MN); // Настраиваем ФАПЧ
SSD1963_WriteData(49); // PLLclk = REFclk * 50 (500MHz)
SSD1963_WriteData(4); // SYSclk = PLLclk / 5 (100MHz)
SSD1963_WriteData(4); // dummy
SSD1963_WriteCommand(SSD1963_SET_PLL); // Запустить ФАПЧ
SSD1963_WriteData(0x01); // запустить PLL, PLL выключен
_delay_us(100);
SSD1963_WriteCommand(SSD1963_SET_PLL);
SSD1963_WriteData(0x03); // Запустить PLL, Включить PLL
SSD1963_WriteCommand(SSD1963_SET_LCD_MODE);
SSD1963_WriteData(0x0C); // 1 параметр 18 бит, отключить сглаживание, включить TFT FRC, работа по переднему фронту, горизонтальная синхронизация активный 0, вертикальная синхронизация, активный 0.
SSD1963_WriteData(0x00); //2 параметр tft mode
SSD1963_WriteData(mHIGH((TFT_WIDTH-1))); // 3 параметр старший байт размера по горизонтали
SSD1963_WriteData(mLOW((TFT_WIDTH-1))); // 4 параметр младший байт размера по горизонтали
SSD1963_WriteData(mHIGH((TFT_HEIGHT-1))); // 5 параметр старший байт размера по вертикали
SSD1963_WriteData(mLOW((TFT_HEIGHT-1))); // 6 параметр младший байт размера по вертикали
SSD1963_WriteData(0b000000); //
SSD1963_WriteCommand(SSD1963_SET_PIXEL_DATA_INTERFACE);
SSD1963_WriteData(SSD1963_PDI_16BIT565);
SSD1963_WriteCommand(SSD1963_SET_LSHIFT_FREQ);
SSD1963_WriteData((LCD_FPR >> 16) & 0xFF);
SSD1963_WriteData((LCD_FPR >> 8) & 0xFF);
SSD1963_WriteData(LCD_FPR & 0xFF);
SSD1963_WriteCommand(SSD1963_SET_HORI_PERIOD);
SSD1963_WriteData(mHIGH(TFT_HSYNC_PERIOD));
SSD1963_WriteData(mLOW(TFT_HSYNC_PERIOD));
SSD1963_WriteData(mHIGH((TFT_HSYNC_PULSE + TFT_HSYNC_BACK_PORCH)));
SSD1963_WriteData(mLOW((TFT_HSYNC_PULSE + TFT_HSYNC_BACK_PORCH)));
SSD1963_WriteData(TFT_HSYNC_PULSE);
SSD1963_WriteData(0x00);
SSD1963_WriteData(0x00);
SSD1963_WriteData(0x00);
SSD1963_WriteCommand(SSD1963_SET_VERT_PERIOD);
SSD1963_WriteData(mHIGH(TFT_VSYNC_PERIOD));
SSD1963_WriteData(mLOW(TFT_VSYNC_PERIOD));
SSD1963_WriteData(mHIGH((TFT_VSYNC_PULSE + TFT_VSYNC_BACK_PORCH)));
SSD1963_WriteData(mLOW((TFT_VSYNC_PULSE + TFT_VSYNC_BACK_PORCH)));
SSD1963_WriteData(TFT_VSYNC_PULSE);
SSD1963_WriteData(0x00);
SSD1963_WriteData(0x00);
SSD1963_WriteCommand(SSD1963_SET_DISPLAY_ON); //SET display on
}
void SSD1963_SetArea(unsigned int sx, unsigned int ex, unsigned int sy, unsigned int ey)
{
SSD1963_WriteCommand(SSD1963_SET_COLUMN_ADDRESS);
SSD1963_WriteData((sx >> 8) & 0xFF);
SSD1963_WriteData((sx >> 0) & 0xFF);
SSD1963_WriteData((ex >> 8) & 0xFF);
SSD1963_WriteData((ex >> 0) & 0xFF);
SSD1963_WriteCommand(SSD1963_SET_PAGE_ADDRESS);
SSD1963_WriteData((sy >> 8) & 0xFF);
SSD1963_WriteData((sy >> 0) & 0xFF);
SSD1963_WriteData((ey >> 8) & 0xFF);
SSD1963_WriteData((ey >> 0) & 0xFF);
}
//=======================
// Fill area of specified color
//=======================
void SSD1963_FillArea(unsigned int sx, unsigned int ex, unsigned int sy, unsigned int ey, int color)
{
int i;
SSD1963_SetArea(sx, ex, sy, ey);
SSD1963_WriteCommand(SSD1963_WRITE_MEMORY_START);
for(i = 0; i < ((ex-sx+1)*(ey-sy+1)); i++)
{
SSD1963_WriteData(color);
}
}
//=======================
// Fills whole screen specified color
//=======================
void SSD1963_ClearScreen(unsigned long color)
{
unsigned int x,y;
SSD1963_SetArea(0, TFT_WIDTH-1 , 0, TFT_HEIGHT-1);
SSD1963_WriteCommand(0x2c);
for(x=0;x<TFT_WIDTH;x++)
{
for(y= 0;y<TFT_HEIGHT;y++)
{
SSD1963_WriteData(color);
}
}
}
//=======================
//
//=======================
void GLCD_SetPixel(int x, int y, int color)
{
SSD1963_SetArea(x, x, y, y);
SSD1963_WriteCommand(0x2c);
SSD1963_WriteData(color);
SSD1963_WriteCommand(0x0);
}
//=======================
//
//=======================
вот на основе разных интернет-ресурсов накидал код.
функция main:
Код: Выделить всё
int main(void)
{
SSD1963_Init ();
_delay_ms(1000);
SSD1963_FillArea(50, 60, 60, 60, 0xff0CA);
/* Replace with your application code */
while (1) {
}
}
в итоге после инициализации дисплея чуть чуть светлее становится фон, ничего не происходит. Такое впечатление, что работает только подсветка.