/*Набор внешних функций i2c, МК. Шаг 9, РА-11-2004 г= 1*/
#include <io51.h> /*Подключение системной библиотеки= 2*/
#define SDA  P1.0   /*Информационный сигнал шины i2c= 3*/
#define SCL  P1.1         /*Тактовый сигнал шины i2c= 4*/
extern unsigned char freq;        /*Частота ZQ1, МГц= 5*/
/*--------------Функция задержки времени------------= 6*/
void pause(void) /*Задержка в зависимости от частоты= 7*/
{ unsigned char p;                  /*Счетчик циклов= 8*/
                                /*Строка-разделитель= 9*/
  for (p = freq; p > 0; p--);        /*Цикл задержки=10*/
  return;         /*Возврат после выполнения функции=11*/
}                        /*Окончание функции <pause>=12*/
/*-----------Функция старта для шины i2c------------=13*/
void i2start(void)          /*Команда START шины i2c=14*/
{ SDA = 1; pause();   /*Установка логических уровней=15*/
  SCL = 1; pause();           /*с паузами между ними=16*/ 
  SDA = 0; pause();                               /*=17*/
  SCL = 0; pause();                               /*=18*/
  return;         /*Возврат после выполнения функции=19*/
}                      /*Окончание функции <i2start>=20*/
/*-------Функция записи байта через шину i2c--------=21*/
void i2write(unsigned char byt)  /*Команда WRITE i2c=22*/
{ unsigned char k, m;     /*Вспомогательные счетчики=23*/
                                /*Строка-разделитель=24*/
  for (k = 0; k < 8; k++)    /*Смена 8 битов в байте=25*/
  { m = 0x01 & (byt >> (7 - k));     /*Значение бита=26*/
    SDA = m; pause();   /*Занесение бита в линию SDA=27*/
    SCL = 1; pause();          /*Формирование одного=28*/
    SCL = 0; pause();       /*тактового импульса SCL=29*/
  }               /*Окончание цикла передачи 8 битов=30*/
  return;         /*Возврат после выполнения функции=31*/
}                      /*Окончание функции <i2write>=32*/
/*-------Функция завершения работы с шиной i2c------=33*/
void i2stop(void)            /*Команда STOP шины i2c=34*/
{ SDA = 0; pause();   /*Установка логических уровней=35*/
  SCL = 1; pause();           /*с паузами между ними=36*/
  SDA = 1; pause();                               /*=37*/
  return;         /*Возврат после выполнения функции=38*/
}                       /*Окончание функции <i2stop>=39*/
/*--------Функция проверки бита подтверждения-------=40*/
unsigned char i2ack(void)     /*Команда ACK шины i2c=41*/
{ unsigned char check, y;         /*Данные и счетчик=42*/
                                /*Строка-разделитель=43*/          
  SDA = 1; pause();    /*Установка единичных уровней=44*/
  SCL = 1;                     /*с паузой между ними=45*/
  for (y = 10; y > 0; y--)       /*10 попыток чтения=46*/
  { pause();                      /*Задержка времени=47*/
    if ((check = SDA) == 0) break; /*Досрочный выход=48*/
  } /*Если за 10 чтений нет подтверждения, то ошибка=49*/
  SCL = 0; pause();   /*Исходная установка линии SCL=50*/
  return (check);      /*Возврат (при CHECK=0 норма)=51*/
}                        /*Окончание функции <i2ack>=52*/
/*-------Функция выдачи бита подтверждения----------=53*/
void i2mack(void)      /*Команда MASTER ACK шины i2c=54*/
{ SDA = 0; pause();   /*Установка бита подтверждения=55*/
  SCL = 1; pause(); pause();   /*Генерация тактового=56*/
  SCL = 0; pause();          /*импульса на линии SCL=57*/
  return;         /*Возврат после выполнения функции=58*/
}                       /*Окончание функции <i2mask>=59*/
/*-------Функция отсутствия бита подтверждения------=60*/
void i2nack(void)          /*Команда NO ACK шины i2c=61*/
{ unsigned char y;                 /*Счетчик попыток=62*/
                                /*Строка-разделитель=63*/
  SDA = 1; pause();      /*Режим чтения на линии SDA=64*/
  SCL = 1;    /*Начало единичного тактового импульса=65*/
  for (y = 10; y > 0; y--)       /*10 попыток чтения=66*/
  { pause(); /*Формирование полки тактового импульса=67*/
    if (SDA != 0) break; /*Досрочный выход при норме=68*/
  }  /*Если за 10 чтений есть подтверждение - ошибка=69*/
  SCL = 0; pause();   /*Исходная установка линии SCL=70*/
  return;         /*Возврат после выполнения функции=71*/
}                       /*Окончание функции <i2nack>=72*/
/*-------Функция чтения байта через шину i2c--------=73*/
unsigned char i2read(void)   /*Команда READ шины i2c=74*/
{ unsigned char k, s, d=0;       /*Счетчики и данные=75*/
                                /*Строка-разделитель=76*/
  SDA = 1;        /*Перевод линии SDA в режим чтения=77*/
  for (s = k = 0; k < 8; k++)    /*Цикл чтения 8 бит=78*/
  { SCL = 1; pause(); pause();        /*Начало такта=79*/
    s = SDA << (7 - k);  /*Чтение данных с линии SDA=80*/
    d = d | s; pause(); pause();      /*Сборка байта=81*/
    SCL = 0; pause(); pause();     /*Окончание такта=82*/
  }                   /*Окончание цикла чтения 8 бит=83*/
  return (d);       /*Передача байта <d> в программу=84*/
}                       /*Окончание функции <i2read>=85*/