Facebook
From Krzysztof Karolak, 3 Years ago, written in C.
This paste is a reply to Projekt from Krzysztof Karolak - view diff
Embed
Download Paste or View Raw
Hits: 168
  1. /*
  2.  * I2C.c
  3.  *
  4.  * Created: 11.04.2019 08:39:07
  5.  *  Author: KTM
  6.  */
  7.  
  8. #define F_CPU 16000000L
  9. #include <avr/io.h>
  10. #include<util/delay.h>
  11. #define EEDEVADR 0b10100000
  12. #define ERROR 1
  13. #define SUCCESS (!ERROR)
  14. #define D7 7
  15. #define D6 6
  16. #define D5 5
  17. #define D4 4
  18. #define E 3
  19. #define RS 2
  20. #define RW 1
  21. #define SS 2
  22. #define MOSI 3
  23. #define MISO 4
  24. #define SCK 5
  25.  
  26.  
  27. void lcd_4bity(unsigned char fourbits)
  28. {
  29.   PORTD |= (1<<E);
  30.   if( fourbits & 0x01) PORTD |= (1<<D4); else PORTD &= ~(1<<D4);
  31.   if( fourbits & 0x02) PORTD |= (1<<D5); else PORTD &= ~(1<<D5);
  32.   if( fourbits & 0x04) PORTD |= (1<<D6); else PORTD &= ~(1<<D6);
  33.   if( fourbits & 0x08) PORTD |= (1<<D7); else PORTD &= ~(1<<D7);
  34.   PORTD &= ~(1<<E);
  35.  
  36. }
  37.  
  38. void lcd_bajt(unsigned char bajt)
  39. {
  40.   PORTD |= (1<<E);
  41.   lcd_4bity(bajt>>4);
  42.   PORTD &= ~(1<<E);
  43.   _delay_us(5);
  44.   PORTD |= (1<<E);
  45.   lcd_4bity(bajt);
  46.   PORTD &= ~(1<<E);
  47.   _delay_ms(1);
  48.  
  49. }
  50.  
  51.  
  52. void ini_lcd(void)
  53. {
  54.   lcd_4bity(3);
  55.   _delay_ms(10);
  56.   lcd_4bity(3);
  57.   _delay_ms(1);
  58.   lcd_4bity(3);
  59.   _delay_ms(1);
  60.   lcd_4bity(2);
  61.   _delay_ms(1);
  62.  
  63.   lcd_bajt(28);
  64.   _delay_ms(1);
  65.   lcd_bajt(20);
  66.   _delay_ms(1);
  67.   lcd_bajt(12);
  68.   _delay_ms(1);
  69.   lcd_bajt(6);
  70.   _delay_ms(1);
  71.   lcd_bajt(1);
  72.   _delay_ms(10);
  73.   lcd_bajt(128);
  74.   _delay_ms(5);
  75. }
  76.  
  77.  
  78.  
  79. //////// SPI  ///////////
  80.  
  81. char aData;
  82. char bData;
  83.  
  84. void SPI_Init(void)
  85. {
  86.   DDRB |= (1<<SS);
  87.   PORTB &= ~(1<<SS);
  88.   /* Set MOSI and SCK output, all others input */
  89.   DDRB |= (1<<MOSI)|(1<<SCK);
  90.   PORTB |= (1<<MISO);
  91.   /* Enable SPI, Master, set clock rate fck/16 */
  92.   SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPHA);
  93.  
  94. }
  95.  
  96. char SPI_Transmit(char aData, char bData)
  97. {
  98.   PORTB |= (1<<SS);
  99.   /* Start transmission */
  100.   SPDR = aData;
  101.   /* Wait for transmission complete */
  102.   while(!(SPSR & (1<<SPIF)));
  103.   SPDR = bData;
  104.   /* Wait for transmission complete */
  105.   while(!(SPSR & (1<<SPIF)));
  106.   PORTB &= ~(1<<SS);
  107.   char z = SPDR;
  108.   return(z);
  109. }
  110.  
  111. void setup(void)
  112. {
  113.   DDRD |= (1<<D7);
  114.   DDRD |= (1<<D6);
  115.   DDRD |= (1<<D5);
  116.   DDRD |= (1<<D4);
  117.   DDRD |= (1<<E);
  118.   DDRD |= (1<<RS);
  119.   DDRD |= (1<<RW);
  120.   PORTD &= ~(1<<RW);
  121.   PORTD &= ~(1<<RS);  
  122.   PORTD &= ~(1<<E);
  123.   ini_lcd();
  124.   PORTD |= (1<<RS);
  125.   _delay_ms(1);
  126.  
  127. }
  128.  
  129.  
  130.  
  131. void loop(void)
  132. {
  133.   PORTD &= ~(1<<RS);
  134.   lcd_bajt(0x80);
  135.  
  136.   PORTD |= (1<<RS);
  137.  
  138.  
  139.  
  140. }
  141.  
  142. void TWIInit(void)
  143. {
  144.   //set SCL to 400kHz
  145.   TWSR = 0x00;
  146.   TWBR = 0x0C;
  147.   //enable TWI
  148.   TWCR = (1<<TWEN);
  149. }
  150. void TWIStart(void)
  151. {
  152.   TWCR =
  153.   (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  154.   while ((TWCR & (1<<TWINT)) == 0);
  155. }
  156. void TWIStop(void)
  157. {
  158.   TWCR =
  159.   (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
  160. }
  161. void TWIWrite(uint8_t u8data)
  162. {
  163.   TWDR = u8data;
  164.   TWCR = (1<<TWINT)|(1<<TWEN);
  165.   while ((TWCR & (1<<TWINT)) == 0);
  166. }
  167. uint8_t TWIReadACK(void)
  168. {
  169.   TWCR =
  170.   (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  171.   while ((TWCR & (1<<TWINT)) == 0);
  172.   return TWDR;
  173. }
  174. uint8_t TWIReadNACK(void)
  175. {
  176.   TWCR = (1<<TWINT)|(1<<TWEN);
  177.   while ((TWCR & (1<<TWINT)) == 0);
  178.   return TWDR;
  179. }
  180. uint8_t TWIGetStatus(void)
  181. {
  182.   uint8_t status;
  183.   //mask status
  184.   status = TWSR & 248;
  185.   return status;
  186. }
  187.  
  188. uint8_t EEWriteByte(uint16_t u16addr, uint8_t u8data)
  189. {
  190.   TWIStart();
  191.   if (TWIGetStatus() != 8)
  192.   return ERROR;
  193.   //select device and send A2 A1 A0 address bits
  194.   TWIWrite((EEDEVADR)|(uint8_t)((u16addr & 0x0700)>>7));
  195.   if (TWIGetStatus() != 24)
  196.   return ERROR;
  197.   //send the rest of address
  198.   TWIWrite((uint8_t)(u16addr));
  199.   if (TWIGetStatus() != 40)
  200.   return ERROR;
  201.   //write byte to eeprom
  202.   TWIWrite(u8data);
  203.   if (TWIGetStatus() != 40)
  204.   return ERROR;
  205.   TWIStop();
  206.   return SUCCESS;
  207. }
  208.  
  209. uint8_t EEReadByte(uint16_t u16addr)
  210. {
  211.   //uint8_t databyte;
  212.   uint8_t sdata;
  213.   TWIStart();
  214.   if (TWIGetStatus() != 8)
  215.   return ERROR;
  216.   //select device and send A2 A1 A0 address bits
  217.   TWIWrite((EEDEVADR)|((uint8_t)((u16addr & 0x0700)>>7)));
  218.   if (TWIGetStatus() != 36)
  219.   return ERROR;
  220.   //send the rest of address
  221.   TWIWrite((uint8_t)(u16addr));
  222.   if (TWIGetStatus() != 40)
  223.   return ERROR;
  224.   //send start
  225.   TWIStart();
  226.   if (TWIGetStatus() != 16)
  227.   return ERROR;
  228.   //select device and send read bit
  229.   TWIWrite((EEDEVADR)|((uint8_t)((u16addr & 0x0700)>>7))|1);
  230.   if (TWIGetStatus() != 64)
  231.   return ERROR;
  232.   sdata = TWIReadNACK();
  233.   if (TWIGetStatus() != 88)
  234.   return ERROR;
  235.   TWIStop();
  236.   return sdata;
  237.   }
  238.  
  239. int main(void)
  240. {
  241.   TWIInit();
  242.   uint8_t ddata = 0;
  243.   uint8_t ew;
  244.   setup();
  245.   ew= EEWriteByte(5, 'b');
  246.   if(ew==SUCCESS)
  247.   {
  248.     lcd_bajt('S');  
  249.   }
  250.   else lcd_bajt('E');
  251.   _delay_ms(10);
  252.   ddata = EEReadByte(5);
  253.   if(ew==ERROR)
  254.   {
  255.   lcd_bajt('E');
  256.   }
  257.   else lcd_bajt('S');
  258.  
  259.   lcd_bajt(ddata);
  260.   while(1)
  261.   loop();
  262.   return 0;
  263.  
  264. }