
 Originally Posted by 
ChrisHelvey
					
				 
				Hi experts,
I would like to create a physically changable but otherwise static byte variable by using an 8 pin DIP switch for a 16f877a to "read." (Apply 5V from a common rail to the pins for "ON")
So, I'd like to set the DIP before power-on to, say, 01111111 to represent the number 127, which will be a critical element but not change for the remainder of the program unless I reset or do some other interrupt. (A hidden away "field changeable" property without the need for displays, etc.) 
Such that the pins on/off will create a variable in the range from 0-255.
Assuming I have all the pins set to digital, et al, I can't think of how to place the bits from the pins into place.
This has to be so simple I'll be embarrased, but can anyone clue me in?
Thanks
Chris
			
		 
	 
 Hi Chris,
This is a fairly well traveled rod from noobieville 
 , what you are diong is BCD and you are correct re: 127. http://melabs.com/resources/articles/bcdnumbers.htm
http://www.picbasic.co.uk/forum/arch....php/t-66.html
Here is a program that varies an output time according to BCD input.
	Code:
	ASM
    ifndef __12F675
        error "12F675 not selected"
    endif
ENDASM
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF 
    PCON = %00000011    ' BOD off, No POR flag set
DEFINE  NO_CLRWDT 1
DEFINE OSC 4
    OSCCAL = %1111100   ' SET OSC TO MAXIMUM SET OSC TO 4 MHZ INTERNAL
    CMCON   = 7	        ' Disable Analog Comparators
    ANSEL   = 0         ' Disable A/D module, all digital
    WPU.4 = 0           ' Disable weak pull up on GPIO.4
    
    B0    VAR word         ' Byte holds 0 - 255 Word 0 - 65535
    X     VAR WORD
    
    Index VAR BYTE         ' Byte variable only has to hold 0 - 15
    
    LED   VAR GPIO.5       ' Alias GPIO.5 as LED will wire to
                           ' transister base to control device
    
    TRISIO = %00011111     ' RA0 to RA3 inputs for DIP switch
    
    OPTION_REG = %11111111 ' Dis/Enable internal pull-ups Bit 7
                           ' Bits 0-2 prescaler 
                           ' Bit 3 prescaler assignment 1 = WDT 0 = TMR0
                           ' Bit 4 TMR0 source edge select bit
                           ' 1 trigger on High to Low 
                           ' 0 trigger on Low to High
                           ' Bit 5 TOCS TMR0 clock source select
                           ' 1 = transition on GP2
                           ' 0 = internal clock (CLKOUT)
                           ' Bit 6 INTEDG Interrupt Edge Select
                           ' 1 = Interrupt on rising edge GP2
                           ' 0 = Interrupt on falling edge GP2
                           ' Bit 7 Pullup resistor enable bit
                           ' 1 = disabled 0 = enabled by individual port 
                           ' latch values.
    
    
Main:  
     IF (GPIO.4 = 1) THEN
     B0 = 2500 ' Must be a word variable to hold this value
     else      ' HE HE else it,"ain't gonna work!"
     B0 = 250  ' and it will always default to this value!
  endif    
  
    Index = GPIO & $0F   ' Read DIP switch AND mask result
    LOOKUP2 Index,[200,300,400,500,600,700,800,900,1000,2000,_
    3000,4000,5000,6000,7000,8000],X ' notice the X variable
    
    
    HIGH LED
    PAUSE b0
    LOW LED
    PAUSE X    ' X is a WORD variable so it can store 300 to 8000
    
GOTO Main
    END
    POKECODE @$3FF, $50  ' reintroduces osscal correction data
                         ' $3FF tells it where to code, $50 is the
                         ' Cal value unique to each individual chip.
 JS
				
			
Bookmarks