Cepгeй Бopщ (29.03.2012 13:33 - 13:45, просмотров: 125) ответил FDA на А описание функции I2C.write можете скинуть? В принципе, я всё сделал - текст, точки, линии, окружности и т.п. у меня выводятся, но вот хочется немного соптимизировать. Небольшой затык у меня появился здесь:
Да, и не будет работать. Там же одно из двух - либо контрольный байт с взведенным c0 и потом один байт, следом новый контрольный байт и т.д. Либо контрольный байт со сброшенным c0 и все остальное до стопа будет интерпретировано как команда или данные. Т.е. проще посылать команды/данные, разделяя их стопом.
Думаю, что в вашем случае надо было бы делать так (но сам я такое не пробовал):StartI2C();
PutI2C(LCD_ADDR);
PutI2C(0b10000000);
PutI2C(SET_X | addr);
PutI2C(0b10000000);
PutI2C(SET_Y | page);
PutI2C(0b01000000);
PutI2C(b);
StopI2C(); Да, наверное так будет быстрее. Меня скорость не сильно беспокоила, поэтому я делал по вашему первому варианту - получилось короче. Рисовал в ОЗУ и после рисования обновлял прямоугольную область экрана.
I2C.write() работала через DMA на MSP430, в ее исходниках мало что видно. А делала она вот такое:
bool i2c_t<address, module, channel>::write(uint8_t ctrl, void const *pBuffer, uint16_t size)
{
uint8_t const * pSrc = (uint8_t const *)pBuffer;
StartI2C();
PutI2C(LCD_ADDR);
PutI2C(ctrl);
for(uint_fast16_t i = 0; i < size; ++i)
PutI2C(*pSrc++);
StopI2C();
}