atmega182 + ssd1963. Помогите их подружить!

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Вт авг 02, 2016 18:14:54

Сообщение Dimka52319 »

всем привет.
Есть контроллер atmega128 (платка от Olimex), есть китайский дисплей с контроллером SSD1963 (4.3 дюйма).
никак не получается их подружить.
PORTA и PORTC я использую как порт данных, PORTD - управляющий порт. (напряжение меги и драйвера согласовал резистивным делителем), на вход драйвера 3.27 В приходят импульсы.
А дальше не знаю с какой стороны подойти к написанию кода.
Может быть у кого-то есть готовые примеры (в интернете особо ничего под AVR не нашел). Буду благодарен, если поделитесь.
Задача пока тривиальная: вывод даты, времени и пару значений на экран. То есть тач, флешку задействовать не планирую.
Реклама
Родился
Сообщения: 2
Зарегистрирован: Вт авг 02, 2016 18:14:54

Сообщение Dimka52319 »

Код: Выделить всё

/*
 * 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) {
	

    }
}
в итоге после инициализации дисплея чуть чуть светлее становится фон, ничего не происходит. Такое впечатление, что работает только подсветка.
Реклама
Ответить

Вернуться в «AVR»