program topenipokus
'
'        rclk = ra1           DS1302
'        io   = ra2
'        rst  = RA3

dim LCD_RS as sbit at Re0_bit
    LCD_EN as sbit at Re2_bit
    LCD_D4 as sbit at Rd4_bit
    LCD_D5 as sbit at Rd5_bit
    LCD_D6 as sbit at Rd6_bit
    LCD_D7 as sbit at Rd7_bit
    LCD_RS_Direction as sbit at TRISe0_bit
    LCD_EN_Direction as sbit at TRISe2_bit
    LCD_D4_Direction as sbit at TRISd4_bit
    LCD_D5_Direction as sbit at TRISd5_bit
    LCD_D6_Direction as sbit at TRISd6_bit
    LCD_D7_Direction as sbit at TRISd7_bit

' End Lcd module connections

const TEMP_RESOLUTION as byte = 12

dim text as char[5]
    text1 as char[5]
    temp, pomocny_cas as word
    i,j,k, dummy1, tempa, pokus,mesice,
    vteriny, minuty, hodiny,rok, dny  as byte
    cas as byte
    
sub procedure Display_Temperature( dim temp2write as word )
const RES_SHIFT = TEMP_RESOLUTION - 8

dim temp_whole as byte
  temp_fraction as byte
  text = "000.0"
  ' Check if temperature is negative
  if (temp2write and 0x8000) then
      text[0] = "-"
      temp2write = not temp2write + 1
  end if

    ' Extract temp_whole
  temp_whole = word(temp2write >> RES_SHIFT)
  ' Convert temp_whole to characters
  if ( temp_whole div 100 ) then
    text[0] = temp_whole div 100  + 48
    else
    text[0] = " "
  end if

  text[1] = (temp_whole div 10)mod 10 + 48               ' Extract tens digit
  text[2] =  temp_whole mod 10        + 48               ' Extract ones digit

  temp_fraction = word(temp2write) and 0x0f              ' extract 0,5 stupne
  if (temp_fraction >= 8)  then
    text[4] = 53
    else text[4] = 48
  end if
    ' Print temperature on Lcd
  Lcd_Out(1, 6, text)
end sub


sub procedure cteni_casu
  porta = 0
  trisa = 0
  clearbit(porta,1)
  clearbit(porta,2)
  setbit(porta,3)
  
 for i = 0 to 7                          'send command byte, k is variable of register which I want read
  porta.2 = k.0
  delay_us(10)
  setbit(porta,1)
  delay_us(10)
  clearbit(porta,1)
  k = k >>1
 next i
'  porta.2 = 1
  setbit(trisa,2)                        ' switch porta,2 from output to input (is it right?)
  
 for i = 0 to 7
  cas.7 = porta.2
  cas =cas >>1
  delay_us(10)
  setbit(porta,1)
  delay_us(10)
  clearbit(porta,1)
 next i
  trisa = 0
  porta = 0                               'end of transfer
end sub

sub procedure nastaveni_rtc                        'set of register
  trisa = 0
  clearbit(porta,1)
  clearbit(porta,2)
  setbit(porta,3)
  for i = 0 to 15
      porta.2 = pomocny_cas.0
      delay_us(1) 
      setbit(porta,1)
      delay_us(1)
      clearbit(porta,1)
      pomocny_cas = pomocny_cas >>1
  next i
  porta = 0
end sub

sub procedure transform_cas
  vteriny = ((vteriny and 0xF0) >>4)*10 + (vteriny and 0xF0)
  minuty  = ((minuty and 0xF0)  >>4)*10 + (minuty and 0xF0)
  hodiny  = ((hodiny and 0xF0)  >>4)*10 + (hodiny and 0xF0)
  rok     = (dny and 0xC0) >>6
  dny     = ((dny and 0x30) >>4)*10 + (dny and 0x0F)
  mesice  = ((mesice and 0x10) >>4)*10 + (mesice and 0x0F)
end sub

sub procedure zobraz_cas
  lcd_chr(2,16,(vteriny mod 10) +48)
  lcd_chr(2,15,(vteriny / 10) + 48)
  lcd_chr(2,14,".")
  lcd_chr(2,13,(minuty mod 10) +48)
  lcd_chr(2,12,(minuty / 10) + 48)
  lcd_chr(2,11,":")
  lcd_chr(2,10,(hodiny mod 10) +48)
  lcd_chr(2,9,(hodiny /10) +48)
end sub


main:
   porta = 0
   cmcon =7
   adcon1 =6
   trisa = 0

   text = "000.0"
   i = 0
   j = 0
   k = 0
 
   Lcd_Init()                                               ' Initialize Lcd
   Lcd_Cmd(_LCD_CLEAR)                                      ' Clear Lcd
   Lcd_Cmd(_LCD_CURSOR_OFF)                                 ' Turn cursor off
   Lcd_Out(1, 1, "Temp:")
   Lcd_chr(1,11,223)                                        ' Print degree character, "C" for Centigrades
   Lcd_Chr(1,12,"C")                                        ' If you see greek alpha letter try typing 178 instead of 223



   bytetostr(dummy1,text1)
   lcd_out(2,1,text1)
    
   pomocny_cas = 0x008E                                    'set control register- write is on
   nastaveni_rtc()
   delay_ms(1)
   pomocny_cas = 0x0082                                    'set second register- 7th bit is 0 - clock is enable
   nastaveni_rtc()
   delay_ms(1)
   pomocny_cas = 0x808E                                    'set control register - read is enable
   nastaveni_rtc()
   
   
  while (TRUE)
    '--- Perform temperature reading
    Ow_Reset(PORTb, 5)                                     ' Onewire reset signal
    Ow_Write(PORTb, 5, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTb, 5, 0x44)                               ' Issue command CONVERT_T
    Delay_us(120)

    Ow_Reset(PORTb, 5)
    Ow_Write(PORTb, 5, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTb, 5, 0xBE)                               ' Issue command READ_SCRATCHPAD

    temp =  Ow_Read(PORTb, 5)
    temp = (Ow_Read(PORTb, 5) << 8) + temp

    '--- Format and display result on Lcd

    Display_Temperature(temp)
    Delay_ms(520)

    k= 129                                                             ' read second
    cteni_casu()
    vteriny = cas
    delay_ms(1)
    
    k = 131                                                            'read minute
    cteni_casu()
    minuty = cas
    delay_ms(1)
    
    k = 133                                                             'read hours
    cteni_casu()
    hodiny = cas
    delay_ms(1)
    
    k = 139                                                             'read control register
    cteni_casu()
    dummy1 = cas
    
    transform_cas()                                                     'transform and
    zobraz_cas()                                                        'show time on display
  wend
  
end.