Facebook
From Krzysztof Karolak, 3 Years ago, written in C.
This paste is a reply to Projekt from Krzysztof Karolak - go back
Embed
Viewing differences between Projekt and Re: Projekt
/*
 * I2C.c
 *
 * Created: 11.04.2019 08:39:07
 *  Author: KTM
 */ 

#define F_CPU 16000000L
#include 
#include
#define EEDEVADR 0b10100000
#define ERROR 1
#define SUCCESS (!ERROR)


(!ERROR)
#define D7 7
#define D6 6
#define D5 5
#define D4 4
#define E 3
#define RS 2
#define RW 1
#define SS 2
#define MOSI 3
#define MISO 4
#define SCK 5



5


void lcd_4bity(unsigned char fourbits)
{
  PORTD |= (1<   if( fourbits & 0x01) PORTD |= (1<   if( fourbits & 0x02) PORTD |= (1<   if( fourbits & 0x04) PORTD |= (1<   if( fourbits & 0x08) PORTD |= (1<   PORTD &= ~(1<   
}

void lcd_bajt(unsigned char bajt)
{
  PORTD |= (1<   lcd_4bity(bajt>>4);
  PORTD &= ~(1<   _delay_us(5);
  PORTD |= (1<   lcd_4bity(bajt);
  PORTD &= ~(1<   _delay_ms(1);
  
}


void ini_lcd(void)
{
  lcd_4bity(3);
  _delay_ms(10);
  lcd_4bity(3);
  _delay_ms(1);
  lcd_4bity(3);
  _delay_ms(1);
  lcd_4bity(2);
  _delay_ms(1);
  
  lcd_bajt(28);
  _delay_ms(1);
  lcd_bajt(20);
  _delay_ms(1);
  lcd_bajt(12);
  _delay_ms(1);
  lcd_bajt(6);
  _delay_ms(1);
  lcd_bajt(1);
  _delay_ms(10);
  lcd_bajt(128);
  _delay_ms(5);
  \n  \n}\n\n}



//////// SPI  ///////////

char aData;
char bData;

void SPI_Init(void)
{
  DDRB |= (1<   PORTB &= ~(1<   /* Set MOSI and SCK output, all others input */
  DDRB |= (1<   PORTB |= (1<   /* Enable SPI, Master, set clock rate fck/16 */
  SPCR |= (1<
}

char SPI_Transmit(char aData, char bData)
{
  PORTB |= (1<   /* Start transmission */
  SPDR = aData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<   SPDR = bData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<   PORTB &= ~(1<   char z = SPDR;
  return(z);


void setup(void)
{
  DDRD |= (1<   DDRD |= (1<   DDRD |= (1<   DDRD |= (1<   DDRD |= (1<   DDRD |= (1<   DDRD |= (1<   PORTD &= ~(1<   PORTD &= ~(1<   PORTD &= ~(1<   ini_lcd();
  PORTD |= (1<   _delay_ms(1);
  
}



void loop(void)
{
  PORTD &= ~(1<   lcd_bajt(0x80);
  
  PORTD |= (1<   
  

}

void TWIInit(void)
{
  //set SCL to 400kHz
  TWSR = 0x00;
  TWBR = 0x0C;
  //enable TWI
  TWCR = (1< }
void TWIStart(void)
{
  TWCR =
  (1<   while ((TWCR & (1< }
void TWIStop(void)
{
  TWCR =
  (1< }
void TWIWrite(uint8_t u8data)
{
  TWDR = u8data;
  TWCR = (1<   while ((TWCR & (1< }
uint8_t TWIReadACK(void)
{
  TWCR =
  (1<   while ((TWCR & (1<   return TWDR;
}
uint8_t TWIReadNACK(void)
{
  TWCR = (1<   while ((TWCR & (1<   return TWDR;
}
uint8_t TWIGetStatus(void)
{
  uint8_t status;
  //mask status
  status = TWSR & 248;
  return status;
}

uint8_t EEWriteByte(uint16_t u16addr, uint8_t u8data)
{
  TWIStart();
  if (TWIGetStatus() != 8)
  return ERROR;
  //select device and send A2 A1 A0 address bits
  TWIWrite((EEDEVADR)|(uint8_t)((u16addr & 0x0700)>>7));
  if (TWIGetStatus() != 24)
  return ERROR;
  //send the rest of address
  TWIWrite((uint8_t)(u16addr));
  if (TWIGetStatus() != 40)
  return ERROR;
  //write byte to eeprom
  TWIWrite(u8data);
  if (TWIGetStatus() != 40)
  return ERROR;
  TWIStop();
  return SUCCESS;
}

uint8_t EEReadByte(uint16_t u16addr)
{
  //uint8_t databyte;
  uint8_t sdata;
  TWIStart();
  if (TWIGetStatus() != 8)
  return ERROR;
  //select device and send A2 A1 A0 address bits
  TWIWrite((EEDEVADR)|((uint8_t)((u16addr & 0x0700)>>7)));
  if (TWIGetStatus() != 36)
  return ERROR;
  //send the rest of address
  TWIWrite((uint8_t)(u16addr));
  if (TWIGetStatus() != 40)
  return ERROR;
  //send start
  TWIStart();
  if (TWIGetStatus() != 16)
  return ERROR;
  //select device and send read bit
  TWIWrite((EEDEVADR)|((uint8_t)((u16addr & 0x0700)>>7))|1);
  if (TWIGetStatus() != 64)
  return ERROR;
  sdata = TWIReadNACK();
  if (TWIGetStatus() != 88)
  return ERROR;
  TWIStop();
  return sdata; 
  }

int main(void)
{
  TWIInit();
  uint8_t ddata = 0;
  uint8_t ew;
  setup();
  ew= EEWriteByte(5, 'b');
  if(ew==SUCCESS)
  {
    lcd_bajt('S');  
  }
  else lcd_bajt('E');
  _delay_ms(10);
  ddata = EEReadByte(5);
  if(ew==ERROR)
  { 
  lcd_bajt('E');
  }
  else lcd_bajt('S');
  
  lcd_bajt(ddata);
  while(1)
  loop();
  return 0;
  
}