/* TM1622 LCD controller */   

// Порты для TM1622
#define CS PORTC.3
#define WR PORTC.4
#define DAT PORTC.5

/************************ 1 бит ******************************/
void data(char b)
 {   
  if (b ==1)
  {                                                                                                                            
    WR=0; 
    DAT=1; 
    WR=1;
   }  
  else 
   {
    WR=0; 
    DAT = 0; 
    WR=1;
   } 
  delay_us(10);
 }      
 
/************************ Команда ******************************/
void out_cmd(unsigned char cmd)
 {                
  unsigned char maska=0b10000000;
  CS=0; 
  
  data(1);
  data(0);
  data(0);  
                   
  do
  {     
   WR = 0;          
   if(cmd & maska)
    {
     DAT=1;
    }
   else 
    {
     DAT=0;
    }
   maska >>= 1; 
   WR = 1;      
   delay_us(10); 
  }
  while(maska);

  WR = 0;  
  DAT=0; 
  WR = 1;  

  CS=1;  
 }  
      
/*********************** Вывод символа на экран *******************************/
void out_data(unsigned char addr, unsigned char symbol)
 { 
  CS=0; 
  data(1);
  data(0);
  data(1);   
  
  switch (addr)
  {
   case 0: data(0);data(0);data(0);data(0);data(0);data(0);    break;//0x00 // Символы
   case 1: data(0);data(0);data(0);data(1);data(0);data(0);    break;//0x04
   case 2: data(0);data(0);data(1);data(0);data(0);data(0);    break;//0x08
   case 3: data(0);data(0);data(1);data(1);data(0);data(0);    break;//0x0C
   case 4: data(0);data(1);data(0);data(0);data(0);data(0);    break;//0x10
   case 5: data(0);data(1);data(0);data(1);data(0);data(0);    break;//0x14
   case 6: data(0);data(1);data(1);data(0);data(0);data(0);    break;//0x18
   case 7: data(0);data(1);data(1);data(1);data(0);data(0);    break;//0x1C
   case 8: data(1);data(0);data(0);data(0);data(0);data(0);    break;//0x20
   case 9: data(1);data(0);data(0);data(1);data(0);data(0);    break;//0x24 
   
   case 10:data(1);data(0);data(1);data(0);data(1);data(1);    break;//0x2B  // Точки
   case 11:data(1);data(0);data(1);data(0);data(0);data(1);    break;//0x29 1-3
   case 12:data(1);data(0);data(1);data(1);data(0);data(1);    break;//0x2D  
  }  
  
  switch (symbol)
  {
   case 0:  data(1);data(0);data(1);data(0);        // Цифры
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(1);data(0);
            data(0);data(0);data(1);data(1); break;
   case 1:  data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0); break;  
   case 2  :data(1);data(0);data(0);data(1);
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(0);data(1); break;
   case 3:  data(1);data(0);data(0);data(0);
            data(0);data(0);data(0);data(1);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(1);data(1); break;
   case 4:  data(0);data(0);data(1);data(1);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0); break; 
   case 5:  data(1);data(0);data(1);data(1);
            data(0);data(0);data(0);data(1);
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(1);data(1); break;          
   case 6:  data(1);data(0);data(1);data(1);
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(1);data(1); break;          
   case 7:  data(1);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(1);data(0);data(1);data(0);
            data(0);data(0);data(1);data(0); break;
   case 8:  data(1);data(0);data(1);data(1);
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(1);data(1); break;                    
   case 9:  data(1);data(0);data(1);data(1);
            data(0);data(0);data(0);data(1);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(1);data(1); break;
            
            
   
   case 12: data(1);data(0);data(1);data(1); // Б  // Кириллица
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(1);data(1); break;                              
   case 14: data(1);data(0);data(1);data(0); // Г
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 15: data(0);data(0);data(0);data(1); // Д
            data(0);data(0);data(1);data(0);
            data(1);data(1);data(1);data(0);
            data(1);data(0);data(1);data(0); break;
   case 17: data(0);data(1);data(0);data(0); // Ж
            data(1);data(1);data(0);data(0);
            data(0);data(1);data(0);data(1);
            data(0);data(1);data(0);data(0); break;
   case 18: data(1);data(0);data(0);data(0); // З
            data(0);data(0);data(0);data(1);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(1);data(1); break;
   case 19: data(0);data(0);data(1);data(0); // И
            data(1);data(0);data(1);data(0);
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0); break;
   case 21: data(0);data(0);data(0);data(0); // Л
            data(1);data(0);data(0);data(0);
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0); break;                               
   case 25: data(1);data(0);data(1);data(0); // П
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0);
            data(0);data(0);data(1);data(0); break;      
   case 29: data(0);data(0);data(1);data(1); // У
            data(0);data(0);data(0);data(1);
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(1); break;
   case 30: data(1);data(0);data(1);data(1); // Ф
            data(0);data(1);data(0);data(0);
            data(1);data(1);data(1);data(0);
            data(1);data(0);data(0);data(0); break; 
   case 33: data(0);data(0);data(0);data(0); // Ц
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break; 
   case 34: data(0);data(0);data(1);data(1); // Ч
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0); break;                          
   case 35: data(0);data(0);data(1);data(0); // Ш
            data(0);data(1);data(1);data(1);
            data(0);data(1);data(1);data(0);
            data(0);data(0);data(1);data(1); break;
   case 36: data(0);data(0);data(0);data(0); // Щ
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 37: data(0);data(0);data(0);data(0); // Ъ
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 38: data(0);data(0);data(0);data(0); // Ы
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 39: data(0);data(0);data(1);data(1); // Ь
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(0);data(0);
            data(1);data(0);data(1);data(1); break;
   case 40: data(0);data(0);data(0);data(0); // Э
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 41: data(0);data(0);data(1);data(1); // Ю
            data(0);data(1);data(1);data(0);
            data(1);data(1);data(1);data(0);
            data(0);data(0);data(1);data(1); break;                 
   case 42: data(1);data(0);data(1);data(1); // Я
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0); break;                           
                                                         
   case 'A':data(1);data(0);data(1);data(1); // Латинница
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0); break;
   case 'B':data(1);data(0);data(0);data(0); 
            data(0);data(1);data(0);data(1);
            data(1);data(1);data(1);data(0);
            data(1);data(0);data(1);data(1); break; 
   case 'C':data(1);data(0);data(1);data(0); 
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(0);data(0);
            data(0);data(0);data(0);data(1); break;                  
   case 'D':data(1);data(0);data(0);data(0); 
            data(0);data(1);data(0);data(1);
            data(1);data(1);data(1);data(0);
            data(0);data(0);data(1);data(1); break;
   case 'E':data(1);data(0);data(1);data(1); 
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(0);data(1); break;                          
   case 'F':data(1);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 'G':data(1);data(0);data(1);data(0); 
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(1);data(1); break;
   case 'H':data(0);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0);
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0); break;            
   case 'I':data(1);data(0);data(0);data(0); 
            data(0);data(1);data(0);data(1);
            data(1);data(1);data(0);data(0);
            data(0);data(0);data(0);data(1); break;
   case 'J':data(0);data(0);data(0);data(0); 
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 'K':data(0);data(0);data(1);data(1); 
            data(0);data(0);data(1);data(0);
            data(0);data(0);data(0);data(1);
            data(0);data(1);data(0);data(0); break;            
   case 'L':data(0);data(0);data(1);data(0); 
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(1); break;                                                              
   case 'M':data(0);data(1);data(1);data(0);
            data(0);data(0);data(1);data(0);
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0); break; 
   case 'N':data(0);data(1);data(1);data(0); 
            data(0);data(0);data(1);data(0);
            data(0);data(0);data(1);data(0);
            data(0);data(1);data(1);data(0); break;
   case 'O':data(1);data(0);data(1);data(0); 
            data(0);data(0);data(1);data(1);
            data(1);data(0);data(1);data(0);
            data(0);data(0);data(1);data(1); break;
   case 'P':data(1);data(0);data(1);data(1); 
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0);
            data(1);data(0);data(0);data(0); break;                  
   case 'R':data(1);data(0);data(1);data(1); 
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(1);data(0);
            data(1);data(1);data(0);data(0); break;
   case 'S':data(1);data(0);data(1);data(1);
            data(0);data(0);data(0);data(1);
            data(1);data(0);data(0);data(0);
            data(1);data(0);data(1);data(1); break;         
   case 'T':data(1);data(0);data(0);data(0); 
            data(0);data(1);data(0);data(0);
            data(1);data(1);data(0);data(0);
            data(0);data(0);data(0);data(0); break;          
   case 'U':data(0);data(0);data(1);data(0); 
            data(0);data(0);data(1);data(1);
            data(0);data(0);data(1);data(0);
            data(0);data(0);data(1);data(1); break;
   case 'V':data(0);data(0);data(1);data(0); 
            data(1);data(0);data(1);data(0);
            data(0);data(0);data(0);data(1);
            data(0);data(0);data(0);data(0); break;
   case 'W':data(0);data(0);data(0);data(0); 
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break;
   case 'X':data(0);data(1);data(0);data(0); 
            data(1);data(0);data(0);data(0);
            data(0);data(0);data(0);data(1);
            data(0);data(1);data(0);data(0); break; 
   case 'Y':data(0);data(0);data(1);data(1); 
            data(0);data(1);data(0);data(0);
            data(0);data(0);data(1);data(0);
            data(1);data(0);data(0);data(0); break;                 
   case 'Z':data(1);data(0);data(0);data(0); 
            data(1);data(0);data(0);data(1);
            data(1);data(0);data(0);data(1);
            data(0);data(0);data(0);data(1); break;                         
                  
   case '-':data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(1);data(0);data(0);data(0); break; 
   case ' ':data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0);
            data(0);data(0);data(0);data(0); break; 
   case '+':data(0);data(0);data(0);data(1);
            data(0);data(1);data(0);data(0);
            data(0);data(1);data(0);data(0);
            data(1);data(0);data(0);data(0); break;         
            
   case 51 :data(0);data(0);data(0);data(1); break;   // Точки
   case 52 :data(0);data(0);data(1);data(0); break;
   case 53 :data(0);data(1);data(0);data(0); break; 
   case 54 :data(0);data(0);data(0);data(0); break;                                                                                      
  }  
        
  CS=1;  
 }       


/********************** Очистка экрана *********************/
void clear()
 {
  unsigned char i;
  
  // Стираем все символы  
  for (i=0;i<10;i++) 
   {                           
    CS=0; 
    data(1);
    data(0);
    data(1); 
      
    switch (i)
     {
      case 0:data(0);data(0);data(0);data(0);data(0);data(0);   break;//0x00
      case 1:data(0);data(0);data(0);data(1);data(0);data(0);   break;//0x04
      case 2:data(0);data(0);data(1);data(0);data(0);data(0);   break;//0x08
      case 3:data(0);data(0);data(1);data(1);data(0);data(0);   break;//0x0C
      case 4:data(0);data(1);data(0);data(0);data(0);data(0);   break;//0x10
      case 5:data(0);data(1);data(0);data(1);data(0);data(0);   break;//0x14
      case 6:data(0);data(1);data(1);data(0);data(0);data(0);   break;//0x18
      case 7:data(0);data(1);data(1);data(1);data(0);data(0);   break;//0x1C
      case 8:data(1);data(0);data(0);data(0);data(0);data(0);   break;//0x20
      case 9:data(1);data(0);data(0);data(1);data(0);data(0);   break;//0x24    
     }  
    
    data(0);data(0);data(0);data(0);
    data(0);data(0);data(0);data(0);
    data(0);data(0);data(0);data(0);
    data(0);data(0);data(0);data(0); 
    
    CS=1;
   } 
  
  // Стираем все точки       
  for (i=0;i<4;i++) 
   {                           
    CS=0; 
    data(1);
    data(0);
    data(1); 
      
    switch (i)
     {
      case 0:data(1);data(0);data(1);data(0);data(0);data(1);   break;//0x29
      case 1:data(1);data(0);data(1);data(0);data(1);data(1);   break;//0x2B
      case 2:data(1);data(0);data(1);data(1);data(0);data(1);   break;//0x2D           
     }  
    
    data(0);data(0);data(0);data(0);    
    
    CS=1;
   }   
 }       

