
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