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

- posted
16 years ago

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

Loading thread data ...

- posted
16 years ago

Binary is Base 2 each bit in binary has the decimal weighted representation

1, 2, 4, 8, 162^0 = 1,

2^1 = 2, 2^2 = 4 2^3 = 8 2^4 = 16Eg 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

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

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

Next i

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

- posted
16 years ago

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

- posted
16 years ago

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.

Ken

representation

- posted
16 years ago

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

formatting link

Search or browse for that IC, capacitor, crystal or other component you need.
- posted
16 years ago

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.

- posted
16 years ago

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

- posted
16 years ago

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

formatting link

Search or browse for that IC, capacitor, crystal or other component you need.
- posted
16 years ago

cheers!

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

JG

- posted
16 years ago

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

- posted
16 years ago

Thank you Jasen.

- posted
16 years ago

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 0000If the next four bits are 1001 then the 12 bit word has to look like:

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

0011 1001 0101This 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

formatting link

Search or browse for that IC, capacitor, crystal or other component you need.
- posted
16 years ago

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

- posted
16 years ago

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

formatting link

Search or browse for that IC, capacitor, crystal or other component you need.
- posted
16 years ago

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. ;)

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

Click to see the full signature

- posted
16 years ago

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

- posted
16 years ago

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

formatting link

Search or browse for that IC, capacitor, crystal or other component you need.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.