Version:0.9 StartHTML:0000000105 EndHTML:0000066265 StartFragment:0000001197 EndFragment:0000066249 mikroIDE
//--------------------Глобальные переменные-------------------------------------
unsigned char const  chip[]={" SCX-4200  SCX-4520  SCX-4720  SCX-5330  SCX-6320  ML-2150   ML-2250   ML-2550   ML-2850   ML-3470   ML-3560   PE-120    PE-220    WC-3119   WC-4118   Pha-3150  Pha-3420  Pha-3450  Pha-3500  M-20i    "};
unsigned char const txt_PROGRAMMED_OK[16] = "PROGRAMMED OK";
unsigned char const txt_WARNING[16] = "    WARNING    ";

char uart_rd;
char txt[16];
volatile unsigned short ByteRS, BUF;                                                 //входной байт для приема с com-порта
volatile unsigned short N=1;
//volatile unsigned short BUFfrom[64];

// LCD module connections
  sbit LCD_RS at RB2_bit;
  sbit LCD_EN at RB3_bit;
  sbit LCD_D4 at RB4_bit;
  sbit LCD_D5 at RB5_bit;
  sbit LCD_D6 at RB6_bit;
  sbit LCD_D7 at RB7_bit;

  sbit LCD_RS_Direction at TRISB2_bit;
  sbit LCD_EN_Direction at TRISB3_bit;
  sbit LCD_D4_Direction at TRISB4_bit;
  sbit LCD_D5_Direction at TRISB5_bit;
  sbit LCD_D6_Direction at TRISB6_bit;
  sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

//----------------------------Функции-------------------------------------------

 void ReadEEPROM_24C256(char adr_h, char adr_l)                                 //ЧТЕНИЕ ДАННЫХ ИЗ 24С256 0-256 байт
 
{
  I2C1_Start();
  I2C1_Wr(0xA2);
  I2C1_Wr(adr_h);
  I2C1_Wr(adr_l);
  I2C1_Repeated_Start();
  I2C1_Wr(0xA3);
  BUF = I2C1_Rd(1);
  UART1_Write(BUF);
  Delay_ms(1);
  I2C1_Stop();
  Delay_ms(1);                                                                  // issue I2C stop signal
  ByteRS=0;                                                                     //Очистка байта
}

  void ReadEEPROM_FULL_24C02(void)                                              //ЧТЕНИЕ ДАННЫХ ИЗ 24С02 0-256 байт
{
  unsigned int i;
  for (i = 0; i<=255; i++)
  {
  I2C1_Start();                                                                 // issue I2C start signal
  I2C1_Wr(0xA0);                                                                // send byte via I2C  (device address + RE)
  I2C1_Wr(i);                                                                   // send byte (data address)
  I2C1_Repeated_Start();                                                        // issue I2C signal repeated start
  I2C1_Wr(0xA1);                                                                // send byte (device address + R)
  BUF = I2C1_Rd(1);                                                            //
  while (!I2C1_Is_Idle())
  asm nop;
  I2C1_Stop();
  Delay_ms(1);
  UART1_Write(BUF);
  }
  ByteRS=0;
}

 void WriteEEPROM_0_bank(char adr)                                              //ЗАПИСЬ ДАННЫХ В 24С04  0-256 байт
 {

  I2C1_Start();                                                                 //
  I2C1_Wr(0xA0);                                                                //
  I2C1_Wr(adr);                                                             //
  I2C1_Wr(BUF);                                                                 //
  I2C1_Stop();                                                                  //
  Delay_ms(5);                                                                  //
  ByteRS=0;
 }
 
 void WriteEEPROM_1_bank(char adr)                                              //ЗАПИСЬ ДАННЫХ В 24С04  257-512 байт
 {
  I2C1_Start();
  I2C1_Wr(0xA2);
  I2C1_Wr(adr);
  I2C1_Wr(BUF);
  I2C1_Stop();
  Delay_ms(1);
  ByteRS=0;
 }
 
 void CopyEEPROM(char adr_h, char adr_l, unsigned short N)                                        // копироание еепром из 24с512 в 24с04 512байт инфы
  {
   unsigned int i, q, y = 0;
   unsigned short BUF_1;
   char out[8];
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(2,2,"WRITING START");
   Delay_ms(50);
   for (i = 0; i<=255; i++)
   {
   ReadEEPROM_24C256(adr_h, i);
   WriteEEPROM_0_bank(i);
   if (!(i%32)) Lcd_Chr(1,y++,'-');
   }
   ByteRS=0;
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   for (q=0; q<=9; q++)
       out[q] = chip[N*10 + q];
   for (q=0; q<=9; q++)
       UART1_Write(out[q]);
   Lcd_Out(1,3,out);
   Lcd_Out(1,11,"      ");
   Lcd_Out(2,2,"WRATING OK");
   Delay_ms(1);
   }
   
  void FormatEEPROM(void)                                                       // Полное стирание 24с04
  {
   unsigned int i, y = 0;
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(2,3,"FORMAT START");
   for (i = 0; i<=255; i++)
   {
   I2C1_Start();
   I2C1_Wr(0xA0);
   I2C1_Wr(i);
   I2C1_Wr(0xFF);
   I2C1_Stop();
   if (!(i%32)) Lcd_Chr(1,y++,'-');
   Delay_ms(5);
   }
   ByteRS=0;
   UART1_Write_Text("FORMAT END");
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   //Lcd_Out(1,4,txt);
   Lcd_Out(2,2,"FORMAT END");
   Delay_ms(1);
   }
  
//----------------------------Прерывания----------------------------------------

void interrupt() {

  if (PIR1.F5) {
     ByteRS=RCREG;
     PIR1.F5 = 0;
     }
}//~

//---------------------------Главная функция------------------------------------
void main()
{
  bit oldstate, oldstate0, oldstate1, oldstate2, oldstate3, oldstate4, oldstate5;
  unsigned short k;
  unsigned char out[10];                                                        //вывод названия прошивки на ЛСД
  TRISB=0b00000011;                                                             //0 и 1 пин портА на вход, остальное на выход
  OPTION_REG.F7 = 0;                                                            //подключение подтягивающих резисторов на портВ
  TRISC=0b11111111;                                                             //
  TRISA=0b11111111;                                                             //
  PORTA=0b00111111;                                                             //
  ADCON1 = 0x06;                                                                //выводы PORTA цифровые
  INTCON.F6 = 1;                                                                //разрешение прерываний от периферийных модулей
  OPTION_REG.F6 = 1;                                                            //прерывание по переднему фронту сигнала на INT
  INTCON.F4 = 0;                                                                //запрещение внешнего прерывания на  INT __________________
  PIE1.F5 = 1;                                                                  //разрешение прерывания от приемника USART
  INTCON.F7 = 1;                                                                //разрешение всех прерываний
  UART1_Init(9600);                                                             //Инициализация UART module на 9600 bps
  Delay_ms(100);                                                                //Ожидаие пока UART module стабилизируется


  UART1_Write_Text("Start\n");                                                  //Индикация работы Usart
  ADCON1 = 0x06;                                                                //выводы PORTA цифровые
  I2C1_Init(100000);                                                            // initialize I2C communication
  Lcd_Init();                                                                   // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                                                          // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);                                                     // Cursor off
  Lcd_Out(1,1,"RUSSO_TURISTO");                                                 // Write text in first row
  Lcd_Out(2,4,"COPY EEPROM");                                                   // Write text in second row
  Delay_ms(100);

    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    for (k=0; k<=9; k++)
     {
      out[k]=chip[N*10+k];
      }
      Lcd_Chr(1,8,N/10+0x30);
      Lcd_Chr(1,9,N%10+0x30);
      Lcd_Out(2,4,out);
      Lcd_Out(2,13,"   ");

    while (1)  {
      if (Button(&PORTA, 0100)) oldstate0 = 1;                                //увеличение меню
    if (oldstate0 && Button(&PORTA, 0101))
    {
     N=N+1;
     if (N>19) N=1;
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     for (k=0; k<=9; k++)
     {
      out[k]=chip[N*10+k];
      }
      Lcd_Chr(1,8,N/10+0x30);
      Lcd_Chr(1,9,N%10+0x30);
      Lcd_Out(2,4,out);
      Lcd_Out(2,13,"    ");
      oldstate0 = 0;
      }

    if (Button(&PORTA, 1100)) oldstate1 = 1;                                //уменьшение меню
    if (oldstate1 && Button(&PORTA, 1101))
    {
    N=N-1;
    if (N<1) N=19;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    for (k=0; k<=9; k++)
    {
     out[k]=chip[N*10+k];
    }
    Lcd_Chr(1,8,N/10+0x30);
    Lcd_Chr(1,9,N%10+0x30);
    Lcd_Out(2,4,out);
    Lcd_Out(2,13,"    ");
    oldstate1 = 0;
    }

    if (Button(&PORTA, 2100)) oldstate2 = 1;                                //копирование с 24с256 в 24с02  I2C
    if (oldstate2 && Button(&PORTA, 2101))
    {
      CopyEEPROM(2*(N-1), 0x00, N);

    oldstate2 = 0;
    }

    if (Button(&PORTA, 3100)) oldstate3 = 1;                                //стирание 24с02 I2C
    if (oldstate3 && Button(&PORTA, 3101))
    {
      FormatEEPROM();

    oldstate3 = 0;
    }



    switch (ByteRS)
     {
        case '1': CopyEEPROM(0x00,0x00,0 ); break;                                 //
        case '2': CopyEEPROM(0x02,0x00,1 ); break;                                 //
        case '3': CopyEEPROM(0x04,0x00,2 ); break;                                 //
        case '4': CopyEEPROM(0x06,0x00,3 ); break;                                 //
        case '5': CopyEEPROM(0x08,0x00,4 ); break;                                 //
        case '6': CopyEEPROM(0x0A,0x00,5 ); break;                                 //
        case '7': CopyEEPROM(0x0C,0x00,6 ); break;                                 //
        case '8': CopyEEPROM(0x0E,0x00,7 ); break;                                 //
        case '9': CopyEEPROM(0x10,0x00,8 ); break;                                 //
        case 'A': CopyEEPROM(0x12,0x00,9 ); break;                                 //
        case 'B': CopyEEPROM(0x14,0x00,10); break;                                 //

        case 'R': ReadEEPROM_FULL_24C02() ; break;
        
        case 'F': FormatEEPROM(); break;                                        //стирание еепром
        default : break;                                                        //обработка другий команд
     }

   }                                                                            //конец основного бесконечного цикла
   }