<nowiki>;08.10.22 rechnen08, vorher 04 //ausschnitt aus 3x7seganzeige</nowiki>
    <nowiki>#include <p18F14K22.inc></nowiki>
    CONFIG IESO = OFF, PLLEN = OFF, FOSC = IRC, FCMEN = OFF, PCLKEN = OFF
    CONFIG BOREN = OFF, BORV = 19, PWRTEN = OFF, WDTEN = OFF
    CONFIG MCLRE = ON, HFOFST = OFF, DEBUG = OFF, STVREN = ON
    CONFIG XINST = OFF, BBSIZ = OFF, LVP = OFF
    CONFIG CP0 = OFF, CP1 = OFF
    CONFIG CPD = OFF, CPB = OFF
    CONFIG WRT0 = OFF, WRT1 = OFF
    CONFIG WRTB = OFF, WRTC = OFF, WRTD = OFF
    CONFIG EBTR0 = OFF, EBTR1 = OFF
    CONFIG EBTRB = OFF
    errorlevel -302      <nowiki>;surpress the 'not in bank0' warning</nowiki>
GPR_VAR         UDATA    
adclow        RES    1    <nowiki>;variable für daten aus analog-eingang</nowiki>
adchigh        RES    1
adcl            RES     1       <nowiki>;zum zwischenspeichern</nowiki>
adch            RES     1
bitl            RES     1       <nowiki>;var für Tausender,Hunderte u Zehner-Berechnung</nowiki>
bith            RES     1
hundert         RES     1       <nowiki>; für decode</nowiki>
zehner          RES     1
einer           RES     1
temp            RES     1
<nowiki>;...................................</nowiki>
     Org 0x0000            <nowiki>;kein reset vector</nowiki>
     bra    START
MAIN_PROG   CODE
START:   
     movlw      b'00000010'     <nowiki>;set cpu clock speed of 31KHz</nowiki>
     movwf      OSCCON          <nowiki>;move contents of working register into OSCCON</nowiki>
     clrf       OSCTUNE         <nowiki>;</nowiki>
     clrf       LATA
     clrf       TRISA           <nowiki>;port a ausgang</nowiki>
     clrf       LATB            <nowiki>;</nowiki>
     clrf       TRISB           <nowiki>;port b ausgang</nowiki>
     clrf       LATC            <nowiki>;</nowiki>
     clrf       TRISC           <nowiki>;port c Configure as output</nowiki>
MainLoop:
main1:   
     nop                        <nowiki>;adc = wert nach auslesen des analogen eingangs</nowiki>
     call       indezimal       <nowiki>;bit hält werte von 100 oder 10</nowiki>
     nop
     nop
indezimal:                      <nowiki>;adc minus bit </nowiki>     
                                <nowiki>; </nowiki> - analogmeßwert in adclow & adchigh
                                <nowiki>; </nowiki> - d'100' oder d'10' in bitl & bith
                        <nowiki>; für rechenprobe adc füllen mit h'0118' = d'280'</nowiki>
     movlw       h'18'          <nowiki>;adclow </nowiki> 
     movwf       adclow         <nowiki>; </nowiki>  
     movlw       h'01'          <nowiki>;adchigh</nowiki>
     movwf       adchigh

hun:                            <nowiki>;adc minus bit, ergebnis wieder in adc</nowiki>
     clrf        hundert
hun0:
     movlw       h'64'          <nowiki>;bitl & bith mit h'64' = d'100' füllen</nowiki>
     movwf       bitl
     movlw       d'0'
     movwf       bith           <nowiki>;</nowiki>
<nowiki>;----------------</nowiki>
hun1:                           <nowiki>;</nowiki>
     nop
     movff       adclow,temp    <nowiki>;sichern u wiederherstellen,wenn negativ war </nowiki>
     call        subtract       <nowiki>;adc minus bit</nowiki>
     nop
     bnc         hun2           <nowiki>;wenn negativ, ab zu zehner</nowiki>
                                <nowiki>;wenn positiv, weiter in schleife</nowiki>
     incf        hundert        <nowiki>;ist noch hunderter</nowiki>
     bra         hun1           <nowiki>;weiter hunderter zählen </nowiki>    
                                <nowiki>;ausgang:hunderter in hundert,zehnerrest in temp</nowiki>
hun2:                           
     movff     temp,adclow    <nowiki>;erst adclow wiederherstellen</nowiki>
<nowiki>;----------------</nowiki>
zehn:                           <nowiki>;eingang: zehner u einer</nowiki>
     clrf        zehner
zehn1:
     movff       adclow,temp    <nowiki>;vorsorglich umspeichern in einer</nowiki>
     movlw       D'10'          <nowiki>;wieviel zehner stecken in adclow ?</nowiki>
     subwf       adclow,1,1     <nowiki>;minus zehn, der rest in adclow</nowiki>
     bn          ein            <nowiki>;keiner zehner mehr,ab zum einer-zählen</nowiki>
     incf        zehner         <nowiki>;ist noch zehner</nowiki>
     bra         zehn1          <nowiki>;weiter zehner zählen</nowiki>
<nowiki>;----------------</nowiki>
ein:                            <nowiki>;eingang: einer-anzahl in temp</nowiki>
     movff       temp,einer     <nowiki>;ist ja schon fertig jetzt !!!!</nowiki>
                                <nowiki>;ende der zählroutine, bzw. der umwandlung</nowiki>
     nop
     nop
     return     <nowiki>;bra </nowiki>    main1           <nowiki>;in hunderter, zehner, einer</nowiki>
                                <nowiki>;zurück zum anfang</nowiki>
<nowiki>;----------------</nowiki>             
subtract:                       <nowiki>;adc minus bit, ergebnis wieder in adc</nowiki>
                                <nowiki>;bitl & bith enthalten d'1000' oder d'100'</nowiki>
     nop                          
     movf        bitl,0,1       <nowiki>;bit-wert low minus adclow</nowiki>
     subwf       adclow,1,1     <nowiki>;ergebnis wieder in adclow</nowiki>
     bnc         sub1           <nowiki>;ist negativ</nowiki>
     bra         sub            <nowiki>;wenn nicht negativ, muss positiv sein !</nowiki>
sub1:
     decf        adchigh
sub:
     movf        bith,0,1       <nowiki>;tab-wert high minus adc high</nowiki>
     subwf       adchigh,1,1    <nowiki>;ergebnis in adchigh</nowiki>
     return

     end
