Multi-function IR receiver.

Easily add IR functionality to any audio project with this full featured receiver.

SONY 12-bit SIRC version available in red, green or blue.

  • Control volume, treble, bass, source and power.
  • Configurable for up to 4 sources.
  • User configurable “friendly” source labels.
  • VU meter screen saver.
  • Optional keypad.
  • Buffered JFET audio out.
  • Sinking outputs can directly drive 5v, 12v or 24v relays.
  • 3 X 2 channel Microchip digital POTs and Microchip processor.
  • Open source firmware – source code will be available for the Sony 12bit SIRC version (PIC Basic Pro).
  • Universal Remote compatible.
  • 3.8” X 2.6” footprint

 

IR receiver V1.1


SONY DAV10  V1

'EULA: Licensed under the MIT License agreement.

'Copyright (2019) PJL Electronics LLC

'Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal
'in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
'of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

'The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
'FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
'IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


'IR Multifunction decoder V1  SONY DAV10

'PICBASIC PRO



osccon = $78         
DEFINE OSC 8
'DEFINE OSCCAL_1K 1
'define write_init 1



Include "modedefs.bas"  ' Include serial modes
 
leds var word
 
TRISA = %00000000
TRISB = %00110000
TRISC = %00010000
low portb.7 



 '''''''''''''''''''''''''''''''''''The inits

 


'init the VU/Define ADCIN parameters
Define  ADC_BITS    4  ' Set number of bits in result 
Define  ADC_CLOCK    3     ' Set clock source (3=rc) 
Define  ADC_SAMPLEUS 5' Set sampling time in uS 

ADCON0 = %00000001      ' Set  adc clock to RC
ADCON1 = %00000000      ' VREF+ to VD,VREF- to VSS,FOSC/2,Sign-magnitude
ADCON2 = %00001111     ' ADC- reference selected by ADNREF,Auto-conversion off




initPOT:
'define sift_pauses 20
skc         var PORTC.6  ' SPI pot
si          var PORTC.7   ' SPI pot
high PORTC.0
high PORTC.1
high PORTC.5
commandw    var byte

initIR:
define PULSEIN_MAX 530
IR_Sense var portc.4
ST var word
IR_Word var word
bits var byte
ID var word

pause 1000
initLCD:
Define LCD_DREG PORTA
DEFINE LCD_DBIT 0
define LCD_RSREG PORTC
define LCD_RSBIT 3
define LCD_EREG PORTC 
define LCD_EBIT 2
define LCD_BITS 8
define LCD_LINES 2
define LCD_COMANDUS 500
define LCD_DATAUS 60
lcdout $FE, 1
pause 1000
lcdout $FE, $40, %00000100, %00001110, 	%00011111,  %00000100, 	%00000100,%00000100, %00011111,	%00000000
lcdout $FE, $48, %00011000, %00011100, %00011110, %00011111, %00011111,	%00011110, 	%00011100, 	%00011000
lcdout $FE, $50, %00001110, %00001110, %00001110, %00001110, %00001110, %00011111, %00001110, %00000100
lcdout $FE, $58, %00000000,	%00000000,	%00000000,	%00000100,	%00000100, 	%00000000, 	%00000000,  %00000000
lcdout $FE, $60, %00000110,	%00000110,	%00000110,	%00000110,	%00000110, 	%00000110, 	%00000110,  %00000110

'LCDOUT $FE, 1, "    ", $00 , $01 , $02 , $03, $04
'pause 30000







intSYSTEM:
temp1   var word
temp2   var byte
temp3   var byte
temp4   var byte
temp5   var byte
carry   var bit
power   var bit
mute    var byte
volume  var word 
bass    var word
treb    var word
source1  var word
source2  var word
source3  var word
source4  var word
selected  var byte
selectbuff  var byte
adc1   var byte
adc2   var byte
lhold   var byte
rhold   var byte
holdctr   var byte
lblank1 var byte
rblank1 var byte
lblank2 var byte
rblank2 var byte
saver   var word
vuint   var word
potval   var byte
idletimer   var word
read 0, bass, treb, source1, source2, source3, source4, selected
if bass = 255 and treb = 255 then gosub justhatched
idletimer = 0
volume = 15
mute = 0
power = 1
gosub powerset
low PORTC.0
potval = volume
gosub setpot
high PORTC.0
low PORTC.5 
potval = treb
gosub setpot
high PORTC.5
low PORTC.1 
potval = bass
gosub setpot
high PORTC.1
gosub selectport





''''''''''''''''''''''''''''''''''''''Main Program

saver = 0
vuint = 0
top:
ir_word = 0
ID = 0 
gosub irin 
    If ir_word > 0 then 
        if  ir_word = 1034 then gosub powerset
        if power = 0 then  goto top
        if ir_word = 1086 then goto selectsource
        if  ir_word = 2587 then goto setbass 
        if  ir_word = 2564 then goto volup    
        if  ir_word = 1033 then goto voldown  
        if  ir_word = 1282 then goto volmute 
        saver = 0         
        'pause 2
        'LCDOUT $FE, $C0, "    ", #IR_Word, "    " 
    endif
if power = 1 and mute = 0 then saver = saver + 1
if saver < 100 then  goto top
lhold = 0
rhold = 0 
holdctr = 0

vuback:
gosub clearscr
LCDOUT $FE, $80, "L "
LCDOUT $FE, $C0, "R "
VU:
    if vuint = 7 then
        pulsin portc.4, 0, st
        if st > 490  then      
            for temp4 = 1 to 7
                ir_word = 0
                gosub irin
                if  ir_word = 1034 then gosub powerset
                if power = 0 then  goto top
                if ir_word = 1086 then goto selectsource
                if  ir_word = 2587 then goto setbass 
                if  ir_word = 2564 then goto volup    
                if  ir_word = 1033 then goto voldown  
                if  ir_word = 1282 then goto volmute
            next
        endif
     else 
     gosub readadcl
     endif  
            if holdctr > 30 then        '>sticky    <fast
                    if (1 &  holdctr) then
                            if lhold > 0 then lhold = lhold - 1
                            if rhold > 0 then rhold = rhold - 1
                    endif
            endif                
    if holdctr = 43 then  holdctr = 0              
    if temp2 > lhold then 
         lhold = temp2
         holdctr = 0
         endif
    lblank1 = lhold -temp2
    lblank2 = 16 -temp2
    'LCDOUT $FE, 1,  "  ", #temp2
    LCDOUT $FE, $80+2, rep 255\temp2, rep 32\lblank1, $04, rep 32\lblank2
    if vuint = 14 then
        pulsin portc.4, 0, st
        if st > 490  then      
            for temp4 = 1 to 7
                ir_word = 0
                gosub irin
                if  ir_word = 1034 then gosub powerset
                if power = 0 then  goto top
                if  ir_word = 2587 then goto setbass 
                if  ir_word = 2564 then goto volup    
                if  ir_word = 1033 then goto voldown  
                if  ir_word = 1282 then goto volmute 
            next
        endif
     vuint = 0
     else 
     gosub readadcr
     endif  
     if temp3 > rhold then  
        rhold = temp3
        holdctr = 0
        endif
    rblank1 = rhold -temp3
    rblank2 = 16 -temp3
    'LCDOUT $FE, $C0, "  ", #temp3
    LCDOUT $FE, $C0+2, rep 255\temp3 , rep 32\rblank1, $04, rep 32\rblank2
    holdctr = holdctr +1
    vuint = vuint +1
    if (temp2 =1) and (temp3 = 1) then
        idletimer = idletimer +1
        else
        idletimer = 0
        endif 
     if idletimer = 4000 then
        idletimer = 0
        power = 1
        gosub powerset 
        goto top
        endif  
goto VU




setbass:  '''''''''''''''''''''''''''''''  start of soundfield sub menu
        gosub clearscr
        LCDOUT $FE, $80, "Bass:", 124, "6", $03, "3", $03, "0", $03, "3", $03, "6", 124
        temp4 = 1
        temp2 = 0
        gosub fixbass
        gosub displayfield
        gosub debouncelong
        bassloop:
        'LCDOUT $FE, 1, #temp
            'gosub fixbass
            ir_word = 0
            ID = 0      
            gosub irin
            If ir_word > 0 then
                    gosub debounce
                  if ir_word = 2564 then
                    bass = bass +1
                    if bass > 255 then bass = 255
                    gosub fixbass
                    gosub displayfield
                    temp4 = 0
                    low PORTC.1 
                    potval = bass
                    gosub setpot
                    high PORTC.1
                  endif
                  if ir_word = 1033 then
                     bass = bass -1
                     if bass  > 255 then  bass = 0
                     gosub fixbass
                     gosub displayfield
                     temp4 = 0
                     low PORTC.1 
                     potval = bass
                     gosub setpot
                     high PORTC.1
                  endif 
                    if ir_word = 1086 then goto bassout
                    if  ir_word = 2587 then goto settreb 
                    if  ir_word = 1034 then 
                        gosub powerset
                        goto top
                    endif    
                    gosub debounce
                    gosub debounce 
                endif
                temp4 = temp4 + 1
                if temp4 > 250 then goto vuback
                goto bassloop
                bassout:
                gosub displayvolume
                gosub debouncelong
                goto top   
              
settreb:  ''soundfield sub menu
        gosub clearscr
        LCDOUT $FE, $80, "Treb:", 124, "6", $03, "3", $03, "0", $03, "3", $03, "6", 124
        temp4 = 1
        temp2 = 0
        gosub fixtreb
        gosub displayfield
        gosub debouncelong
        trebloop:
        'LCDOUT $FE, 1, #temp
            'gosub fixbass
            ir_word = 0
            ID = 0      
            gosub irin
            If ir_word > 0 then
                    gosub debounce
                  if ir_word = 2564 then
                    treb = treb +1
                    if treb > 255 then treb = 255
                    gosub fixtreb
                    gosub displayfield
                    temp4 = 0
                    low PORTC.5 
                    potval = treb
                    gosub setpot
                    high PORTC.5
                  endif
                  if ir_word = 1033 then
                     treb = treb -1
                     if treb  > 255 then  bass = 0
                     gosub fixtreb
                     gosub displayfield
                     temp4 = 0
                     low PORTC.5 
                     potval = treb
                     gosub setpot
                     high PORTC.5
                  endif 
                    if ir_word = 1086 then goto setbass
                    if  ir_word = 2587 then goto setsorce
                    if  ir_word = 1034 then 
                        gosub powerset
                        goto top
                    endif 
                    gosub debounce
                    gosub debounce 
                endif
                temp4 = temp4 + 1
                if temp4 > 250 then goto vuback
                goto trebloop
                trebout:
                gosub displayvolume
                goto top  
                
setsorce:
    temp4 = 0
    temp5 = 1
    gosub clearscr
    LCDOUT $FE, $80, "Set names:"
    LCDOUT $FE, $C0, #temp5, " : "
    temp3 = source1
    gosub printsource
setsourceloop:    
    ir_word = 0
    gosub irin
        If ir_word > 0 then
            if  ir_word = 1282 then goto sourceedit 
            if ir_word = 1086 then goto settreb 
                if  ir_word = 2564 then 
                    temp5 = temp5 + 1                
                    if temp5 = 5 then temp5 = 1
                    endif         
                if  ir_word = 1033 then  
                    temp5 = temp5 - 1
                    if temp5 = 0 then temp5 = 4
                    endif 
                if  ir_word = 1034 then 
                    gosub powerset
                    goto top
                    endif
            gosub clearscr
            LCDOUT $FE, $80, "Set names:"        
            LCDOUT $FE, $C0, #temp5, " : " 
            if temp5=1 then temp3 = source1
            if temp5=2 then temp3 = source2
            if temp5=3 then temp3 = source3
            if temp5=4 then temp3 = source4            
            gosub printsource       
            gosub debouncelong        
            endif 
        temp4 = temp4 + 1
        if temp4 > 250 then goto vuback
        goto setsourceloop
sourceedit: 
        LCDOUT $FE, $80+11, " EDIT"
        gosub debouncelong 
sourceeditloop:
    ir_word = 0
    gosub irin
        If ir_word > 0 then 
                if  ir_word = 2564 then 
                    temp3 = temp3 + 1                          
                    if temp3 > 31 then temp3 = 1
                    endif
                if  ir_word = 1033 then  
                    temp3 = temp3 - 1                          
                    if temp3 = 255 then temp3 = 31
                    endif
                if  ir_word = 1282 then 
                    LCDOUT $FE, $80+11, "SAVED"
                    if temp5=1 then source1 = temp3
                    if temp5=2 then source2 = temp3
                    if temp5=3 then source3 = temp3
                    if temp5=4 then source4 = temp3
                    gosub debouncelong 
                    goto setsourceloop 
                    endif
                LCDOUT $FE, $C0, #temp5, " : "      
                gosub printsource   
                 gosub debouncelong
                 endif
                 goto sourceeditloop  
                 
                 
 selectsource:
    gosub clearscr
    if selected=1 then temp3 = source1
    if selected=2 then temp3 = source2
    if selected=3 then temp3 = source3
    if selected=4 then temp3 = source4
    temp5 = selected 
    LCDOUT $FE, $80, "Source:"    
    gosub printsource2 
    LCDOUT $FE, $C0, "SELECTED"       
    gosub debouncelong
    temp4 = 0
 selectsourceloop:    
    ir_word = 0
    gosub irin
        If ir_word > 0 then
            if ir_word = 2564  then 
                temp5 = temp5 + 1                
                if temp5 = 5 then temp5 = 1
                endif         
            if  ir_word = 1033 then  
                temp5 = temp5 - 1
                if temp5 = 0 then temp5 = 4
                endif                                            
            if  ir_word = 1034 then 
                gosub powerset
                goto top
                endif
             if  ir_word = 1282 then  
                        selected = temp5
                        low PORTC.0 
                        potval = 0
                        gosub setpot
                        high PORTC.0
                        gosub selectport 
                        low PORTC.0 
                        potval = 15
                        volume = 15
                        gosub setpot
                        high PORTC.0 
                        endif
             if  ir_word = 2587 then goto  selectsourceout
        if temp5=1 then temp3 = source1
        if temp5=2 then temp3 = source2
        if temp5=3 then temp3 = source3
        if temp5=4 then temp3 = source4 
        if temp3 = 0 then goto   selectsourceloop
        gosub clearscr
        LCDOUT $FE, $80, "Source:"
        gosub printsource2  
        if temp5 = selected then  LCDOUT $FE, $C0, "SELECTED"     
        gosub debouncelong 
        temp4 = 0            
        endif 
 temp4 = temp4 + 1
 if temp4 > 250 then goto vuback             
 goto selectsourceloop:               
 selectsourceout:
        gosub clearscr
        gosub displayvolume
        gosub debouncelong
        goto top  

selectport:  
selectbuff = 0
if power = 1 then selectbuff = selectbuff+128     
if selected = 1 then  selectbuff = selectbuff+8
if selected = 2 then  selectbuff = selectbuff+4
if selected = 3 then  selectbuff = selectbuff+2
if selected = 4 then  selectbuff = selectbuff+1
portb=selectbuff
'pause 20000
return 
                 
                
volup:
if volume < 15 then volume = volume +1
if volume => 15  and volume < 100 then volume = volume +5
if volume => 100   then volume = volume +10
mute = 0
if volume > 255 then volume = 255
low PORTC.0 
potval = volume
gosub setpot
high PORTC.0
gosub displayvolume
gosub debounce
goto top

voldown:
if volume =< 15 then volume = volume -1
if volume > 15  and volume < 100 then volume = volume -5
if volume => 100   then volume = volume -10
    if volume >254 then  
    volume = 0
    mute = 0
    endif
low PORTC.0    
potval = volume
gosub setpot
high PORTC.0
gosub displayvolume
gosub debounce
goto top

volmute:
if mute = 0 then 
    mute = volume
    volume = 0
else
    gosub displayvolume
    for volume = 1 to mute -1
        low PORTC.0 
        potval = volume
        gosub setpot
        high PORTC.0
        gosub displayvolumefast
        pause 10 
    next 
    gosub displayvolume  
    mute = 0
endif
low PORTC.0 
potval = volume
gosub setpot
high PORTC.0
gosub displayvolume
gosub debouncelong
goto top

    

''''''''''''''''''''''''''''''''''''The subs
clearscr:
lcdout $FE, 1
pause 25
return

justhatched:
gosub clearscr
LCDOUT $FE, $80, "Just hatched"
LCDOUT $FE, $C0, "loading defaults"
selected = 1
source1  =1
source2  =2
source3  =3
source4  =4
bass = 128
treb = 128
pause 1000
gosub clearscr
LCDOUT $FE, $80, "Hello world"
pause 1000
write 0, bass, treb, source1, source2, source3, source4, selected 
pause 1000
LCDOUT $FE, $80, "meet the"
LCDOUT $FE, $C0, "new boss"
pause 1000
return


printsource:
    if temp3 = 0 then LCDOUT $FE, $C0+4, "Disabled"
    if temp3 = 1 then LCDOUT $FE, $C0+4, "Aux  ", rep 32\3
    if temp3 = 2 then LCDOUT $FE, $C0+4, "Aux 1", rep 32\3
    if temp3 = 3 then LCDOUT $FE, $C0+4, "Aux 2", rep 32\3
    if temp3 = 4 then LCDOUT $FE, $C0+4, "Aux 3", rep 32\3
    if temp3 = 5 then LCDOUT $FE, $C0+4, "Aux 4", rep 32\3
    if temp3 = 6 then LCDOUT $FE, $C0+4, "CD  ", rep 32\4
    if temp3 = 7 then LCDOUT $FE, $C0+4, "CD 1", rep 32\4
    if temp3 = 8 then LCDOUT $FE, $C0+4, "CD 2", rep 32\4
    if temp3 = 9 then LCDOUT $FE, $C0+4, "Dac  ", rep 32\3
    if temp3 = 10 then LCDOUT $FE, $C0+4, "Dac 1", rep 32\3
    if temp3 = 11 then LCDOUT $FE, $C0+4, "Dac 2", rep 32\3
    if temp3 = 12 then LCDOUT $FE, $C0+4, "Line  ", rep 32\2
    if temp3 = 13 then LCDOUT $FE, $C0+4, "Line 1", rep 32\2
    if temp3 = 14 then LCDOUT $FE, $C0+4, "Line 2", rep 32\2
    if temp3 = 15 then LCDOUT $FE, $C0+4, "Line 3", rep 32\2
    if temp3 = 16 then LCDOUT $FE, $C0+4, "Line 4", rep 32\2
    if temp3 = 17 then LCDOUT $FE, $C0+4, "PC  ", rep 32\4
    if temp3 = 18 then LCDOUT $FE, $C0+4, "PC 1", rep 32\4
    if temp3 = 19 then LCDOUT $FE, $C0+4, "PC 2", rep 32\4
    if temp3 = 20 then LCDOUT $FE, $C0+4, "Phono  ", rep 32\1
    if temp3 = 21 then LCDOUT $FE, $C0+4, "Phono 1", rep 32\1
    if temp3 = 22 then LCDOUT $FE, $C0+4, "Phono 2", rep 32\1
    if temp3 = 23 then LCDOUT $FE, $C0+4, "Tape  ", rep 32\2
    if temp3 = 24 then LCDOUT $FE, $C0+4, "Tape 1", rep 32\2
    if temp3 = 25 then LCDOUT $FE, $C0+4, "Tape 2", rep 32\2
    if temp3 = 26 then LCDOUT $FE, $C0+4, "Tuner  ", rep 32\1
    if temp3 = 27 then LCDOUT $FE, $C0+4, "Tuner 1", rep 32\1
    if temp3 = 28 then LCDOUT $FE, $C0+4, "Tuner 2", rep 32\1
    if temp3 = 29 then LCDOUT $FE, $C0+4, "Video  ", rep 32\1
    if temp3 = 30 then LCDOUT $FE, $C0+4, "Video 1", rep 32\1
    if temp3 = 31 then LCDOUT $FE, $C0+4, "Video 2", rep 32\1
    return
    
    printsource2:
    if temp3 = 0 then LCDOUT $FE, $88, "Disabled"
    if temp3 = 1 then LCDOUT $FE, $88, rep 32\3,"Aux  "
    if temp3 = 2 then LCDOUT $FE, $88, rep 32\3,"Aux 1"
    if temp3 = 3 then LCDOUT $FE, $88, rep 32\3,"Aux 2"
    if temp3 = 4 then LCDOUT $FE, $88, rep 32\3,"Aux 3"
    if temp3 = 5 then LCDOUT $FE, $88, rep 32\3,"Aux 4"
    if temp3 = 6 then LCDOUT $FE, $88, rep 32\5,"CD  "
    if temp3 = 7 then LCDOUT $FE, $88, rep 32\5,"CD 1"
    if temp3 = 8 then LCDOUT $FE, $88, rep 32\5,"CD 2"
    if temp3 = 9 then LCDOUT $FE, $88,  rep 32\3,"Dac  "
    if temp3 = 10 then LCDOUT $FE, $88, rep 32\3,"Dac 1"
    if temp3 = 11 then LCDOUT $FE, $88, rep 32\3,"Dac 2"
    if temp3 = 12 then LCDOUT $FE, $88, rep 32\2,"Line  "
    if temp3 = 13 then LCDOUT $FE, $88, rep 32\2,"Line 1"
    if temp3 = 14 then LCDOUT $FE, $88, rep 32\2,"Line 2"
    if temp3 = 15 then LCDOUT $FE, $88, rep 32\2,"Line 3"
    if temp3 = 16 then LCDOUT $FE, $88, rep 32\2,"Line 4"
    if temp3 = 17 then LCDOUT $FE, $88, rep 32\4,"PC  "
    if temp3 = 18 then LCDOUT $FE, $88, rep 32\4,"PC 1"
    if temp3 = 19 then LCDOUT $FE, $88, rep 32\4,"PC 2"
    if temp3 = 20 then LCDOUT $FE, $88, rep 32\1,"Phono  "
    if temp3 = 21 then LCDOUT $FE, $88, rep 32\1,"Phono 1"
    if temp3 = 22 then LCDOUT $FE, $88, rep 32\1,"Phono 2"
    if temp3 = 23 then LCDOUT $FE, $88, rep 32\2,"Tape  "
    if temp3 = 24 then LCDOUT $FE, $88, rep 32\2,"Tape 1"
    if temp3 = 25 then LCDOUT $FE, $88, rep 32\2,"Tape 2"
    if temp3 = 26 then LCDOUT $FE, $88, rep 32\1,"Tuner  "
    if temp3 = 27 then LCDOUT $FE, $88, rep 32\1,"Tuner 1"
    if temp3 = 28 then LCDOUT $FE, $88, rep 32\1,"Tuner 2"
    if temp3 = 29 then LCDOUT $FE, $88, rep 32\1,"Video  "
    if temp3 = 30 then LCDOUT $FE, $88, rep 32\1,"Video 1"
    if temp3 = 31 then LCDOUT $FE, $88, rep 32\1,"Video 2"
    return
       

powerchk:
    temp5 = 0
    ir_word = 0
    gosub irin
    gosub debounce
    if  ir_word = 1034 then temp5 = 1
return


readadcl:
ADcin 11, adc1         ' Read channel 11 to adval
'pause 1
if adc1 > 7 then  adc1 = adc1 -3
if adc1 > 11 then  adc1 = adc1 -2
if adc1 > 17 then adc1 = 17
if adc1 < 5 then  
    if adc1 > 0 then adc1 = adc1 + 1
    adc1 = abs(adc1+adc1+adc1+adc2+4)/4
    endif   
temp2 = abs((temp2*9)+(adc1*2)+1)/11
if temp2 > 13 then temp2 = 13 
return

readadcr:
ADcin 13, adc2         ' Read channel 13 to adval
'pause 1
if adc2 > 7 then   adc2 = adc2 - 3
if adc2 > 11 then   adc2 = adc2 - 2
if adc2 > 17 then adc2 = 17 
if adc2 < 5 then
    if adc2 > 0 then adc2 = adc2 + 1
    adc2 = abs(adc2+adc2+adc2+adc1+4)/4
    endif
temp3 = abs((temp3*9)+(adc2*2)+1)/11
if temp3 > 13 then temp3 = 13
return







    

    




                
powerset:
if power = 1 then
    low portb.7
    power = 0
    mute = 0 
    volume = 15
    gosub clearscr
    LCDOUT $FE, $80, "Power off"
    write 0, bass, treb, source1, source2, source3, source4, selected 
     gosub debouncelong
else 
    read 0, bass, treb 
     high portb.7 
    power = 1
    low PORTC.0
    potval = volume
    gosub setpot
    high PORTC.0
    gosub displayvolume 
    gosub debouncelong
endif
saver = 0
return   



displayvolume:
gosub clearscr
if volume = 0 then  
    LCDOUT $80, "Volume: Muted"
    else
    LCDOUT $80, "Volume:" 
    endif
gosub displayvolumefast
saver = 0
return   

displayvolumefast:
temp1 = volume / 20
if volume = 0  then LCDOUT $FE, $C0,  rep 255\temp1, "  ", #volume
if volume < 10 and volume > 0 then LCDOUT $FE, $C0,  rep 255\temp1, $01, " .", #volume dig 0
if volume >=10 and volume < 100 then LCDOUT $FE, $C0,  rep 255\temp1,  $01, " ", #volume dig 1, ".", #volume dig 0
if volume >=100 then LCDOUT $FE, $C0, rep 255\temp1, $01, " ", #volume dig 2, #volume dig 1
return


fixbass:
            if bass => 128 then
                 temp2 = bass - 128
                 carry = 0
                 endif
            if bass < 128  then
                temp2 = 128 - bass
                carry = 1
                endif
return

fixtreb:
            if treb => 128 then
                 temp2 = treb - 128
                 carry = 0
                 endif
            if treb < 128  then
                temp2 = 128 - treb
                carry = 1
                endif
return

displayfield:
    temp4 = 1
    temp5 = temp2/2
            temp3 = temp2 /30
            'LCDOUT $FE, $C0, #temp3
            if carry = 0 then 
                LCDOUT $FE, $C0,  "+", #temp5 dig 1, ".",#temp5 dig 0, #temp2 dig 0 ,  124, rep 95\temp3+4, $00, rep 95\4-temp3, 124
                endif
            if carry = 1 then 
            LCDOUT $FE, $C0,  "-", #temp5 dig 1, ".",#temp5 dig 0, #temp2 dig 0 ,  124, rep 95\4-temp3,  $00, rep 95\temp3+4, 124
                endif    
return   




irin:
pulsin portc.4, 0, st
'LCDOUT $FE, $C0, #st
    IF st <440 OR st >520 Then Return' If not valid then exit
For bits=0 to 11
    Pulsin portc.4,0,Id ' Receive the IR bit pulse 
    ir_word.0[bits] = 0
    If id >=440 then ir_word.0[bits] = 1 ' If its >= 65 then we've received a 1
    'LCDOUT $FE, $C0, "   ", #id, "    "
Next
return

debounce:
pulsin portc.4, 1, st
'LCDOUT $FE, $C0, #st
 IF  (st  >400) or (ST = 0) Then Return
goto debounce 


    
debouncelong:
pulsin portc.4, 1, st
'LCDOUT $FE, $C0, #st
    IF   (ST = 0) Then Return
    goto debouncelong 

setpot:
commandw = %00000000
pause 1
shiftout PORTC.7, PORTC.6, 1, [commandw]
pause 1
shiftout PORTC.7, PORTC.6, 1, [potval]
commandw = %00010000
pause 1
shiftout PORTC.7, PORTC.6, 1, [commandw]
pause 1
shiftout PORTC.7, PORTC.6, 1, [potval]
pause 1
return