Странная работа функций cbi и sbi

ustas
Offline
Зарегистрирован: 12.03.2012

Сейчас есть задачка подключить хорошо известный, доступный и дешевый дисплейчик от нокиа 5110 (он же 3310, например тут: http://devicter.ru/goods/Nokia-5110-LCD?from=ZmNk). В общем, ничего особенного, но одно условие, которое наваязано "окружением" - нужно использовать аппаратный SPI.

Корректирую библиотеку http://henningkarlsen.com/electronics/library.php?id=48 (достаточно скорректировать всего одну ключевую функцию):

// закомментаренные вещи не нужны для SPI (пины уже определены самим аппаратным SPI)
LCD5110::LCD5110(/*int SCK, int MOSI, */int DC, int RST, int CS)
{ 
	//P_SCK	= portOutputRegister(digitalPinToPort(SCK));
	//B_SCK	= digitalPinToBitMask(SCK);
	//P_MOSI	= portOutputRegister(digitalPinToPort(MOSI));
	//B_MOSI	= digitalPinToBitMask(MOSI);
	P_DC	= portOutputRegister(digitalPinToPort(DC));
	B_DC	= digitalPinToBitMask(DC);
	P_RST	= portOutputRegister(digitalPinToPort(RST));
	B_RST	= digitalPinToBitMask(RST);
	P_CS	= portOutputRegister(digitalPinToPort(CS));
	B_CS	= digitalPinToBitMask(CS);
	//pinMode(SCK,OUTPUT);
	//pinMode(MOSI,OUTPUT);
	pinMode(DC,OUTPUT);
	pinMode(RST,OUTPUT);
	pinMode(CS,OUTPUT);
	SCK_Pin=SCK;
	RST_Pin=RST;
}

void LCD5110::_LCD_Write(unsigned char data, unsigned char mode)
{   
	if (mode==LCD_COMMAND)
		//cbi(P_DC, B_DC);
		digitalWrite(5, 0);
	else
		//sbi(P_DC, B_DC);
		digitalWrite(5, 1);

    cbi(P_CS, B_CS);
    
// убираем следующий кусок 
/*
	for (unsigned char c=0; c<8; c++)
	{
		if (data & 0x80)
			sbi(P_MOSI, B_MOSI);
		else
			cbi(P_MOSI, B_MOSI);
		data = data<<1;
		pulseClock;
	}
*/	
// и заменяем на одну строчку
	SPI.transfer(data);

	sbi(P_CS, B_CS);
}

В этом виде - работает (причем, даже на глаз заметно, что работает существенно быстрее), но тут фигурируют digitalWrite(5, 1); и в явном виде указано, на каком пине и что сделать. Функции, которые закомментированы над этими строчками (cbi и sbi, соответствено) - почему-то не работают (или работают, но дисплей не отрабатывает).

платка - нано 328, на 5 пин (который в абзаце выше фигурирует) - подключен вход DC дисплейчика (LOW - команда, HIGH - данные)

если раскоментировать вызовы cbi, sbi и убрать digitalWrite - на дисплее ничего не просиходит. Если наоборот - работает.

Оригинальная библиотека с софтверной реализацией SPI с вызовом исходных cbi и sbi - работает (конфигурация по пинам - идентичная).

Почему? Как заставить работать?

toc
Offline
Зарегистрирован: 09.02.2013

я недавно пробовал библиотеку от adafruit. Пример работает, цветочки и прочие картинки рисует. Она тоже использует софт-spi ?