Вс сен 18, 2016 18:30:22
Вс сен 18, 2016 20:08:08
Вс сен 18, 2016 20:30:58
Вс сен 18, 2016 20:35:00
Вс сен 18, 2016 21:48:54
Да. И исходники смотрел. Вполне себе нормально-читабельный код. И не важно под какой он МК, всё упирается всего-лишь в модуль SPI (настройка, отправка байта). Для своего МК подправить - нет проблем.Dr. Alex писал(а):А вы сами эти статьи смотрели?
Пн сен 19, 2016 06:26:14
Вт сен 20, 2016 08:32:48
Вт сен 20, 2016 09:34:20
Вт сен 20, 2016 09:49:13
Сб сен 24, 2016 07:02:25
void LCD_Init(void) {
LCD_PORT |= (1<<RESET_PIN);
send_cmd(0xAE); // Display OFF
// multiplex ratio
send_cmd(0xA8);
send_cmd(0x3F);
// display offset
send_cmd(0xD3);
send_cmd(0x00);
// set display startline(64)
send_cmd(0x40);
// segment remap(col.127 mapped to SEG0)
send_cmd(0xA1);
// set COM output scan direction
send_cmd(0xC8);
// set addressiing mode is "horisontal"
send_cmd(0x20);
send_cmd(0x00);
// set COM pins hardware configuration
send_cmd(0xDA);
send_cmd(0x12);
// pre-charge period
send_cmd(0xD9);
send_cmd(0xE1);
// set VCOMH deselect level
// Brightness
send_cmd(0xDB);
send_cmd(0x10);
// contrast control
send_cmd(0x81); // Set contrast cmd
send_cmd(0x01); // Contrast value
// set entire display ON/OFF
send_cmd(0xA4);
// set normal,inverse display
send_cmd(0xA6);
send_cmd(0xD5); //clock divide, OSC freq
send_cmd(0xF0);
// enable sharge pump
send_cmd(0x8D);
send_cmd(0x14);
// display ON
send_cmd(0xAF); // Вот здесь появляется "мусор"
};
// Инициализация интерфейса I2C
void I2C_init(void){
PRR0 &= ~(1<<PRTWI); // Разрешаем работу интерфейса TWI
TWBR = TWBR_val;
};
uint8_t I2C_start(uint8_t address){
unsigned int RetryCount = 0; // Счётчик попыток.
TWCR = 0; // reset TWI control register
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // transmit START condition
// wait for end of transmission
while( !(TWCR & (1<<TWINT)) ) // Ждём, пока переферия не сбросит бит занятости.
{
RetryCount++; // Считаем таймер...
if (RetryCount > 20000) break; // Если ждём слишком долго - выход.
};
// check if the start condition was successfully transmitted
if((TWSR & 0xF8) != TW_START){ return 1; }
// load slave address into data register
TWDR = address;
// start transmission of address
TWCR = (1<<TWINT) | (1<<TWEN);
// wait for end of transmission
while( !(TWCR & (1<<TWINT)) )
{
RetryCount++;
if (RetryCount > 20000) break;
};
// check if the device has acknowledged the READ / WRITE mode
uint8_t twst = TW_STATUS & 0xF8;
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
return 0;
};
uint8_t I2C_write(uint8_t data){
unsigned int RetryCount = 0;
// load data into data register
TWDR = data;
// start transmission of data
TWCR = (1<<TWINT) | (1<<TWEN);
// wait for end of transmission
while( !(TWCR & (1<<TWINT)) )
{
RetryCount++;
if (RetryCount > 60000) break;
};
if( (TWSR & 0xF8) != TW_MT_DATA_ACK ){ return 1; }
return 0;
};
uint8_t I2C_read_ack(void){
unsigned int RetryCount = 0;
// start TWI module and acknowledge data after reception
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
// wait for end of transmission
while( !(TWCR & (1<<TWINT)) )
{
RetryCount++;
if (RetryCount > 60000) break;
};
// return received data from TWDR
return TWDR;
};
uint8_t I2C_read_nack(void){
unsigned int RetryCount = 0;
// start receiving without acknowledging reception
TWCR = (1<<TWINT) | (1<<TWEN);
// wait for end of transmission
while( !(TWCR & (1<<TWINT)) )
{
RetryCount++;
if (RetryCount > 60000) break;
};
return TWDR; // return received data from TWDR
};
void I2C_stop(void){
// transmit STOP condition
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
_delay_us(5); // Без этой паузы не получается передать STOP. И в отладке всё становится грустно.
// Самое смешное, что в железе работает нормально.
TWCR = 0;
};
void ssd1306_SendCMD(uint8_t cmd) {
PORTD &= ~1;
I2C_write(cmd);
};
void ssd1306_SendData(uint8_t data) {
PORTD |= 1;
I2C_write(data);
};
Сб сен 24, 2016 12:55:56
Сб сен 24, 2016 13:23:35
Сб сен 24, 2016 13:34:24
Сб сен 24, 2016 13:38:08
Сб сен 24, 2016 13:42:17
Сб сен 24, 2016 13:44:51
Сб сен 24, 2016 14:01:09
Сб сен 24, 2016 14:08:20
Сб сен 24, 2016 14:09:51
Сб сен 24, 2016 18:02:55