How to convert a decimal to 4bit binary in BASIC language?

S

sommes

Guest
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much
 
Binary is Base 2 each bit in binary has the decimal weighted representation
1, 2, 4, 8, 16

2^0 = 1,
2^1 = 2,
2^2 = 4
2^3 = 8
2^4 = 16

Eg to convert 9 to binary

9 divided by 16 = 0, with 9 remainder (4th bit is 0)

9 divided by 8 = 1 and 1 remainder (3rd bit is 1)

1 divided by 4 = 0 and 1 remainder (2nd bit is 0)

1 divided by 2 = 0 and 1 remainder (1st bit is 0)

1 divided by 1 = 1 and 0 remainder (0th bit is 1) = 01001

---------------------------------------------

Let Num = the number to be converted to binary

Let n = the number of bits you need (integer)

let array of bits(0..n) (integer)

Let rem = remainder (integer) = 0 (start at zero)

let res = result (of modulus division)

You can have a loop (for i = n to 0)

----------------------------------

algorithm.... not exactly basic code

FOR i = n to 0

res = Num mod 2^i *** mod is modulus
divide function in basic

rem = Num- [res * 2^i] *** compute the remainder

*** get what's left over from the divide

bit(i) = res *** store the result in the bit array.

Num = rem *** do it over again with what's left over

Next i



*** display bit result ***

For I = n to 0
Print bit(i); ** display each bit individually
next i
print






"sommes" <ljk@jlk.com> wrote in message
news:4449f75f$0$20103$834e42db@reader.greatnowhere.com...
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much
 
"sommes" <ljk@jlk.com> wrote in message
news:4449f75f$0$20103$834e42db@reader.greatnowhere.com...
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much

I'm not 100% sure that this is the same syntax as BASCOM uses, but you
should be able to adapt this:
'assume x is the decimal integer to be converted to binary.
dim x as integer
dim y as string
a = 1
y = ""
do until x = 0
if int (x/2) = x/2 then
y = "0" + y
else
y = "1" + y
end if
x = int(x/2)
loop
x = val(y)

inelegant but it works. I needed to convert decimal numbers to a binary
string representation which is why it's like this. There's undoubtedly a
nicer way to do it.

Cheers.

Ken
 
This is what I meant by elegance, and it looks like it's actually BASCOM (As
I said, I don't know it myself). I paused for a cup of tea before I posted
my example so missed this. <sigh>

Ken

"Joe G (Home)" <joe.g@optusnet.com.au> wrote in message
news:4449fc95$0$20111$afc38c87@news.optusnet.com.au...
Binary is Base 2 each bit in binary has the decimal weighted
representation
1, 2, 4, 8, 16

2^0 = 1,
2^1 = 2,
2^2 = 4
2^3 = 8
2^4 = 16

Eg to convert 9 to binary

9 divided by 16 = 0, with 9 remainder (4th bit is 0)

9 divided by 8 = 1 and 1 remainder (3rd bit is 1)

1 divided by 4 = 0 and 1 remainder (2nd bit is 0)

1 divided by 2 = 0 and 1 remainder (1st bit is 0)

1 divided by 1 = 1 and 0 remainder (0th bit is 1) = 01001

---------------------------------------------

Let Num = the number to be converted to binary

Let n = the number of bits you need (integer)

let array of bits(0..n) (integer)

Let rem = remainder (integer) = 0 (start at zero)

let res = result (of modulus division)

You can have a loop (for i = n to 0)

----------------------------------

algorithm.... not exactly basic code

FOR i = n to 0

res = Num mod 2^i *** mod is modulus
divide function in basic

rem = Num- [res * 2^i] *** compute the remainder

*** get what's left over from the divide

bit(i) = res *** store the result in the bit array.

Num = rem *** do it over again with what's left over

Next i



*** display bit result ***

For I = n to 0
Print bit(i); ** display each bit individually
next i
print






"sommes" <ljk@jlk.com> wrote in message
news:4449f75f$0$20103$834e42db@reader.greatnowhere.com...
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much
 
On Sat, 22 Apr 2006 18:26:05 +1000, "sommes" <ljk@jlk.com> wrote:

I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much


Again it would be useful if you said exactly what you want to do.

You can convert to binary using the "BIN(x)" statment or send out the
binary to the serial port using the "Printbin" statement.

Bascom doesn't differentiate internally between binary, decimal,
octal, hexadecimal or characters. They are all (basically) 8 bits in
size and can be put out onto or read in from a port.

So if you just want to convert say number "9" into binary to output to
a port you don't need to. Just do this for example:

A = 9
portb = A

and the port will have &B0001001 on it

if, however, you do this:

A = "9"
portb = A

then the port will have &B00111001 on it. This is the binary
equivalent of ASCII 39(hex) or ASCII 57(decimal) which is the
character 9 as opposed to the quantity 9.

HTH
Alan

--
Sell your surplus electronic components at
http://ozcomponents.com
Search or browse for that IC, capacitor,
crystal or other component you need.
 
Thank you Joe, Ken and Alan. You guys are really helpful.

I think I better explain what I am going to do.

In this program, I require to read the 10bit ADC from AT90S8535 via 4 bits
output from HT-12D(Decoder) and convert this 10 bits to display on three
digit 7 segment display. A 74LS48 BCD to 7-segment converter is used. As
Alan stated, a decimal can be used directly in BASCOM-AVR (I just found out
today). For example, portd = 9, and the output will be 1001, which is
correct value for BCD.

I've finished the program, and working in the simulation, however, the 7
segment can't display correctly as simulation, I think I didn't read the ADC
value correctly.

I knew It is little bit hard to understand, I will post my source code
tomorrow (as saved in office computer).

Thank you for reading my long message.
 
On 2006-04-22, sommes <ljk@jlk.com> wrote:
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much
7 is 0111
8 is 1000
9 is 1001

write 7 to an io port and the outputs will look like 00000111
those last 4 digits are are the 7

if you want the bits to come in some other position on the IO port
you'll need to shift them (eg by multiplying by 2 if bascom doesn't have a
shift operator or function)

7x2 is 14, and 14 is 00001110
8x2 id 16, and 16 is 00010000

etc...

multiplying by 4 8 ir 16 will shift them even further....

Bye.
Jasen
 
On Sat, 22 Apr 2006 21:38:04 +1000, "sommes" <jlj@kl.com> wrote:

Thank you Joe, Ken and Alan. You guys are really helpful.

I think I better explain what I am going to do.

In this program, I require to read the 10bit ADC from AT90S8535 via 4 bits
output from HT-12D(Decoder) and convert this 10 bits to display on three
digit 7 segment display. A 74LS48 BCD to 7-segment converter is used. As
Alan stated, a decimal can be used directly in BASCOM-AVR (I just found out
today). For example, portd = 9, and the output will be 1001, which is
correct value for BCD.

I've finished the program, and working in the simulation, however, the 7
segment can't display correctly as simulation, I think I didn't read the ADC
value correctly.

I knew It is little bit hard to understand, I will post my source code
tomorrow (as saved in office computer).

Thank you for reading my long message.


I'm presuming the 10 bit is in straight binary? If so you cannot just
take the first four bits and consider them as a digit and then take
the next four bits and consider them as a digit and then take the last
two bits and consider them as a digit - it doesn't work.

You will also need to assemble the three lots of four bits from the
HT-12D into a ten (12) bit word. Each of the four bits from the
decoder does not represent a digit but just four bits out of the ten
(twelve) from your ADC.

First you have to convert the 10 bits to 3 digits (or 4 digits if you
want the complete range (0 to 1023). To do this have a look at the
MOD and DIVIDE functions in Bascom. Using these two functions you can
convert your 10bit word into three/four decimal digits.

You will have to store you 10 bit output as a WORD in Bascom. Then
convert to the three/four digits (using DIVIDE and MOD) which will
also have to me stored as WORDs. Then you can output them as you
want.

HTH
Alan

--
Sell your surplus electronic components at
http://ozcomponents.com
Search or browse for that IC, capacitor,
crystal or other component you need.
 
cheers!

Some times exlaining to others helps yourself understand the original topic
a bit better.

JG

"Ken Taylor" <ken@home.nz> wrote in message
news:Rdn2g.15889$JZ1.608087@news.xtra.co.nz...
This is what I meant by elegance, and it looks like it's actually BASCOM
(As
I said, I don't know it myself). I paused for a cup of tea before I posted
my example so missed this. <sigh

Ken

"Joe G (Home)" <joe.g@optusnet.com.au> wrote in message
news:4449fc95$0$20111$afc38c87@news.optusnet.com.au...
Binary is Base 2 each bit in binary has the decimal weighted
representation
1, 2, 4, 8, 16

2^0 = 1,
2^1 = 2,
2^2 = 4
2^3 = 8
2^4 = 16

Eg to convert 9 to binary

9 divided by 16 = 0, with 9 remainder (4th bit is 0)

9 divided by 8 = 1 and 1 remainder (3rd bit is 1)

1 divided by 4 = 0 and 1 remainder (2nd bit is 0)

1 divided by 2 = 0 and 1 remainder (1st bit is 0)

1 divided by 1 = 1 and 0 remainder (0th bit is 1) = 01001

---------------------------------------------

Let Num = the number to be converted to binary

Let n = the number of bits you need (integer)

let array of bits(0..n) (integer)

Let rem = remainder (integer) = 0 (start at zero)

let res = result (of modulus division)

You can have a loop (for i = n to 0)

----------------------------------

algorithm.... not exactly basic code

FOR i = n to 0

res = Num mod 2^i *** mod is modulus
divide function in basic

rem = Num- [res * 2^i] *** compute the remainder

*** get what's left over from the divide

bit(i) = res *** store the result in the bit array.

Num = rem *** do it over again with what's left over

Next i



*** display bit result ***

For I = n to 0
Print bit(i); ** display each bit individually
next i
print






"sommes" <ljk@jlk.com> wrote in message
news:4449f75f$0$20103$834e42db@reader.greatnowhere.com...
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much
 
Thank you Alan again.

I've finished the 10 bits to 3 digit conversion with simple div and mod.

I would like to ask, how can I get assemble the three lots of four bits from
the
HT-12D into a ten (12) bit word to get the correct value from ADC via radio
transmission and display on 7 segment ?

I just wonder, should I not using all 4 bit in HT-12E, and only use 1 bit to
transmit the digitial signal to avoid the assemble in HT-12D?

Thank you very much


"Alan" <me@somewhere.com.au.invalid> wrote in message
news:k0nl4293efndhhc26vau9ojeddb2ndc95m@4ax.com...
On Sat, 22 Apr 2006 21:38:04 +1000, "sommes" <jlj@kl.com> wrote:

Thank you Joe, Ken and Alan. You guys are really helpful.

I think I better explain what I am going to do.

In this program, I require to read the 10bit ADC from AT90S8535 via 4 bits
output from HT-12D(Decoder) and convert this 10 bits to display on three
digit 7 segment display. A 74LS48 BCD to 7-segment converter is used. As
Alan stated, a decimal can be used directly in BASCOM-AVR (I just found
out
today). For example, portd = 9, and the output will be 1001, which is
correct value for BCD.

I've finished the program, and working in the simulation, however, the 7
segment can't display correctly as simulation, I think I didn't read the
ADC
value correctly.

I knew It is little bit hard to understand, I will post my source code
tomorrow (as saved in office computer).

Thank you for reading my long message.


I'm presuming the 10 bit is in straight binary? If so you cannot just
take the first four bits and consider them as a digit and then take
the next four bits and consider them as a digit and then take the last
two bits and consider them as a digit - it doesn't work.

You will also need to assemble the three lots of four bits from the
HT-12D into a ten (12) bit word. Each of the four bits from the
decoder does not represent a digit but just four bits out of the ten
(twelve) from your ADC.

First you have to convert the 10 bits to 3 digits (or 4 digits if you
want the complete range (0 to 1023). To do this have a look at the
MOD and DIVIDE functions in Bascom. Using these two functions you can
convert your 10bit word into three/four decimal digits.

You will have to store you 10 bit output as a WORD in Bascom. Then
convert to the three/four digits (using DIVIDE and MOD) which will
also have to me stored as WORDs. Then you can output them as you
want.

HTH
Alan

--
Sell your surplus electronic components at
http://ozcomponents.com
Search or browse for that IC, capacitor,
crystal or other component you need.
 
Thank you Jasen.


"Jasen Betts" <jasen@free.net.nz> wrote in message
news:17f9.444ab92b.56fb7@clunker.homenet...
On 2006-04-22, sommes <ljk@jlk.com> wrote:
I am using BASCOM AVR and I would like to ask.

How to convert a decimal to 4 bit binary digit.

For example.

Convert 7 to 0111
Convert 8 to 1000
Convert 9 to 1001

Thank you very much

7 is 0111
8 is 1000
9 is 1001

write 7 to an io port and the outputs will look like 00000111
those last 4 digits are are the 7

if you want the bits to come in some other position on the IO port
you'll need to shift them (eg by multiplying by 2 if bascom doesn't have a
shift operator or function)

7x2 is 14, and 14 is 00001110
8x2 id 16, and 16 is 00010000

etc...

multiplying by 4 8 ir 16 will shift them even further....

Bye.
Jasen
 
On Sun, 23 Apr 2006 14:26:40 +1000, "sommes" <jlj@kl.com> wrote:

I've finished the 10 bits to 3 digit conversion with simple div and mod.

I would like to ask, how can I get assemble the three lots of four bits from
the
HT-12D into a ten (12) bit word to get the correct value from ADC via radio
transmission and display on 7 segment ?

I just wonder, should I not using all 4 bit in HT-12E, and only use 1 bit to
transmit the digitial signal to avoid the assemble in HT-12D?
Each four bit from the HT-12D has to go in a particular position in
the 10 (12) bit word. So the first four bits go at the beginning of
the word.

For example if the first four bits are 0011 then the resultant 12 bit
word would look like:

0011 0000 0000

If the next four bits are 1001 then the 12 bit word has to look like:

0011 1001 0000

And if the final four bits are 0101 then the 12 bit word has to look
like:

0011 1001 0101

This can be accomplished several ways. The easiest is:
1) get the first four bits and multiply by 16
2) add the second four bits and then multiply by 16
3) add the final four bits.

Another way is:
1) get the first four bits and shift left four times
2) add the second four bits and shift left four times
3) add the final four bits.

Yet another way is:
1) get the first four bits and multiply by 256
2) get the second four bits and multiply by 16
3) add the result of 1) and 2)
4) add the final four bits.

And even another way is:
1) get the first four bits and shift left eight times
2) get the second four bits and shift left four times
3) add the result of 1) and 2)
4) add the final four bits.

They all basically do the same thing. Sit down with pencil and paper
and work out how the above work. Then try to work out which is the is
the easiest to understand or the most efficient depending on which you
prefer. Sometimes ease of underatnding is very helpful in the future
but sometimes you just need to have the most efficient way of doing
things (and that can be sometimes very hard to understand later on).

By the way I'm sure you (and others) could find even more ways of
doing the conversion. There isn't really a right way and a wrong way
as long as the result is correct.

HTH
Alan



--
Sell your surplus electronic components at
http://ozcomponents.com
Search or browse for that IC, capacitor,
crystal or other component you need.
 
On Tue, 25 Apr 2006 11:09:52 +1000, "sommes" <jlj@kl.com> wrote:

Thank you Alan. I will try to work it out.

Just remember there is no "right" way to do it. If it works and takes
a 100 line of code it's still right even if someone else can do it in
three lines of code.

The thing to bear in mind with what you are doing is exactly what the
10/12 bits represent (ie 0 to 1023 in binary) and how you need to
handle them to get out the data you need, (ie three or four decimal
digits).

Have fun

Alan

--
Sell your surplus electronic components at
http://ozcomponents.com
Search or browse for that IC, capacitor,
crystal or other component you need.
 
On Sat, 22 Apr 2006 21:38:04 +1000, "sommes" <jlj@kl.com> opined:

Thank you Joe, Ken and Alan. You guys are really helpful.

I think I better explain what I am going to do.

In this program, I require to read the 10bit ADC from AT90S8535 via 4 bits
output from HT-12D(Decoder) and convert this 10 bits to display on three
digit 7 segment display. A 74LS48 BCD to 7-segment converter is used. As
Alan stated, a decimal can be used directly in BASCOM-AVR (I just found out
today). For example, portd = 9, and the output will be 1001, which is
correct value for BCD.
FWIW, normal design practice with that kind of gizmo is to drive your
display directly from the MC, rather than using a decoder chip. That
said, you'd be trading one less chip for I/O pins or added program
complexity, so your choice isn't unreasonable for a one-off design. ;)

I've finished the program, and working in the simulation, however, the 7
segment can't display correctly as simulation, I think I didn't read the ADC
value correctly.
Couldn't be simpler:

-----

' *** Assumptions about your version of BASIC: ***
'
' Everything is integer by default, as is typical for microcontrollers
' mod is the modulo operator,
' / is the integer division operator
' ReadADC() returns the most recent ADC output

dim digit(3) ' Array to hold conversion results, as the display mux
' will need to refresh the LED drive continuously from
' a timer interrupt or somesuch.

bin = ReadADC()

for count = 0 to 3 ' 10 bits = max output of 1023 = 4 digits.
' loop starts with least significant digit
' in digit(0). Count backwards (step -1) if you
' find this digit order confusing.

digit(count) = bin mod 10 ' Extract lowest BCD digit.
bin = bin / 10 ' Shift down by one power of ten.

next

' *** Actual display driver stuff goes here, outputing contents of
' digit() to the display driver circuit.


-----
--
W
. | ,. w , "Some people are alive only because
\|/ \|/ it is illegal to kill them." Perna condita delenda est
---^----^---------------------------------------------------------------
 
Thank you Alan and lionel. Now I am having a trouble with HT-12E to send 3
different 4bits in same time.
 
On Wed, 26 Apr 2006 23:40:34 +1000, "sommes" <jlj@kl.com> wrote:

Thank you Alan and lionel. Now I am having a trouble with HT-12E to send 3
different 4bits in same time.

As Ken say (below) there are easier solutions than the HT12E/D pair.

But is you are stuck with them then what you need to do is split your
10/12 bit word into three 4 bit words and send them one after another.

At the receiving end you take the three 4 bit words and reassemble
them into a 12 bit word.

I already gave you the basics of splitting using the DIVIDE and MOD
functions. Reassembling is done by multiplying (or shifting) and
adding.

Alan

--
Sell your surplus electronic components at
http://ozcomponents.com
Search or browse for that IC, capacitor,
crystal or other component you need.
 

Welcome to EDABoard.com

Sponsor

Back
Top