Home     Contact     Projects     Experiments     Circuits     Theory     BLOG     PIC Tutorials     Time for Science     RSS     Terms of services     Privacy policy  
   
 Home      Projects     Experiments     Circuits     Theory     BLOG     PIC Tutorials     Time for Science   



All about PIC microcontrollers

Within these pages, you can find many useful pieces of code mostly in assembly for the Microchip PIC micro controller family. A lot of people have spend many hours trying to put the bits and bytes together. If the code is NOT written by a member of the PCB Heaven community, then a link will be added above the code with the original website that this code was found.
Because the code is copied to our servers, you should know that:

  • The responsible web master of the website that the code is taken, has been informed and he has agreed to copy the code
  • All emails from the above contact have been kept as records but due to personal privacy cannot be shown in public.
  • The author of the code is always clearly indicated above the code. In some cases the author is unknown. If you happen to be the author of the code or you know the person who wrote it, please inform us by email and it will be added ASAP.

We would personally like to send the credits to all the people that managed to write some very interesting code and publish it, and special thanx to the people that originally hosted those code snippets and gave us the permission to copy them.


View code
Binary to ASCII, 16 bit to 5 digits (1 at a time) with one temp register
Author: James Newton
This code was originally located @ http://www.piclist.com


Follow this link to go back

;76 instructions and about 25x5x4=500 worst case instructions executed. About (11*4+4)*5+4=100 best case.
watch ptr,8,udec ;set watch for regis
watch Hi,8,uhex ;set watch for regis
watch Lo,8,uhex ;set watch for regis
watch Lo,16,udec ;set watch for regis
watch Hic,8,uhex ;set watch for regis
watch Loc,8,uhex ;set watch for regis
watch Loc,16,udec ;set watch for regis
watch Digit,8,udec ;set watch for regis
watch d1,8,udec ;set watch for regis
watch d2,8,udec ;set watch for regis
watch d3,8,udec ;set watch for regis
watch d4,8,udec ;set watch for regis
watch d5,8,udec ;set watch for regis

device PINS28,PAGES4,BANKS8,TURBO, stackx, optionx
Addr Opcode ;source
7FF- A13 reset start
008- org 8
;temp register to point to table
008- ptr ds 1
;input value
009- Lo ds 1
00A- Hi ds 1
;output value
00B- Digit ds 1

;variables used for testing
00C- Loc ds 1
00D- Hic ds 1
00E- d1 ds 1
00F- d2 ds 1
010- d3 ds 1
011- d4 ds 1
012- d5 ds 1

;This code just exists to test the routine at entry
013- start
013- 06E clr d1
014- 06F clr d2
015- 070 clr d3
016- 071 clr d4
017- 072 clr d5
018- 06C clr Loc
019- 06D clr Hic
01A- 068 clr ptr
01B- 06B clr digit

01C- mainloop
01C- C0E 024 mov fsr,#d1
01E- 20D 02A mov Hi, Hic
020- 20C 029 mov Lo,Loc
022- 967 call entry
023- C12 024 mov fsr,#d5
025- :inc10
025- 2A0 inc ind
026- C0A 080 cjb ind, #10, :next
028- 703 A30
02A- 060 clr ind
02B- 0E4 dec fsr
02C- CF2 1C4 cja fsr, #d1-1, :inc10
02E- 603 A25
030- :next
030- 2AC inc Loc
031- 643 snz
032- 2AD inc Hic
033- A1C jmp mainloop

;This is the subroutine called to get rid of a result digit
;For testing, it just compairs the value to the decimal count
;pointed to by fsr
034- SendOutByte
034- 200 08B cje Digit, ind, :exit
036- 643 A3A
038- :error
038- break
038- 010 page :error
039- A38 jmp :error
03A- :exit
03A- 2A4 inc fsr
03B- 00C ret

;this is the beginning of the routines code.
03C- nextHi
03C- 208 mov w, ptr
03D- 1E2 jmp pc+w
03E- 8C3 retw $C3 ; 0 50,000
03F- 875 retw $75 ; 1 30,000
040- 827 retw $27 ; 2 10,000
041- 827 retw $27 ; 3 10,000
042- 813 retw $13 ; 4 5,000
043- 80B retw $0B ; 5 3,000
044- 803 retw $03 ; 6 1,000
045- 803 retw $03 ; 7 1,000
046- 801 retw $01 ; 8 500
047- 801 retw $01 ; 9 300
048- 800 retw $00 ;10 100
049- 800 retw $00 ;11 100
04A- 800 retw $00 ;12 50
04B- 800 retw $00 ;13 30
04C- 800 retw $00 ;14 10
04D- 800 retw $00 ;15 10

04E- nextLo
04E- 208 mov w, ptr
04F- 1E2 jmp pc+w
050- 850 retw $50 ; 0 50,000
051- 830 retw $30 ; 1 30,000
052- 810 retw $10 ; 2 10,000
053- 810 retw $10 ; 3 10,000
054- 888 retw $88 ; 4 5,000
055- 8B8 retw $B8 ; 5 3,000
056- 8E8 retw $E8 ; 6 1,000
057- 8E8 retw $E8 ; 7 1,000
058- 8F4 retw $F4 ; 8 500
059- 82C retw $2C ; 9 300
05A- 864 retw $64 ;10 100
05B- 864 retw $64 ;11 100
05C- 832 retw $32 ;12 50
05D- 81E retw $1E ;13 30
05E- 80A retw $0A ;14 10
05F- 80A retw $0A ;15 10

060- ror
060- nextDg
060- 208 mov w, ptr
061- E03 and w, #%00000011
062- 1E2 jmp pc+w
063- 805 retw $5
064- 803 retw $3
065- 801 retw $1
066- 801 retw $1


;this is the entry point for the conversion routine
067- entry
067- 068 clr ptr
068- 06B clr digit

069- Loop
069- 93C call nextHi ;get the next value
06A- 08A mov w, Hi-w
06B- 703 sc
06C- A7D jmp smaller
;if the high byte is less than our value, the whole thing must be sm
;Carry not set so parent will skip nextLo and continue with nextHi
06D- 743 sz
06E- A76 jmp largerHi
;if the high byte was exactly equal to our value, then is the low by
06F- 94E call nextLo ;get the next value
070- 089 mov w, Lo-w
071- 703 sc
;the low byte was smaller so the whole thing was smaller after all.
072- A7D jmp smaller
073- 06A clr Hi
;the low byte was larger so we are subtracting and the high byte was
074- 029 mov Lo, w ;and save the subtraction from Lo
075- A7B jmp larger
;The low byte was larger but it's now smaller and since carry is set
;this digit value to output and continue with nextHi
076- largerHi
076- 02A mov Hi, w ;if its not zero and its not smaller, save t
077- 94E call nextLo ;in either case, get the next value
078- 0A9 sub Lo, w
079- 703 sc
07A- 0EA dec Hi
07B- larger
;The value was larger but is now smaller
;add this digit value to output and continue
07B- 960 call nextDg
; break
07C- 1EB add Digit, w
07D- smaller
07D- 2A8 inc ptr
07E- 708 sb ptr.0
07F- 628 snb ptr.1
080- A69 jmp Loop
081- 934 call SendOutByte
082- 06B clr Digit
083- 788 sb ptr.4
084- A69 jmp Loop
085- 209 02B mov Digit, Lo
087- 934 call SendOutByte
088- 00C ret

END


Decimal Hex Binary
50,000 C350 1100 0011 0101 0000
30,000 7530 0111 0101 0011 0000
20,000 4E20 0100 1110 0010 0000
10,000 2710 0010 0111 0001 0000
5000 1388 0001 0011 1000 1000
3000 0BB8 0000 1011 1011 1000
2000 07D0 0000 0111 1101 0000
1000 03E8 0000 0011 1110 1000
500 01F4 0000 0001 1111 0100
300 012C 0000 0001 0010 1100
200 C8 1100 1000
100 64 0110 0100
50 32 0011 0010
30 1E 0001 1110
20 14 0001 0100
10 A 0000 1010

Follow this link to go back






delicious
digg
reddit this Reddit this
Faves



 HOT in heaven!