; Version 1.1 - Source Parallax - Talcom2000 (avec NJ8822 !!!)
; Programme de pilotage d'un synthétiseur NJ8822 
;
; Les deux synthétiseurs NJ8820 sont remplacés par des NJ8822,
; 4 fils : enable_tx, data et clock communs et enable_rx
; Utilisant un pic16f84, pas de 12.5Khz avec oscillateur de référence 6.4Khz.
; Fref = 6.25KHz (fréquence de boucle)
; diviseur par 40 'SP8793' (rx) et 'SP8716' (tx)
; fi à 21.4Mhz, battement infradyne.
; Fvco = Ftx/2
;
; 'R' sur 11 bits = Fosc /(2 x Fcomp) = 6400/(2x6.25) = 512
; Changement de fréquence avec 'M' (10bits) et 'A'(7bits)
; oscillateur du pic par un circuit rc.
;
; Montée/descente des canaux et mémorisation auto.
; Un 3ème bouton permet de régler le shift Tx (+/- 1.6Mhz ou S pour simplex, -P/+P pour packet)
; Affichage LCD de la fréquence et de l'état Tx ou Rx
; ex: [S 430.0000Mhz Rx ]
; Le dernier canal utilisé est affiché lors de la mise sous tension, shift non mémorisé.
;
; A compiler avec SPASM.EXE taper : 'spasm talcom_nj8822.src' 
;
; Ce fichier est volontairement commenté.
; 73 de Laurent - f5soh@bigfoot.com - http://f5soh.free.fr/ - 9 juillet 2000 - Maj mai2006 (LCD2x16)
;-------------------------------------------------------------------------
                DEVICE  PIC16F84,RC_OSC,WDT_OFF,PWRT_OFF,PROTECT_OFF

                id     '5SOH'

                org     0Ch

flag_butee_h    DS      1
flag_butee_b    DS      1

Digit0          DS      1
Digit1          DS      1
Digit2          DS      1
Digit3          DS      1
Digit4          DS      1
Digit5          DS      1
Digit6          DS      1
Digit7          DS      1
Digit8          DS      1
Digit9          DS      1
Digit10         DS      1
Digit11         DS      1
Digit12         DS      1
Digit13         DS      1
Digit14         DS      1
digit15         DS      1
decal           DS      1

nb_clocks       DS      1
nb_A            DS      1
Mlsb_incr       DS      1

Count0          DS      1
Count1          DS      1
temp            DS      1
temp1           DS      1
temp2           DS      1
pa              DS      1

prediv_ref0     DS      1
prediv_ref1     DS      1

_A              DS      1
Mlsb            DS      1
Mmsb            DS      1

duree_appui     DS      1
set_shift_tx    DS      1
set_enable      DS      1

;entrées pour réglage fréquence
freq_plus       equ   RA.0  ;broche 17 du pic, r de 5.6k de rappel à 5v
freq_moins      equ   RA.1  ;broche 18 du pic, r de 5.6k de rappel à 5v      
shift_tx        equ   RA.2  ;broche 1 du pic, r de 5.6k de rappel à 5v

ptt             equ   RA.4  ;broche 3 du pic, r de 5k6 de rappel à 5v (1=rx 0=tx)

;I/O pour le PLL NJ8822
enable_tx        =    RB.0     ;sortie enabletx, broche 6 du pic.
clock            =    RB.1     ;sortie clock,  broche 7 du pic.
data             =    RB.2     ;sortie datas,  broche 8 du pic.
enable_rx        =    RA.3     ;sortie enablerx, broche 2 du pic.



;sorties vers afficheur LCD
RS              equ   RB.1     ;broche 7 : 0=écrire 1=lire
RW              equ   RB.2     ;broche 8 : 0=instruction 1=données
E               equ   RB.3     ;broche 9 : 0=non valide 1=enable

pa2              =    pa.0
;sorties sur 4 bits pour LCD RB4 à RB7

;-----------------------------------------------------------------------------------
; butée haute Rx : Mmsb=003h Mlsb=045h _A=008h  (209.3Mhz rx 440Mhz)
; butée basse Rx : Mmsb=003h Mlsb=031h _A=008h  (204.3Mhz rx 430Mhz)
;---------------------------------------------------------------------------
;données de départ dans la eeprom Tx/Rx sur 430Mhz + affichage 430,0000Mhz
	eeorg		0
	eedata	003h,031h,008h,004h,003h,000h,000h,000h,000h,000h ;rx bas 430Mhz
        eedata  000h,000h,000h,03Ch,033h,03Fh,002h,000h,000h,000h ;msg d'entrée 'Talcom2000=UHF='

; début du programme principal

                org    0
Start           
                mov    !RA,#00010111b  ; RA0 à RA4  = entrées
                mov    !RB,#00000000b  ; RB0 à RB7 = sorties.
                mov    RB,#000h        ; les sorties à 0 au début.
                mov    count0,#0
                mov    count1,#0

                mov    digit0,#'T'
                mov    digit1,#'a'
                mov    digit5,#'m'		
                mov    digit10,#'='		
                mov    digit11,#'U'
                mov    digit12,#'H'
                mov    digit13,#'F'
                mov    digit14,#'='
                mov    digit15,#' '
                mov    decal,#10
                call   lect_memoire
                call   init_lcd
                call   envoi_vers_lcd

:entree         jnb    ptt, :debut              ;message d'entrée, appui sur ptt pour quitter
                jmp    :entree

:debut		mov    digit1,#' '
                mov    digit2,#' '
                mov    digit5,#'.' 
                mov    digit10,#'M'		;caractère 'Mhz' après fréquence
                mov    digit11,#'h'
                mov    digit12,#'z'
                mov    digit13,#' '
                mov    set_shift_tx,#0
                mov    duree_appui,#0
                mov    prediv_ref0,#00000000b  ; 512 pour pas de 12.25Khz au final,
                mov    prediv_ref1,#01000000b  ; lsb suite msb osc réf = 6.4Mhz
					       ; mot de 3 bits, 5 lsb ignorés.
;----------------------------------------------------------------------------
                call   tempo_lente
                call   tempo_lente

:aff_rx         mov    decal,#0
                call   lect_memoire
                mov    set_enable,#0
                call   envoi_vers_pll_div_princ
                call   envoi_vers_pll_ref
                call   tempo
:rx_ok          mov    digit13,#' '
                mov    digit14,#'R'             ;affichage 'Rx'
                mov    digit15,#'x'
                call   tx_shift		        ;calcul décalage Tx
                mov    set_enable,#1
                call   envoi_vers_pll_div_princ ;envoi des données au pll Tx
                call   envoi_vers_pll_ref
                call   envoi_vers_lcd
		call   envoi_vers_lcd2
                call   tempo
:rx_loop        jnb    ptt, :aff_tx
                jnb    shift_tx, :set_shift_tx 
                jnb    freq_plus, :incr
                jnb    freq_moins, :decr
                jmp    :rx_loop

:set_shift_tx
                inc    set_shift_tx
                call   tx_shift
                jmp    :aff_rx

:aff_tx         jb     ptt, :aff_rx     ;si broche ptt=1 retour en rx 
                mov    digit13,#' '
                mov    digit14,#'T'     ;affichage 'Tx'
                mov    digit15,#'x'
                call   envoi_vers_lcd            
                call   :tx_loop

:tx_loop        jb     ptt, :aff_rx     ;si broche ptt=1 retour en rx
                jmp    :tx_loop

:decr           mov    decal,#0
                call   lect_memoire
:decr2          call   decrementation_pour_pll
                call   decrementation_pour_lcd
                call   envoi_vers_lcd
                jnb    freq_moins, :decr2
                jmp    :suite_set

:incr           mov    decal,#0
                call   lect_memoire
:incr2          call   incrementation_pour_pll
                call   incrementation_pour_lcd       
                call   envoi_vers_lcd
                jnb    freq_plus, :incr2

:suite_set      mov    duree_appui,#0
                call  ecrit_memoire
                jmp   :aff_rx


; fin programme principal
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
tx_shift	mov    digit1,#' '
                cje    set_shift_tx,#0,:simplex
                cje    set_shift_tx,#1,:shift_moins
                cje    set_shift_tx,#2,:shift_plus
                cje    set_shift_tx,#3,:shift_moins_p
                cje    set_shift_tx,#4,:shift_plus_p
                mov    set_shift_tx,#0      

:simplex        mov    nb_A,#32
                mov    Mlsb_incr,#02Ah 		; + 21.4Mhz (simplex)
                mov    digit0,#'S'
                jmp    :incr_A
                                 
:shift_moins    mov    nb_A,#24
                mov    Mlsb_incr,#027h		; + 19.8Mhz (Tx -1.6Mhz)
                mov    digit0,#'-'
                jmp    :incr_A                

:shift_plus     mov    Mlsb_incr,#02Eh		; + 23Mhz  (Tx +1.6Mhz)
                mov    digit0,#'+'
                jmp    :add_mlsb

:shift_moins_p  mov    Mlsb_incr,#018h		; + 12Mhz  (Tx -9.4Mhz)
                mov    digit0,#'-'
                mov    digit1,#'P'
                jmp    :add_mlsb                

:shift_plus_p   mov    nb_A,#24
		mov    Mlsb_incr,#03Dh		; + 30.8Mhz (Tx +9.4Mhz)
                mov    digit0,#'+'
                mov    digit1,#'P'
                jmp    :incr_A

:incr_A         cje    nb_A,#0,:suite_incr_A
                inc    _A
                cje    _A,#40,:inc_Mlsb
                jmp    :suite_incr_A
:inc_Mlsb       inc    Mlsb
                mov    _A,#0
                jmp    :suite_incr_A

:suite_incr_A   djnz   nb_A,:incr_A
:add_mlsb       add    Mlsb,Mlsb_incr
                call   envoi_vers_lcd
                call   tempo_lente
                ret
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
incrementation_pour_pll
                mov    flag_butee_b,#0
                cje    duree_appui,#4,:vite_incr
                inc    duree_appui
                call   tempo_lente 
:vite_incr      call   tempo

:test_Mlsb      cje    Mlsb,#0045h,:test_A
                jmp    :suite2
:test_A         cje    _A,#008h,:butee_h       ;butée haute.
                jmp    :suite2

:butee_h        mov    _A,#008h
                mov    Mlsb,#045h
                mov    Mmsb,#003h
                mov    flag_butee_h,#1
                jmp    :fin_inc

:suite2         inc      _A
                cje     _A,#40,:inc_Mlsb     ;A=40?
                jmp    :fin_inc
:inc_Mlsb       mov    _A,#0
                inc     Mlsb
                jmp    :fin_inc
:fin_inc        ret

;---------------------------------------------------------------------------
decrementation_pour_pll                        

                mov    flag_butee_h,#0
                cje    duree_appui,#4,:vite_decr
                inc    duree_appui
                call   tempo_lente
                
:vite_decr      call   tempo

:test_Mlsb      cje     Mlsb,#031h,:test_A2
                jmp     :suite4
:test_A2        cje     _A,#008h,:butee_b     ;butée basse
                jmp     :suite4

:butee_b        mov    _A,#008h
                mov    Mlsb,#031h
                mov    Mmsb,#003h
                mov    flag_butee_b,#1
                jmp    :fin_dec

:suite4         dec      _A
                jb     _A.7,:dec_Mlsb    ; si bit 7 de _A = 1, donc < 0.
                jmp    :fin_dec
:dec_Mlsb       mov    _A,#39
                dec     Mlsb
                jmp    :fin_dec
:fin_dec        ret

;---------------------------------------------------------------------------
incrementation_pour_lcd
                 cjne    flag_butee_h,#1,:S1
                 mov     digit1,#' '
                 mov     digit2,#4           ;affiche 440.0000Mhz
                 mov     digit3,#4
                 mov     digit4,#0
                 mov     digit6,#0
                 mov     digit7,#0
                 mov     digit8,#0
                 mov     digit9,#0
                 ret

:S1              cjne    digit7,#0, :S01
                 mov     digit7,#1
                 jmp     :digit25 
;                 mov     digit8,#2
;                 mov     digit9,#5
;                 ret
:S01             cjne    digit7,#1,:S2
                 mov     digit7,#2
                 jmp     :digit50
;                 mov     digit8,#5
;                 mov     digit9,#0
;                 ret
:S2              cjne    digit7,#2,:S3
                 mov     digit7,#3
                 jmp     :digit75 
;                 mov     digit8,#7
;                 mov     digit9,#5
;                 ret
:S3              cjne    digit7,#3,:S4
                 mov     digit7,#5
                 mov     digit8,#0
                 mov     digit9,#0
                 ret
:S4              cjne    digit7,#5,:S5
                 mov     digit7,#6
:digit25         mov     digit8,#2
                 mov     digit9,#5
                 ret
:S5              cjne    digit7,#6,:S6
                 mov     digit7,#7
:digit50         mov     digit8,#5
                 mov     digit9,#0
                 ret
:S6              cjne    digit7,#7,:S7
                 mov     digit7,#8
:digit75         mov     digit8,#7
                 mov     digit9,#5
                 ret

:S7              cjne    digit7,#8,:fin_inc_lcd
                 mov     digit7,#0
                 mov     digit8,#0
                 mov     digit9,#0
                 inc     digit6
                 cjne    digit6,#10,:fin_inc_lcd
                 mov     digit6,#0
                 inc     digit4
                 cjne    digit4,#10,:fin_inc_lcd
                 mov     digit4,#0
                 inc     digit3
                 cjne    digit3,#5,:fin_inc_lcd
                 mov     digit3,#4

:fin_inc_lcd     ret

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

decrementation_pour_lcd
                 cjne    flag_butee_b,#1,:S22
                 mov     digit1,#' '
                 mov     digit2,#4           ;affiche 430.0000Mhz
                 mov     digit3,#3
                 mov     digit4,#0
                 mov     digit6,#0
                 mov     digit7,#0
                 mov     digit8,#0
                 mov     digit9,#0
                 ret

:S22             cjne    digit7,#8,:S33
                 mov     digit7,#7
                 jmp     :digit50
;                 mov     digit8,#5
;                 mov     digit9,#0
;                 ret
:S33             cjne    digit7,#7,:S44
                 mov     digit7,#6
                 jmp     :digit25 
;                 mov     digit8,#2
;                 mov     digit9,#5
;                 ret
:S44             cjne    digit7,#6,:S55
                 mov     digit7,#5
                 mov     digit8,#0
                 mov     digit9,#0
                 ret
:S55             cjne    digit7,#5,:S66
                 mov     digit7,#3
:digit75         mov     digit8,#7
                 mov     digit9,#5
                 ret
:S66             cjne    digit7,#3,:S77
                 mov     digit7,#2
:digit50         mov     digit8,#5
                 mov     digit9,#0
                 ret
:S77             cjne    digit7,#2,:S88
                 mov     digit7,#1
:digit25         mov     digit8,#2
                 mov     digit9,#5
                 ret
:S88             cjne    digit7,#1,:S11
                 mov     digit7,#0
                 mov     digit8,#0
                 mov     digit9,#0
                 ret
:S11             cjne    digit7,#0,:fin_dec_lcdd
                 mov     digit7,#8
                 mov     digit8,#7
                 mov     digit9,#5
                 dec     digit6
                 cjne    digit6,#255,:fin_dec_lcdd
                 mov     digit6,#9
                 dec     digit4
                 cjne    digit4,#255,:fin_dec_lcdd
                 mov     digit4,#9
                 dec     digit3
                 cjne    digit3,#255,:fin_dec_lcdd
                 mov     digit3,#3
:fin_dec_lcdd    ret

;-----------------------------------------------------------------------------
;initialisation lcd 4 bits une ligne.

init_lcd
                mov     rb,#0
                mov     !rb,#0h
                call    tempo
                clrb    RS           ;mode instruction
                call    tempo     
                mov     RB,#030h     ;init
                nop
                setb    E
                call    tempo
                call    tempo
                clrb    E

                clrb    RS           ;mode instruction
                nop
                nop
                mov     RB,#020h     ;4 bits
                nop
                nop
                setb    E
                call    tempo
                clrb    E
                nop
                nop

                clrb    RS                                    
                nop                          
                mov     temp2,#28h                    
                call    blip_E               
                nop                          

                clrb    RS           ;mode instruction
                nop
                mov     temp2,#08h   ;effacement affichage au début.
                call    blip_E
                nop
                clrb    RS           ;mode instruction
                nop
                mov     temp2,#06h
                nop
                call    blip_E
                nop
                clrb    RS           ;mode instruction
                nop
                mov     temp2,#0Ch
                nop
                call    blip_E
                nop
                clrb    RW           ;mode écriture
                nop
                clrb    RS           ;mode instruction
                nop
                mov     temp2, #10000010b   ;position 2 de l'afficheur
                nop
                call	blip_E
                nop
                setb    RS        ;mode caractères.
                nop
                ret
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
;routine écrit caract. dans le lcd, pa2 =tampon de RS, temp2 pour le caract.

blip_E
                movb    pa2, RS                                             
                clrb    RS              ;passage en mode instruction
                nop
                setb    RW              ;RW en lecture
                nop
                mov     !rb,#0F0h       ;msb en entrée, lsb sortie
                nop
:loop           setb    E               ;Enable du LCD.
                nop
                mov     temp, RB        ;le contenu de RB vers temp
                nop
                clrb    E               ;Disable du LCD.
                nop
                nop
                setb    E               ;2 fois pour mode 4 bits.
                nop
                nop
                clrb    E
                snb     temp.7          ;LCD occupé?
                jmp     :loop           ;oui, retour :loop
                nop
                movb    RS, pa2         ;Non, envoi data ou instruction.
                nop
                clrb    RW              ;mode écriture
                nop
                mov     !rb, #0h        ;tout le port RB en sortie.
                nop
                mov     temp1,temp2     ;masquage du lsb et swap
                nop
                and     RB,#0Fh         ;pour ne pas perturber les lignes
                nop
                and     temp2,#0F0h     ;de contrôle du pll.
                nop
                or      RB,temp2        ;envoi msb d'abord.
                nop
                setb	E
                nop
		    clrb	E
                nop
                swap    temp1
                nop
                and     RB,#0Fh
                nop
                and     temp1,#0F0h
                nop
                or      RB,temp1       ;envoi lsb ensuite.
                nop
                setb   E
                nop
                clrb   E
                nop
                ret
;-----------------------------------------------------------------------------


;-----------------------------------------------------------------------------
envoi_vers_lcd
               clrb      RS                ;mode instruction
               mov       temp2, #10000000b ; position 1ere ligne de l'afficheur
               call      blip_E
               setb      RS                ;mode caractères
               mov       temp2, digit0
               call      blip_E
               mov       temp2, digit1
               call      blip_E
               mov       w, digit2
               add       w,#030h
               mov       temp2,w
               call      blip_E
               mov       w, digit3
               add       w,#030h
               mov       temp2,w
               call      blip_E
               mov       w, digit4
               add       w,#030h
               mov       temp2,w
               call      blip_E
               mov       temp2, digit5    ;affichage virgule
               call      blip_E

               mov       w, digit6
               add       w,#030h
               mov       temp2,w
               call      blip_E
               mov       w, digit7
               add       w,#030h
               mov       temp2,w
               call      blip_E
;               clrb    RS                ;mode instruction
;               mov     temp2, #11000000b ;position 9eme caractère
;               call    blip_E            
;               setb    RS                ;mode caractères
               mov       w, digit8
               add       w,#030h
               mov       temp2,w
               call      blip_E
               mov       w, digit9
               add       w,#030h
               mov       temp2,w
               call      blip_E
               mov       temp2, digit10    ;M
               call      blip_E
               mov       temp2, digit11    ;h
               call      blip_E
               mov       temp2, digit12    ;z
               call      blip_E
               mov       temp2, digit13
               call      blip_E
               mov       temp2, digit14
               call      blip_E
               mov       temp2, digit15
               call      blip_E
               ret
;----------------------------------------------------------------------------
; Garnissage 2ème ligne avec message  [<Talcom2000=UHF>]
envoi_vers_lcd2
               clrb      RS                ;mode instruction
               mov       temp2, #11000000b ; position 2ème ligne de l'afficheur
               call      blip_E
               setb      RS                ;mode caractères
               mov       temp2,#03Ch	;<
               call      blip_E
               mov       temp2,#'T'
               call      blip_E
               mov       temp2,#'a'
               call      blip_E
               mov       temp2,#'l'
               call      blip_E
               mov       temp2,#'c'
               call      blip_E
               mov       temp2,#'o'
               call      blip_E
               mov       temp2,#'m'
               call      blip_E
               mov       temp2,#032h	;2
               call      blip_E
               mov       temp2,#030h	;0
               call      blip_E
               mov       temp2,#030h	;0
               call      blip_E
               mov       temp2,#030h	;0
               call      blip_E
               mov       temp2,#'='
               call      blip_E
               mov       temp2,#'U'
               call      blip_E
               mov       temp2,#'H'
               call      blip_E
               mov       temp2,#'F'
               call      blip_E
               mov       temp2,#03Eh	;>
               call      blip_E
               ret
;----------------------------------------------------------------------------

ecrit_memoire
                 mov    eeadr,decal    ;écriture adresse 0 octet Mmsb
                 mov    eedata,Mmsb
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 1 octet Mlsb
                 mov    eedata,Mlsb
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 2 octet _A, swalow
                 mov    eedata,_A
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 3  digit2  100Mhz
                 mov    eedata,digit2
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 4 digit3    10Mhz
                 mov    eedata,digit3
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 5  digit4   1Mhz
                 mov    eedata,digit4
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 6  digit6   100Khz
                 mov    eedata,digit6
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 7  digit7   10Khz
                 mov    eedata,digit7
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 8  digit8    1Khz
                 mov    eedata,digit8
                 call   valid_ecrit
                 inc    eeadr         ;écriture adresse 9  digit9   0.5Khz
                 mov    eedata,digit9
                 call   valid_ecrit
                 ret

valid_ecrit      setb   status.5        ;set rp0 = page 1  des registres.
                 setb   eecon1.2        ;wren = 1 = write enable
                 mov    eecon2,#055h    ;secu contre écriture accidentelle.
                 mov    eecon2,#0AAh    ;sécu, suite.
                 setb   eecon1.1        ;wr=1 = write
:bou0            jnb    eecon1.4,:bou0  ;eeif = 1 = donnée écrite.
                 clrb   eecon1.4        ;eeif remis à 0.
                 clrb   status.5        ;reset rp0 = page 0 des registres.
                 ret
;---------------------------------------------------------------------------
lect_memoire

                mov    eeadr,decal     ;lecture Mmsb
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    Mmsb,eedata

                inc    eeadr        ;lecture Mlsb
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    Mlsb,eedata

                inc    eeadr         ;lecture _A, compteur swalow
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    _A,eedata

                inc    eeadr        ;lecture 2eme digit lcd 100Mhz
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit2,eedata

                inc    eeadr        ;lecture 3eme digit lcd 10Mhz
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit3,eedata

                inc    eeadr        ;lecture 4eme digit lcd 1Mhz                  
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit4,eedata

                inc    eeadr        ;lecture 6eme digit lcd 100Khz
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit6,eedata

                inc    eeadr        ;lecture 7eme digit lcd 10Khz                  
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit7,eedata

                inc    eeadr        ;lecture 8eme digit lcd 1Khz
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit8,eedata

                inc    eeadr        ;lecture 9eme digit lcd 0.5Khz
                setb   status.5
                setb   eecon1.0
                clrb   status.5
                mov    digit9,eedata

                ret
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
;envoi taux de division référence 3bits MSB (5bits) ignorés puis 8bits
envoi_vers_pll_ref
                mov     nb_clocks,#3
                mov     temp,prediv_ref1  ;envoi 3bits msb prédiv référence
:rotationA      movb    data,temp.7
                nop
                setb    clock
                nop
                nop
                clrb    clock
                nop
                rl      temp
                djnz    nb_clocks,:rotationA

                mov nb_clocks,#8
                mov     temp,prediv_ref0  ;envoi 8bits lsb prédiv référence 
:rotationB      movb    data,temp.7
                nop
                setb    clock
                nop
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationB
                clrb    data
                nop
                setb    clock
                nop
                clrb    enable_rx
                clrb    enable_tx
                nop
                clrb    clock
                ret
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
;envoi taux de division principale 10bits (2msb + 8lsb)
envoi_vers_pll_div_princ
		clrb    enable_tx
                clrb    enable_rx
                clrb    clock
                clrb    data
                nop
                mov nb_clocks,#7
                mov     temp,_A       ;envoi 7bits prédivision modulus
:rotationF      movb    data,temp.6
                nop
                setb    clock
                nop
                cje     set_enable,#1,:enable_tx2
                setb    enable_rx
                jmp     :nop2
:enable_tx2     setb    enable_tx                
:nop2           nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationF

                mov nb_clocks,#2
                mov     temp,Mmsb       ;envoi 2bits poids faible du msb
:rotationD      movb    data,temp.1     ;6 bits msb ignorés
                nop
                setb    clock
                nop
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationD

                mov nb_clocks,#8
                mov     temp,Mlsb    ;envoi 8bits lsb division principale
:rotationE      movb    data,temp.7
                nop
                setb    clock
                nop
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationE
                ret
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
tempo_lente      
                 mov     Count1,#255
:lop2            mov     Count0,#255       ;tempo_lente 
:Loop2           djnz    Count0,:Loop2                                       
                 djnz    Count1,:Lop2                                                 
                 ret
;---------------------------------------------------------------------------
tempo      
                 mov     Count1,#20
:lop3            mov     Count0,#60       ;tempo rapide 
:Loop3           djnz    Count0,:Loop3                                       
                 djnz    Count1,:Lop3                                                 
                 ret
;---------------------------------------------------------------------------
