;************************************************************* ;************************************************************* ; ; Source code for P-45 receiver (version 0.5) ; ; http://p-45.narod.ru/ ; ; e-mail:p-45@mail.ru ; ;************************************************************* ; ; For KS-H-148 ; KS-H-146 ; KS-H-144 compile: mpasm.exe /dKSH=140 /q p45v04.asm ; ; For KS-H-132 compile: mpasm.exe /dKSH=132 /q p45v04.asm ; ;************************************************************* ; ; distribute by GPL licence ; ;************************************************************* ;************************************************************* list p=16f819 #include errorlevel -302 ; suppress message 302 from list file __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLR_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;#define KSH 140 #define LCD_OnOff 0 ;; 1 - On / 0 - Off #define MHZ 4 #define PCH 37 ;;; 31 -> 31,500 33 -> 33,400 37 -> 37,300 38 -> 38,000 IF (KSH == 140) ;;;;;;;; For KS-H-148 ;;;;;;;;;;; ;;;;;;;; For KS-H-146 ;;;;;;;;;;; ;;;;;;;; For KS-H-144 ;;;;;;;;;;; #define CONST__OnGAIN B'10001001' ;; Weak Signal Booster ON #define CONST__LoBAND B'00000001' ;; Low BAND (default) #define CONST__MiBAND B'00000010' #define CONST__HiBAND B'00001100' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ENDIF IF (KSH == 132) ;;;;;;;; For KS-H-132 ;;;;;;;;;;; #define CONST__OnGAIN B'10001000' ;; Weak Signal Booster - NOT SUPPORT #define CONST__LoBAND B'00000010' ;; Low BAND (default) #define CONST__MiBAND B'00000100' #define CONST__HiBAND B'00000001' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ENDIF ;********************************* ;***** CONSTANTS DEFINITIONS ***** ;********************************* UapyNN equ D'10' UapyHi equ D'245' UapyLo equ D'230' BIT0 equ 0 BIT1 equ 1 BIT2 equ 2 BIT3 equ 3 BIT4 equ 4 BIT5 equ 5 BIT6 equ 6 BIT7 equ 7 Port232 equ PORTB BitTx equ BIT7 BitRx equ BIT6 PortLCDD equ PORTA BitDAT equ BIT4 PortLCDC equ PORTB BitCLC equ BIT1 PortD7001 equ PORTB PllDAT equ BIT5 PortC7001 equ PORTB PllCLC equ BIT4 PortE7001 equ PORTA PllCEN equ BIT2 PortDAC equ PORTB DacCLC equ BIT0 DacDAT equ BIT1 PortI2C equ PORTB i2cDAT equ BIT3 i2cCLC equ BIT2 PortKBD equ PORTA BitKBD equ BIT5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BitS equ 0x02 ; ',' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CR equ 0DH ;;; \r LF equ 0AH ;;; \n BS equ 08H ;;; \b ;******************************** ;***** VARIABLE DEFINITIONS ***** ;******************************** ;----- RS-232 Port ----- SndCnt equ 0x20 SndReg equ 0x21 CntDelay equ 0x22 Tmp1 equ 0x23 Tmp2 equ 0x24 TmpOut equ 0x25 ;----------------------- ;----- LCD Display ----- LcdOutH equ 0x26 LcdOutL equ 0x27 LcdTmp equ 0x28 LcdInd equ 0x29 LcdCnt equ 0x2A InpChr equ 0x2B KBDold equ 0x2C KBDset equ 0x2D KBDcnt equ 0x2E KBDtmp equ 0x2F LcdBuf equ 0x30 LcdBuf0 equ 0x30 LcdBuf1 equ 0x31 LcdBuf2 equ 0x32 LcdBuf3 equ 0x33 LcdBuf4 equ 0x34 LcdBuf5 equ 0x35 LcdBuf6 equ 0x36 LcdBuf7 equ 0x37 ;;;;;;;;;;;;;;;;;;;;;;;;; MathTmp equ 0x38 MathCnt equ 0x39 MathAH equ 0x3A MathAM equ 0x3B MathAL equ 0x3C MathBH equ 0x3D MathBM equ 0x3E MathBL equ 0x3F MathCH equ 0x40 MathCM equ 0x41 MathCL equ 0x42 MathR0 equ 0x40 MathR1 equ 0x41 MathR2 equ 0x42 MathR3 equ 0x43 FrcvWrkH equ 0x44 FrcvWrkM equ 0x45 FrcvWrkL equ 0x46 FrcvMinH equ 0x47 FrcvMinM equ 0x48 FrcvMinL equ 0x49 FrcvMaxH equ 0x4A FrcvMaxM equ 0x4B FrcvMaxL equ 0x4C FrcvStep equ 0x4D InpCnt equ 0x4E InpReg equ 0x4F LevelW equ 0x50 LevelS equ 0x51 TmpCnt equ 0x52 ;;;; Flag equ 0x53 CNG equ D'7' DON equ D'6' Bo1 equ D'5' Bo2 equ D'4' Bo3 equ D'3' AM equ D'2' FM equ D'1' WM equ D'0' LcdBlc equ 0x54 RCVsts equ 0x55 AdrEEE equ 0x56 AdrTMP equ 0x57 MemInd equ 0x58 MemFlg equ 0x59 STEP1 equ D'0' ScanF equ D'1' ScanM equ D'2' Mute equ D'3' Gain equ D'4' LoBand equ D'5' MiBand equ D'6' HiBand equ D'7' ;;;;;; MuteCnt equ 0x5A FrcvWooH equ 0x5B FrcvWooM equ 0x5C FrcvWooL equ 0x5D FrcvTttH equ 0x5E FrcvTttM equ 0x5F FrcvTttL equ 0x60 I2COut equ 0x61 LevelDAC equ 0x62 PotOld equ 0x64 PotTmp equ 0x65 ;;;;;;;;;;;;;;;;;;;;;;;;; Flag2 equ 0x66 POTwr equ D'0' POTff equ D'1' POTon equ D'2' TMRon equ D'3' LCDon equ D'4' DACon equ D'5' InpInd equ 0x67 InpBuf equ 0x68 InpBuf0 equ 0x68 InpBuf1 equ 0x69 InpBuf2 equ 0x6A InpBuf3 equ 0x6B InpBuf4 equ 0x6C InpBuf5 equ 0x6D InpBuf6 equ 0x6E InpBuf7 equ 0x6F InpBuf8 equ 0x70 InpBuf9 equ 0x71 InpTmp equ 0x72 FrcvTmpH equ 0x73 FrcvTmpM equ 0x74 FrcvTmpL equ 0x75 TmrTmr equ 0x76 WriCnt equ 0x77 WriTmp equ 0x78 LcdTmr equ 0x79 ;;;;;;; For U-apy UapyCnt equ 0x7A UapyM equ 0x7B UapyL equ 0x7C ;;;;; Save_F equ 0x7d Save_W equ 0x7e Save_S equ 0x7f Level0 equ B'00000001' ; AN0 Level1 equ B'00001001' ; AN1 Level3 equ B'00011001' ; AN3 ;############################# AdrScanL equ 0xE0 AdrScanH equ 0xE3 AdrFrcv equ 0xF0 ;; 0xF0 -> 240 / 4 = 60 (IndFrcv) IndFrcv equ D'60' ;############################# DebugEE MACRO call ReadEE movwf AdrTmp printc '<' printf AdrTmp printc '>' ENDM ;############################# Hex2Lcd MACRO RegH,RegM,RegL swapf RegH,w call LcdDigit movwf LcdBuf2 movf RegH,w call LcdDigit movwf LcdBuf3 swapf RegM,w call LcdDigit movwf LcdBuf4 movf RegM,w call LcdDigit movwf LcdBuf5 swapf RegL,w call LcdDigit movwf LcdBuf6 movf RegL,w call LcdDigit movwf LcdBuf7 ENDM ;;;;;;;;;;;;;;; ;############################# ;============================= GetAN MACRO ANx movlw ANx call GetLevel ENDM ;============================= printc MACRO char movlw char call SndChr ENDM ;============================= printf MACRO register movf register,w call PutH ENDM ;============================= printd MACRO register movf register,w call PutD ENDM ;============================= Bank0 MACRO bcf STATUS,RP0 ; set bank 0 bcf STATUS,RP1 ; ENDM ;============================= Bank1 MACRO bsf STATUS,RP0 ; set bank 1 bcf STATUS,RP1 ; ENDM ;============================= Bank2 MACRO bcf STATUS,RP0 ; set bank 2 bsf STATUS,RP1 ; ENDM ;============================= Bank3 MACRO bsf STATUS,RP0 ; set bank 3 bsf STATUS,RP1 ; ENDM ;============================= sti MACRO bsf INTCON,GIE ; enable interrupts ENDM ;============================= cli MACRO bcf INTCON,GIE ; disable interrupts ENDM ;============================= movff MACRO Reg1,Reg2 ; Reg1 -> Reg2 movf Reg1,w movwf Reg2 ENDM ;============================= movcf MACRO Register,Char ; Char -> Register movlw Char movwf Register ENDM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;**************************** ORG 0x000 ; processor reset vector goto Start ; go to beginning of program ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;**************************** ORG 0x004 movwf Save_W swapf STATUS,w movwf Save_S ;++++++++++++++++ Bank0 movf FSR, w movwf Save_F ;++++++++++++++++ ;;;; btfsc INTCON,RBIF goto Rcv232 ;;;; Rcv232End ;;;; btfsc INTCON,TMR0IF goto LcdOutput ;;;; LcdOutEnd ;++++++++++++++++ movf Save_F,w movwf FSR ;++++++++++++++++ swapf Save_S,w movwf STATUS swapf Save_W,f swapf Save_W,w retfie ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;**************************** Start ; Bank1 ; clrf OSCTUNE ; ; movlw B'01100100' ; set 4 MHZ ; movwf OSCCON ; ;;;;; Init Port A & Port B Bank0 clrf PORTA clrf PORTB Bank1 movlw B'00101011' ; set RA0 - Inp (AN0 - S-metr) movwf TRISA ; set RA1 - Inp (AN1 - Volume) ; set RA3 - Inp (AN3 - U-vco ) ; set RA5 - Inp KBD ( MCLR ) movlw B'01000000' ; set RB6 - Inp (Rx RS-232) movwf TRISB ; --- set RB5 - Inp ( KBD LCD ) ;;;;; Init A/D movlw B'01000100' ; On AN0, AN1, AN3 movwf ADCON1 movlw B'00000000' ; set Fosc/4 movwf ADCON0 ;;;;; Init Timer0 Bank1 clrwdt ; movlw B'11000100' ; Internal clock & Prescaler 1:32 movlw B'11000011' ; Internal clock & Prescaler 1:16 ; movlw B'11000010' ; Internal clock & Prescaler 1:8 movwf OPTION_REG ;;;;; Init Interrupt Bank1 ; movlw B'00100000' ; Interrupt from Timer0 movlw B'00101000' ; Interrupt from Timer0 + change port B movwf INTCON clrf PIE1 clrf PIE2 Bank0 clrf PIR1 clrf PIR2 clrf LcdInd sti goto main ;----- GetCod andlw 0x0F addwf PCL, f retlw '0' retlw '1' retlw '2' retlw '3' retlw '4' retlw '5' retlw '6' retlw '7' retlw '8' retlw '9' retlw 'A' retlw 'B' retlw 'C' retlw 'D' retlw 'E' retlw 'F' return ;----- LcdDigit andlw 0x0F addwf PCL, f retlw B'10111011' ; 0 retlw B'00101000' ; 1 retlw B'11100011' ; 2 retlw B'11101010' ; 3 retlw B'01111000' ; 4 retlw B'11011010' ; 5 retlw B'11011011' ; 6 retlw B'00101010' ; 7 retlw B'11111011' ; 8 retlw B'11111010' ; 9 retlw B'01111011' ; A retlw B'11011001' ; B retlw B'10010011' ; C retlw B'11101001' ; D retlw B'11010011' ; E retlw B'01010011' ; F return ;----- LcdTab1 andlw 0x0F addwf PCL, f retlw B'01100101' retlw B'01100111' retlw B'01101101' retlw B'01101111' retlw B'01110101' retlw B'01110111' retlw B'01111101' retlw B'01111111' retlw B'11100101' retlw B'11100111' retlw B'11101101' retlw B'11101111' retlw B'11110101' retlw B'11110111' retlw B'11111101' retlw B'11111111' return ;----- LcdTab2 andlw 0x03 addwf PCL, f retlw B'10111111' retlw B'11011111' retlw B'11111011' retlw B'11111110' return ;----- LcdBits andlw 0x07 addwf PCL, f retlw B'10000000' retlw B'01000000' retlw B'00100000' retlw B'00010000' retlw B'00001000' retlw B'00000100' retlw B'00000010' retlw B'00000001' return ;----- KbdTabi andlw 0x07 addwf PCL, f retlw 0xff ; retlw 0xff ; retlw 0xff retlw 0xff retlw 0xff retlw 0xff retlw 0x00 ; - retlw 0x08 ; + return ;----- STPTab andlw 0x07 addwf PCL, f retlw D'5' retlw D'10' retlw D'15' retlw D'20' retlw D'25' retlw D'30' retlw D'50' retlw D'100' return ;----- POTTabi ; andlw 0x1F addwf PCL, f retlw D'255' ; 0 retlw D'254' ; 1 retlw D'252' ; 2 retlw D'248' ; 3 retlw D'244' ; 4 retlw D'242' ; 5 retlw D'240' ; 6 retlw D'238' ; 7 retlw D'236' ; 8 retlw D'233' ; 9 retlw D'232' ; 10 retlw D'231' ; 11 retlw D'230' ; 12 retlw D'228' ; 13 retlw D'227' ; 14 retlw D'225' ; 15 retlw D'224' ; 16 retlw D'222' ; 17 retlw D'220' ; 18 retlw D'218' ; 19 retlw D'216' ; 20 retlw D'214' ; 21 retlw D'211' ; 22 retlw D'207' ; 23 retlw D'204' ; 24 retlw D'195' ; 25 retlw D'188' ; 26 retlw D'177' ; 27 retlw D'167' ; 28 retlw D'156' ; 29 retlw D'143' ; 30 retlw D'135' ; 31 retlw D'120' ; 32 retlw D'110' ; 33 retlw D'096' ; 34 retlw D'086' ; 35 retlw D'073' ; 36 retlw D'063' ; 37 retlw D'035' ; 38 retlw D'012' ; 39 retlw D'000' ; 40 return ;============ ;============ SetMod movf MathBL,w andlw 0x03 addwf PCL,f goto SetWM goto SetFM goto SetAM return ;;;;;;;;;;;;;; SetLii movf MathBL,w andlw 0x03 addwf PCL, f goto SetMuteOn goto SetMuteOff goto SetMuteSw return ;============ ;============ SwNext movf RCVsts,w iorwf KBDtmp,w andlw 0x0f ; andlw 0x1f addwf PCL, f goto KEY_RGM_R goto KEY_RGM_M goto KEY_RGM_P goto KEY_RGM_S goto KEY_RGM_G goto KEY_RGM_H goto KEY_RGM_L goto KEY_RGM_m ;;;;;;;;;;;;;; goto KEY_ENT_MOD goto KEY_ENT_M goto KEY_ENT_P goto KEY_ENT_S goto KEY_ENT_G goto KEY_ENT_H goto KEY_ENT_L goto KEY_ENT_m KeyNop return ;============ ;============ CentralSwitch call GetKBD movwf KBDtmp movf KBDtmp,w btfsc STATUS,Z return bsf Flag2,LCDon movlw D'7' movwf LcdTmr decf KBDtmp,w call KbdTabi movwf KBDtmp btfss KBDtmp,BIT7 goto SwNext clrf KBDold clrf KBDset return ;============ ;============ TestRcv232 movf InpChr,f btfsc STATUS,Z return movf RCVsts,w btfss STATUS,Z return ; printc '[' ; printf InpChr ; printc ']' ;;;;;; Chr2Buf movlw InpBuf addwf InpInd,w movwf FSR movf InpChr,w movwf INDF call SndChr movf InpChr,w xorlw 0x0D btfsc STATUS,Z goto InpWrk incf InpInd,f movf InpInd,w xorlw D'10' btfsc STATUS,Z goto ERRinp clrf InpChr return InpWrk call Par2Dec call Dec2Bin ; printc '[' ; printf MathBH ; printc ':' ; printf MathBM ; printc ':' ; printf MathBL ; printc ']' movf InpBuf0,w xorlw '.' btfsc STATUS, Z call SetAsk movf InpBuf0,w xorlw ',' btfsc STATUS, Z call WrkSmtr movf InpBuf0,w xorlw '+' btfsc STATUS, Z call KEY_PLS_R movf InpBuf0,w xorlw '-' btfsc STATUS, Z call KEY_MNS_R movf InpBuf0,w xorlw 'U' btfsc STATUS, Z call SetUii movf InpBuf0,w xorlw 'G' btfsc STATUS, Z call SetGii movf InpBuf0,w xorlw 'S' btfsc STATUS, Z call SetStp movf InpBuf0,w xorlw 'M' btfsc STATUS, Z call SetMod movf InpBuf0,w xorlw 'L' btfsc STATUS, Z call SetLii movf InpBuf0,w xorlw 'F' btfsc STATUS, Z call SetFii EndWrk clrf InpInd clrf InpChr printc CR printc LF printc '>' return ERRinp clrf InpChr clrf InpInd printc CR printc LF printc 'E' printc 'r' printc 'r' printc CR printc LF printc '>' return ;;;;;;;;;;;;;; SetAsk call FrcPRN call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN return ;;;;;;;;;;;;;; SetStp movf MathBL,w andlw 0x07 movwf FrcvStep return ;;;;;;;;;;;;;; ;;;;;;;;;;;;;; SetMuteOff bcf MemFlg,Mute bcf Flag, Bo1 ; 1 - Mute ON 0 - Mute OFF call mc3362PLL return SetMuteOn bcf MemFlg,Mute bsf Flag, Bo1 ; 1 - Mute ON 0 - Mute OFF call mc3362PLL return SetMuteSw bsf MemFlg,Mute return ;;;;;;;;;;;;;; SetFii call Bin2Dec ; Normalizator 106.60x x == 0 ; x == 5 movf MathR3,w ; andlw 0x0F ; xorlw 0x05 ; movlw 0xF0 ; btfss STATUS,Z ; andwf MathR3,f ; ; call Dec2Bin ; movff MathBH,FrcvTmpH movff MathBM,FrcvTmpM movff MathBL,FrcvTmpL movff FrcvMinH,MathAH movff FrcvMinM,MathAM movff FrcvMinL,MathAL call D_Sub btfsc MathBH,7 retlw 1 movff FrcvMaxH,MathBH movff FrcvMaxM,MathBM movff FrcvMaxL,MathBL movff FrcvTmpH,MathAH movff FrcvTmpM,MathAM movff FrcvTmpL,MathAL call D_Sub btfsc MathBH,7 retlw 1 movff FrcvTmpH,FrcvWrkH movff FrcvTmpM,FrcvWrkM movff FrcvTmpL,FrcvWrkL call FchkBand call FsetPCH2 call SetFIN call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN return ;;;;;;;;;;;;;; SetUii movff MathBL,LevelDAC call SetDAC return ;;;;;;;;;;;;;; SetGii btfsc MathBL,BIT0 goto SetGon SetGoff bcf MemFlg,Gain call KSH14xPLL return SetGon bsf MemFlg,Gain call KSH14xPLL return ;;;;;;;;;;;;;; WrkSmtr call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN SMeter2 call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN return ;;;;;;;;;;;;;; GetChr clrf InpTmp movf InpInd,w btfsc STATUS,Z retlw 0 decf InpInd,f movf InpInd,w btfsc STATUS,Z retlw 0 movlw InpBuf addwf InpInd,w movwf FSR movf INDF,w movwf InpTmp movlw 0x30 subwf InpTmp,f btfss STATUS,C goto GetChr movlw D'10' subwf InpTmp,w btfsc STATUS,C goto GetChr movf InpTmp,w return ;;;;;;;;;;;;;; Par2Dec clrf MathR1 clrf MathR2 clrf MathR3 call GetChr iorwf MathR3,f swapf MathR3,f call GetChr iorwf MathR3,f swapf MathR3,f call GetChr iorwf MathR2,f swapf MathR2,f call GetChr iorwf MathR2,f swapf MathR2,f call GetChr iorwf MathR1,f swapf MathR1,f call GetChr iorwf MathR1,f swapf MathR1,f return ;============ ;============ POTSwitch GetAN Level0 movwf LevelW movlw D'40' movwf TmpCnt LoopFindU movf TmpCnt,w call POTTabi subwf LevelW,w btfss STATUS,C goto FindU btfsc STATUS,Z goto FindU decfsz TmpCnt, f goto LoopFindU retlw D'000' FindU movf TmpCnt,w return ;============================= ;============================= POTSync MACRO call POTSwitch movwf PotOld ENDM ;============================= ;============================= POTWork MACRO btfss Flag2,POTwr goto EndPwork call POTSwitch movwf TmpCnt subwf PotOld,w btfsc STATUS,Z goto POTTo1 movwf PotTmp btfsc STATUS,C goto MinusRF PlusRF comf PotTmp,f incf PotTmp,f movf TmpCnt,w movwf PotOld LoopPF movf RCVsts,f btfsc STATUS,Z movcf WriCnt,D'15' movcf LcdTmr,D'7' bsf Flag2,LCDon call KEY_PLS_R decfsz PotTmp, f goto LoopPF goto EndPwork MinusRF movf TmpCnt,w movwf PotOld LoopMF movf RCVsts,f btfsc STATUS,Z movcf WriCnt,D'15' movcf LcdTmr,D'7' bsf Flag2,LCDon call KEY_MNS_R decfsz PotTmp, f goto LoopMF goto EndPwork POTTo1 movf PotOld,f btfss STATUS,Z goto POTTo2 movcf LcdTmr,D'7' bsf Flag2,LCDon call KEY_MNS_R goto EndPwork POTTo2 movf PotOld,w xorlw D'40' btfss STATUS,Z goto EndPwork movcf LcdTmr,D'7' bsf Flag2,LCDon call KEY_PLS_R EndPwork nop ENDM ;============================= ;============================= POTNums btfsc Flag2,POTwr return call POTSwitch movwf TmpCnt subwf PotOld,w btfsc STATUS,Z return movf TmpCnt,w movwf PotOld movwf MemInd call Ind2Lcd movcf LcdTmr,D'7' bsf Flag2,LCDon btfsc Flag2,POTff goto INS_MEM_F return ;============================= ;============================= ;---------------- Set2MaxMin movcf FrcvMaxH,0x0c ;; 850.000 movcf FrcvMaxM,0xf8 movcf FrcvMaxL,0x50 movcf FrcvMinH,0x00 ;; 40.000 movcf FrcvMinM,0x9c movcf FrcvMinL,0x40 return ;---------------- SMeterWRK GetAN Level3 movwf LevelS call Delay104 call Delay104 call Delay104 call Delay104 GetAN Level3 movwf LevelS call SMeter return ;--- ;--- main clrf KBDold clrf KBDset clrf KBDcnt clrf MemInd clrf MemFlg clrf RCVsts clrf LcdBlc clrf InpInd ;clrf UapyCnt movcf UapyCnt,UapyNN clrf UapyM clrf UapyL ;;;;;;;;;;;;;;;; ; printc CR ; printc LF ; printc 'R' ; printc 'c' ; printc 'v' ; printc ' ' ; printc '1' ; printc '.' ; printc '0' ; printc CR ; printc LF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movcf AdrEEE,AdrScanL movcf FSR,FrcvMinH movlw D'6' call EE2Ram movlw 0xFF xorwf FrcvMinH,f btfss STATUS,Z goto BeginWrk movlw 0x40 ;; '------' movwf LcdBuf0 movwf LcdBuf1 movwf LcdBuf2 movwf LcdBuf3 movwf LcdBuf4 movwf LcdBuf5 movwf LcdBuf6 movwf LcdBuf7 call delay call delay call delay call delay call delay call delay call Set2MaxMin movcf AdrEEE,AdrScanL movcf FSR,FrcvMinH movlw D'6' call Ram2EE ;;;;;;;;;;;;;; movcf MathR0,B'00011001' ;; Bo2,Bo3 = 1 ; WF = 1 movcf MathR1,0x01 ;; 106.600 movcf MathR2,0xa0 movcf MathR3,0x68 movcf AdrEEE,AdrFrcv movcf FSR,MathR0 movlw D'4' call Ram2EE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BeginWrk call Set2MaxMin ; movcf FrcvWrkH,0x01 ;; 106.600 ; movcf FrcvWrkM,0xa0 ; movcf FrcvWrkL,0x68 ; movcf FrcvWooH,0x00 ;; 27.300 ; movcf FrcvWooM,0x6a ; movcf FrcvWooL,0xa4 ; ; movcf FrcvTttH,0x00 ;; 38.000 ; movcf FrcvTttM,0x94 ; movcf FrcvTttL,0x70 ; movcf FrcvWooH,0x00 ;; 26.600 ; movcf FrcvWooM,0x67 ; movcf FrcvWooL,0xe8 IF (PCH == 38) movcf FrcvTttH,0x00 ;; 38.000 movcf FrcvTttM,0x94 movcf FrcvTttL,0x70 ENDIF IF (PCH == 37) movcf FrcvTttH,0x00 ;; 37.300 movcf FrcvTttM,0x91 movcf FrcvTttL,0xb4 ENDIF IF (PCH == 33) movcf FrcvTttH,0x00 ;; 33.400 movcf FrcvTttM,0x82 movcf FrcvTttL,0x78 ENDIF IF (PCH == 31) movcf FrcvTttH,0x00 ;; 31.500 movcf FrcvTttM,0x7b movcf FrcvTttL,0x0c ENDIF movcf FrcvStep,0x01 ;; 10 kHz ;;;;;;;;; BeginMain clrf KBDold clrf KBDset clrf KBDcnt ; bcf Flag, Bo1 ; 1 - Mute ON 0 - Mute OFF ; bsf Flag, Bo2 ; 1 - WFM 0 - FM ; bsf Flag, Bo3 ; 1 - FM 0 - AM ; bsf MemFlg,LoBand ; bcf MemFlg,MiBand ; bcf MemFlg,HiBand bcf MemFlg,Gain bsf MemFlg,Mute ; 1 - Switch Mute work bsf Flag2,LCDon bsf Flag2,POTwr bsf Flag2,POTon bcf Flag2,POTff movcf LevelDAC,0xff call SetDAC ;--------------------- movcf MemInd,IndFrcv ;; Load work Frequency call INS_MEM_F clrf MemInd ;--------------------- movcf LcdBuf0,0x73 ;; "P" call Mod2Lcd ;--------------------- ; bcf Flag, CNG ;;; Minus bsf Flag, CNG ;;; Plus clrf WriCnt POTSync LoopInKBD btfss Flag2,TMRon goto NextStep1 ; printc '!' ;--------------------- movff MemInd,WriTmp movcf MemInd,IndFrcv call KEY_ENT_m movff WriTmp,MemInd clrf LcdBlc bcf Flag2,TMRon ;--------------------- NextStep1 btfsc Flag2,LCDon goto NextStep2 ;--------------------- Chk KBD btfsc PortKBD,BitKBD goto NextStep2 movcf LcdTmr,D'7' bsf Flag2,LCDon ;--------------------- NextStep2 btfsc MemFlg,ScanF call ScanerF call SMeterWRK ;!!! call UapyControl btfss Flag2,POTon goto POTnxt POTWork call POTNums POTnxt call SetMute call TestRcv232 call CentralSwitch goto LoopInKBD ;============================ ;============================ TmrWri ; decfsz TmrTmr,f ; return movf WriCnt,f btfsc STATUS,Z return decfsz WriCnt,f return bsf Flag2,TMRon return ;============================ ;============================ TmrLcd movf LcdTmr,f btfsc STATUS,Z return decfsz LcdTmr,f return IF (LCD_OnOff == 1) bcf Flag2,LCDon ELSE return ENDIF movlw D'16' movwf LcdTmp LoopLcdOutOff bcf PortLCDD,BitDAT ; Bit is zero bcf PortLCDC,BitCLC bsf PortLCDC,BitCLC decfsz LcdTmp, f goto LoopLcdOutOff bcf PortLCDC,BitCLC return ;============================ ;============================ SetAM bsf Flag, AM bcf Flag, FM bcf Flag, WM bsf Flag, Bo2 ; 1 - WFM 0 - FM bcf Flag, Bo3 ; 1 - WFM 0 - AM goto SetBx SetFM bcf Flag, AM bsf Flag, FM bcf Flag, WM bcf Flag, Bo2 ; 1 - WFM 0 - FM bsf Flag, Bo3 ; 1 - WFM 0 - AM goto SetBx SetWM bcf Flag, AM bcf Flag, FM bsf Flag, WM bsf Flag, Bo2 ; 1 - WFM 0 - FM bsf Flag, Bo3 ; 1 - WFM 0 - AM SetBx call mc3362PLL ;====== Mod2Lcd movlw 0xC8 ; 'WM' btfsc Flag, FM movlw 0xC1 ; 'c' btfsc Flag, AM movlw 0xC9 ; 'o' movwf LcdBuf1 return ;++++++++++++++++++++++++++++ ;++++++++++++++++++++++++++++ KEY_ENT_MOD btfsc Flag, WM goto SetFM btfsc Flag, FM goto SetAM btfsc Flag, AM goto SetWM return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_R movcf RCVsts, 0x01 movcf LcdBuf0,0xF2 ;; "N" clrf LcdBuf1 ;; " " bsf MemFlg,STEP1 bsf MemFlg,Mute return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_M movcf RCVsts,0x02 movcf LcdBuf0,0x3B ;; "" clrf LcdBuf1 ;; " " bsf MemFlg,STEP1 bsf Flag2, POTwr bcf Flag2, POTff call Wrk2MathB call Bin2Dec call Rcv2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_P btfsc MemFlg,ScanF return movcf RCVsts, 0x03 bcf Flag2,POTon movcf LcdBuf0,0xDA ;; "S" movcf LcdBuf1,0xD1 ;; "t" movcf LcdBuf2,0xD3 ;; "e" movcf LcdBuf3,0x73 ;; "p" clrf LcdBuf4 ;; " " clrf LcdBuf5 ;; " " call Step2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_S movcf RCVsts, 0x04 bcf Flag2,POTon movcf LcdBuf0,0x9B ;; "G" movcf LcdBuf1,0x7B ;; "a" movcf LcdBuf2,0x28 ;; "i" movcf LcdBuf3,0x49 ;; "n" clrf LcdBuf4 ;; " " call Gain2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_G movcf RCVsts, 0x05 movcf LcdBuf0,0x79 ;; "H" movcf LcdBlc, 0x80 clrf LcdBuf1 ;; " " bsf Flag2,POTon call Wrk2MathB call Bin2Dec call Rcv2Lcd bcf MemFlg,ScanF return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_H movcf RCVsts, 0x06 movcf LcdBuf0,0x91 ;; "L" movcf LcdBlc, 0x80 clrf LcdBuf1 ;; " " return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_L movcf RCVsts, 0x07 movcf LcdBlc, 0xC0 bcf Flag2, POTwr movf PotOld,w movwf MemInd call Ind2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RGM_m movcf RCVsts, 0x00 movcf LcdBuf0,0x73 ;; "P" call Mod2Lcd clrf LcdBlc bcf MemFlg,STEP1 bcf MemFlg,ScanF bsf Flag2, POTwr return ;;;;;;;;;;;;;;;;;;;;;;;;; SetMute btfss MemFlg,Mute return movf MuteCnt,w btfss STATUS,Z decf MuteCnt,f ;; GetAN Level3 ;; movwf LevelS movcf LevelW,D'255' GetAN Level1 subwf LevelW,w subwf LevelS,w btfss STATUS,C goto MuteON MuteOFF movcf MuteCnt, D'200' btfss Flag, Bo1 goto MuteSScan bcf Flag, Bo1 ; 1 - Mute ON 0 - Mute OFF call mc3362PLL MuteSScan btfsc MemFlg,ScanF goto StopScanF return MuteON movf MuteCnt,w btfss STATUS,Z return btfsc Flag, Bo1 return bsf Flag, Bo1 ; 1 - Mute ON 0 - Mute OFF call mc3362PLL return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_Pause cli call delay call delay call delay call delay call delay call delay call delay call delay call delay call delay call delay call delay sti return ;------- Gain2Lcd btfsc MemFlg,Gain goto OnGain OffGain movcf LcdBuf5,0xBB ;; "O" movcf LcdBuf6,0x53 ;; "f" movcf LcdBuf7,0x53 ;; "f" return OnGain movcf LcdBuf5,0xBB ;; "O" movcf LcdBuf6,0x49 ;; "n" clrf LcdBuf7 ;; " " return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_S incf FrcvStep,f btfsc FrcvStep,BIT3 ;;; 00001xxx clrf FrcvStep call Step2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_G btfss MemFlg,Gain goto GainOn GainOff bcf MemFlg,Gain call Gain2Lcd call KSH14xPLL return GainOn bsf MemFlg,Gain call Gain2Lcd call KSH14xPLL return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_M bcf Flag2, POTwr bsf Flag2, POTff movcf PotOld, 0xff goto POTNums ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_H movcf AdrEEE,AdrScanH goto KEY_wr ;-------- KEY_ENT_L movcf AdrEEE,AdrScanL KEY_wr clrf LcdBlc movcf FSR,FrcvWrkH movlw D'3' call Ram2EE call delay call delay call delay call delay movcf LcdBlc,0x80 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_m movff MemInd,AdrEEE movlw B'11111100' rlf AdrEEE,f rlf AdrEEE,f andwf AdrEEE,f clrf LcdBlc clrf MathR0 movff Flag,MathR0 movlw B'00011111' andwf MathR0,f movff FrcvWrkH,MathR1 movff FrcvWrkM,MathR2 movff FrcvWrkL,MathR3 movcf FSR,MathR0 movlw D'4' call Ram2EE call delay call delay call delay call delay movcf LcdBlc,0xC0 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_ENT_P btfsc MemFlg,ScanF goto StopScanF movcf AdrEEE,AdrScanL movcf FSR,FrcvMinH movlw D'6' call EE2Ram ;;;;;;;;;;;;;;;;;;;;;;; movff FrcvMaxH,MathBH movff FrcvMaxM,MathBM movff FrcvMaxL,MathBL movff FrcvMinH,MathAH movff FrcvMinM,MathAM movff FrcvMinL,MathAL call D_Sub ;;; B = B - A btfss MathBH, 7 goto NextScanF movcf AdrEEE,AdrScanL movcf FSR,FrcvMaxH movlw D'3' call EE2Ram movcf AdrEEE,AdrScanH movcf FSR,FrcvMinH movlw D'3' call EE2Ram NextScanF btfss MemFlg,STEP1 goto BeginScanF movff FrcvMinH,FrcvWrkH movff FrcvMinM,FrcvWrkM movff FrcvMinL,FrcvWrkL BeginScanF clrf MuteCnt bsf MemFlg,ScanF bcf MemFlg,STEP1 return StopScanF call Set2MaxMin bcf MemFlg,ScanF return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ScanerM ; ; goto KEY_PLS_M ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ScanerF call FrcvDelta call FchkBand call FsetPCH2 btfsc Flag, DON call Revers call SetFIN call SMeter2 call GLevel call ULevel return ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; INS_MEM_F movff MemInd,AdrEEE ;; MemInd -> AdrEEE movlw B'11111100' rlf AdrEEE,f rlf AdrEEE,f andwf AdrEEE,f movcf FSR,MathR0 movlw D'4' call EE2Ram btfsc MathR0,BIT7 goto NO_SET_MEM ; printc '[' ; printf AdrEEE ; printc '=' ; printf MathR0 ; printc '-' ; printf MathR1 ; printc '-' ; printf MathR2 ; printc '-' ; printf MathR3 ; printc ']' movlw B'11100000' andwf Flag,w iorwf MathR0,w movwf Flag movff MathR1,FrcvWrkH movff MathR2,FrcvWrkM movff MathR3,FrcvWrkL call Ind2Lcd call FchkBand call FsetPCH2 call SetFIN call SMeter2 clrf MuteCnt return NO_SET_MEM movlw 0x40 ;; '------' movwf LcdBuf2 movwf LcdBuf3 movwf LcdBuf4 movwf LcdBuf5 movwf LcdBuf6 movwf LcdBuf7 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;KEY_PLS_P ; ; btfsc MemFlg,ScanF ; return ;-------- KEY_PLS_R bsf Flag, CNG ;;; Plus call FrcvDelta call FchkBand call FsetPCH2 btfsc Flag, DON call Revers call SetFIN call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN clrf MuteCnt return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;KEY_MNS_P ; ; btfsc MemFlg,ScanF ; return ;-------- KEY_MNS_R bcf Flag, CNG ;;; Minus call FrcvDelta call FchkBand call FsetPCH2 btfsc Flag, DON call Revers call SetFIN call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN clrf MuteCnt return ;--------------------- PutD movwf TmpOut swapf TmpOut,w call GetCod call SndChr movlw '.' call SndChr movf TmpOut,w call GetCod call SndChr return ;--------------------- PutH movwf TmpOut swapf TmpOut,w call GetCod call SndChr movf TmpOut,w call GetCod call SndChr return ;--------------------- SndChr cli movwf SndReg movlw D'8' movwf SndCnt bsf Port232,BitTx ; Send Start bit SndNext call Delay104 rrf SndReg, f btfsc STATUS, C bcf Port232,BitTx ; Bit is one btfss STATUS, C bsf Port232,BitTx ; Bit is zero decfsz SndCnt, f goto SndNext call Delay104 SndStop bcf Port232,BitTx sti call Delay104 call Delay104 retlw 0 IF (MHZ == 10) ;--------------------- Delay104 ;;; This is delay for 104 usec movlw D'82' movwf CntDelay nop Loop_104 decfsz CntDelay,f goto Loop_104 ;;;;;;;;;;;;;;;;;;;;;;; retlw 0 ;--------------------- Delay52 ;;; This is delay for 52 usec movlw D'30' movwf CntDelay Loop_52 decfsz CntDelay,f goto Loop_52 ;;;;;;;;;;;;;;;;;;;;;;; retlw 0 ENDIF IF (MHZ == 4) ;--------------------- Delay104 ;;; This is delay for 104 usec movlw D'30' movwf CntDelay nop nop Loop_104 decfsz CntDelay,f goto Loop_104 ;;;;;;;;;;;;;;;;;;;;;;; PIC 16f819 ; nop ;;;;;;;;;;;;;;;;;;;;;;; retlw 0 ;--------------------- Delay52 ;;; This is delay for 52 usec movlw D'14' movwf CntDelay Loop_52 decfsz CntDelay,f goto Loop_52 ;;;;;;;;;;;;;;;;;;;;;;; retlw 0 ENDIF ;--------------------- delay movlw 0xFE movwf Tmp1 movlw 0xFE movwf Tmp2 x1 nop nop nop nop nop decfsz Tmp1,f goto x1 decfsz Tmp2,f goto x1 retlw 0 ;--------------------- Rcv232 movlw D'8' movwf InpCnt call Delay52 InpNext call Delay104 btfsc Port232,BitRx bcf STATUS, C btfss Port232,BitRx bsf STATUS, C rrf InpReg, f decfsz InpCnt, f goto InpNext call Delay104 btfss Port232,BitRx nop movf InpReg, w movwf InpChr bcf INTCON,RBIF goto Rcv232End ;--------------------- LcdOutput ;;;; For U-apy ;;;; btfss Flag2,DACon goto UapyDone bcf Flag2,DACon movff LevelDAC,LcdOutH movlw D'8' movwf LcdTmp LoopDacOut rlf LcdOutH,f btfsc STATUS, C bsf PortDAC,DacDAT ; Bit is one btfss STATUS,C bcf PortDAC,DacDAT ; Bit is zero bcf PortDAC,DacCLC bsf PortDAC,DacCLC decfsz LcdTmp, f goto LoopDacOut UapyDone ;;;; End U-apy ;;;; incf LcdCnt,f btfss LcdCnt,5 goto LcdStart ;;; -- for write -- ; movf LcdInd,w ; btfss STATUS,Z ; call TmrWri movf LcdInd,w btfsc STATUS,Z goto LcdStep1 decfsz TmrTmr,f goto LcdStep1 call TmrWri call TmrLcd ;; LcdStep1 movf LcdInd,w call LcdBits andwf LcdBlc,w btfsc STATUS,Z goto LcdStart clrw goto LcdNext LcdStart movlw LcdBuf addwf LcdInd,w movwf FSR movf INDF,w LcdNext ;;;;;;;;;;;;;;;;;;; btfss Flag2,LCDon goto KBD_End ;;;;;;;;;;;;;;;;;;; movwf LcdTmp call LcdTab1 movwf LcdOutH rrf LcdTmp,f rrf LcdTmp,f rrf LcdTmp,f rrf LcdTmp,f movf LcdTmp,w call LcdTab1 movwf LcdOutL movf LcdInd, w call LcdTab2 btfsc LcdInd, 2 andwf LcdOutL,f btfss LcdInd, 2 andwf LcdOutH,f ;;;;;;;;;;;;;;;;; OutPut To LED Display movlw D'8' movwf LcdTmp LoopLcdOutH rlf LcdOutH,f btfsc STATUS, C bsf PortLCDD,BitDAT ; Bit is one btfss STATUS, C bcf PortLCDD,BitDAT ; Bit is zero bcf PortLCDC,BitCLC bsf PortLCDC,BitCLC decfsz LcdTmp, f goto LoopLcdOutH movlw D'8' movwf LcdTmp LoopLcdOutL rlf LcdOutL,f btfsc STATUS, C bsf PortLCDD,BitDAT ; Bit is one btfss STATUS, C bcf PortLCDD,BitDAT ; Bit is zero bcf PortLCDC,BitCLC bsf PortLCDC,BitCLC decfsz LcdTmp, f goto LoopLcdOutL ;-!!!!!!!!!!!!!!!!!!!!!!!!!!!!! bcf PortLCDD,BitDAT bcf PortLCDC,BitCLC ;-!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;;;;;;;;;;;;;;;;; movf LcdInd, w movwf LcdTmp incf LcdTmp, f incf LcdInd,f btfsc LcdInd,3 clrf LcdInd ;################## KBD KBD_ii btfsc PortKBD,BitKBD goto KBD_Off KBD_On movf KBDold, w btfss STATUS, Z goto KBD_Yes ;;; Same Key ON movf LcdTmp, w movwf KBDold movwf KBDset clrf KBDcnt goto KBD_End KBD_Yes movf LcdTmp, w xorwf KBDold, w btfss STATUS, Z goto KBD_End incf KBDcnt, f ; btfss KBDcnt, 3 ;; 00001xxx 0x08 btfss KBDcnt, 4 ;; 0001xxxx 0x10 goto KBD_End ; movlw 0x07 ;; 00000111 0x07 movlw 0x0F ;; 00001111 0x0F movwf KBDcnt movf LcdTmp, w movwf KBDset goto KBD_End KBD_Off movf KBDold, w btfsc STATUS, Z goto KBD_End ;;; All Key OFF movf LcdTmp, w xorwf KBDold, w btfsc STATUS, Z clrf KBDold KBD_End ;;;;;;;;;;;;;;;;;;;;; bcf INTCON,TMR0IF goto LcdOutEnd ;return ;========================== GetKBD cli movf KBDset, w btfss STATUS, Z clrf KBDset sti return ;========================== Bin2Dec ;;; MathB24 (Bin) -> MathR (Dec) bcf STATUS, C movlw D'24' movwf MathCnt clrf MathR0 clrf MathR1 clrf MathR2 clrf MathR3 LoopBCD rlf MathBL,f rlf MathBM,f rlf MathBH,f rlf MathR3,f rlf MathR2,f rlf MathR1,f rlf MathR0,f decfsz MathCnt,f goto adjDEC retlw 0 ;;;;;; adjDEC movlw MathR3 movwf FSR call adjBCD movlw MathR2 movwf FSR call adjBCD movlw MathR1 movwf FSR call adjBCD movlw MathR0 movwf FSR call adjBCD goto LoopBCD ;;;;;; adjBCD movlw 3 addwf INDF,w movwf MathTmp btfsc MathTmp,3 movwf INDF movlw 30 addwf INDF,w movwf MathTmp btfsc MathTmp,7 movwf INDF retlw 0 ;========================== Div24x8 ;;; MathB24 / MathA8 -> MathC24 movlw D'24' movwf MathCnt clrf MathTmp LoopDiv rlf MathBL,f rlf MathBM,f rlf MathBH,f rlf MathTmp,f btfsc STATUS, C goto Div2 movf MathAL, w subwf MathTmp,w btfss STATUS, C goto Div3 Div2 movf MathAL, w subwf MathTmp,f bsf STATUS, C Div3 rlf MathCL,f rlf MathCM,f rlf MathCH,f decfsz MathCnt,f goto LoopDiv retlw 0 ;========================== D_Sub ;;; MathB24 - MathA24 -> MathB24 call Neg_A ;========================== D_Add ;;; MathB24 + MathA24 -> MathB24 movf MathAL,w addwf MathBL,f btfss STATUS,C goto D_Addx incf MathBM,f btfsc STATUS,Z incf MathBH,f D_Addx movf MathAM,w addwf MathBM,f btfsc STATUS,C incf MathBH,f movf MathAH,w addwf MathBH,f retlw 0 ;========================== Neg_A ;;; MathA24 -> -MathA24 comf MathAL,f comf MathAM,f comf MathAH,f incfsz MathAL,f retlw 0 incfsz MathAM,f retlw 0 incf MathAH,f retlw 0 ;========================== Dec2Bin ;;; MathR (Dec) -> MathB (Bin) clrf MathBH clrf MathBM clrf MathBL swapf MathR1,w call Mpy10 movf MathR1,w call Mpy10 swapf MathR2,w call Mpy10 movf MathR2,w call Mpy10 swapf MathR3,w call Mpy10 movf MathR3,w andlw 0x0F movwf MathAL clrf MathAH clrf MathAM call D_Add retlw 0 ;;;;; Mpy10 ;; MathB24 = ( MathB24 + W ) * 10 andlw 0x0F movwf MathAL clrf MathAH clrf MathAM call D_Add ;; MathB24 = MathB24 + W bcf STATUS,C rlf MathBL,w movwf MathAL rlf MathBM,w movwf MathAM rlf MathBH,w movwf MathAH ;; MathA24 = MathB24 * 2 bcf STATUS,C ;; MathB24 = MathB24 * 2 rlf MathBL,f rlf MathBM,f rlf MathBH,f bcf STATUS,C ;; MathB24 = MathB24 * 2 rlf MathBL,f rlf MathBM,f rlf MathBH,f bcf STATUS,C ;; MathB24 = MathB24 * 2 rlf MathBL,f rlf MathBM,f rlf MathBH,f call D_Add ;; MathB24 = MathB24 * 8 + MathA24 return ;----------------------- ;----------------------- SMeter movf LevelS,w movwf LevelW movlw LcdBuf7 movwf FSR movlw D'8' movwf TmpCnt Loop_S rlf LevelW,f btfsc STATUS, C goto Loop_L bcf INDF,BitS ; Bit is zero decf FSR,f decfsz TmpCnt,f goto Loop_S retlw 0 Loop_L bsf INDF,BitS ; Bit is 1 decf FSR,f decfsz TmpCnt,f goto Loop_L retlw 0 ;+++++++ GetLevel Bank0 movwf ADCON0 call Delay104 ; nop ; nop bsf ADCON0,GO WaitAD btfsc ADCON0,GO goto WaitAD movf ADRESH,w return ;;;;;;;;;;;;;;;;;;;;;;;; FsetPCH2 call Wrk2MathB call Bin2Dec clrf MathR1 clrf MathR2 call Dec2Bin movlw D'50' subwf MathBL,w btfss STATUS,C movf MathBL,w movwf MathAL clrf MathAH clrf MathAM IF (PCH == 38) movcf MathBH,0x00 ;; 27.300 (38.000) movcf MathBM,0x6a movcf MathBL,0xa4 ENDIF IF (PCH == 37) movcf MathBH,0x00 ;; 26.600 (37.300) movcf MathBM,0x67 movcf MathBL,0xe8 ENDIF IF (PCH == 33) movcf MathBH,0x00 ;; 22.700 (33.400) movcf MathBM,0x58 movcf MathBL,0xac ENDIF IF (PCH == 31) movcf MathBH,0x00 ;; 20.800 (31.500) movcf MathBM,0x51 movcf MathBL,0x40 ENDIF call D_Sub movff MathBH,FrcvWooH movff MathBM,FrcvWooM movff MathBL,FrcvWooL return ;;;;;;;;;;;;;;;;;;;;;;;; FchkBand ;---- ChkBAND Low movcf MathBH,0x02 ;; 155.000 movcf MathBM,0x5d movcf MathBL,0x78 call Wrk2MathA call D_Sub btfsc MathBH,7 goto ChkBandM bsf MemFlg,LoBand bcf MemFlg,MiBand bcf MemFlg,HiBand return ChkBandM ;---- ChkBAND Midle movcf MathBH,0x06 ;; 440.000 movcf MathBM,0xb6 movcf MathBL,0xc0 call Wrk2MathA call D_Sub btfsc MathBH,7 goto SetBandH bcf MemFlg,LoBand bsf MemFlg,MiBand bcf MemFlg,HiBand return SetBandH bcf MemFlg,LoBand bcf MemFlg,MiBand bsf MemFlg,HiBand return ;;;;;;;;;;;;;;;;;;;;;;;; FrcvDelta bsf Flag,DON btfss Flag,CNG goto Fminus ;---- PLUS movff FrcvMaxH,MathBH movff FrcvMaxM,MathBM movff FrcvMaxL,MathBL call Wrk2MathA call D_Sub btfsc MathBH,7 retlw 1 goto Fchg Fminus ;---- MINUS call Wrk2MathB movff FrcvMinH,MathAH movff FrcvMinM,MathAM movff FrcvMinL,MathAL call D_Sub btfsc MathBH,7 retlw 1 Fchg call Wrk2MathB clrf MathAH clrf MathAM movf FrcvStep,w call STPTab movwf MathAL btfsc Flag,CNG goto Fplus call D_Sub goto Fsave Fplus call D_Add Fsave movff MathBH,FrcvWrkH movff MathBM,FrcvWrkM movff MathBL,FrcvWrkL bcf Flag,DON retlw 0 ;;;;;;;;;;;;;;;;;;;;;;;; PLLSync nop nop nop bsf PortC7001,PllCLC nop nop nop nop bcf PortC7001,PllCLC return ;;;;;;;;;;;;;;;;;;;;;;;; mc3362PLL ;+++ call Woo2MathB movcf MathAL,D'5' call Div24x8 ;+++ Bank0 ;;; cli ;;; bsf PortE7001,PllCEN movlw D'8' ;; Out "D0" - "D7" movwf TmpCnt LoopPLLOutL rrf MathCL,f btfsc STATUS, C bsf PortD7001,PllDAT ; Bit is 1 btfss STATUS, C bcf PortD7001,PllDAT ; Bit is 0 call PLLSync decfsz TmpCnt, f goto LoopPLLOutL bcf MathCM,6 ;; "T0" -> 0 bcf MathCM,7 ;; "T1" -> 0 movlw D'8' ;; Out "D8" - "D13", "T0", "T1" movwf TmpCnt LoopPLLOutM rrf MathCM,f btfsc STATUS, C bsf PortD7001,PllDAT ; Bit is 1 btfss STATUS, C bcf PortD7001,PllDAT ; Bit is 0 call PLLSync decfsz TmpCnt, f goto LoopPLLOutM clrf MathCH btfsc Flag,Bo1 bsf MathCH,7 btfsc Flag,Bo2 bsf MathCH,6 btfsc Flag,Bo3 bsf MathCH,5 bsf MathCH,0 ;; FMIN ; bsf MathCH,3 ;; 10 kHZ ; bcf MathCH,2 ;; ; bcf MathCH,1 ;; bcf MathCH,3 ;; 5 kHZ bsf MathCH,2 ;; bsf MathCH,1 ;; movlw D'8' ;; Out "B0" - "B2", "TB","R0" - "R2","S" movwf TmpCnt LoopPLLOutH rlf MathCH,f btfsc STATUS, C bsf PortD7001,PllDAT ; Bit is 1 btfss STATUS, C bcf PortD7001,PllDAT ; Bit is 0 call PLLSync decfsz TmpCnt, f goto LoopPLLOutH bcf PortE7001,PllCEN ; End PLL bcf PortD7001,PllDAT ; ;;; sti ;;; retlw 0 ;;;;;;;;;;;;;;;;;;;;;;;; SetDAC bsf Flag2,DACon return ;;;;;;;;;;;;;;;;;;;;;;;; I2CInit bsf PortI2C,i2cCLC bsf PortI2C,i2cDAT return ;;;;;;;;;;;;;;;;;;;;;;;; I2CStart bsf PortI2C,i2cCLC bsf PortI2C,i2cDAT nop nop nop nop nop nop bcf PortI2C,i2cDAT nop nop nop nop nop nop bcf PortI2C,i2cCLC return ;;;;;;;;;;;;;;;;;;;;;;;; I2CStop bcf PortI2C,i2cDAT bsf PortI2C,i2cCLC nop nop nop nop nop nop bsf PortI2C,i2cDAT return ;;;;;;;;;;;;;;;;;;;;;;;; I2CSync nop nop nop nop nop nop bsf PortI2C,i2cCLC nop nop nop nop nop nop bcf PortI2C,i2cCLC return ;;;;;;;;;;;;;;;;;;;;;;;; I2COutByte movwf I2COut movlw D'8' movwf TmpCnt LoopI2COut rlf I2COut,f btfsc STATUS, C bsf PortI2C,i2cDAT ; Bit is 1 btfss STATUS, C bcf PortI2C,i2cDAT ; Bit is 0 call I2CSync decfsz TmpCnt, f goto LoopI2COut return ;;;;;;;;;;;;;;;;;;;;;;;; KSH14xPLL call Wrk2MathB ;============================== movff FrcvTttH,MathAH movff FrcvTttM,MathAM movff FrcvTttL,MathAL ;============================== call D_Add movcf MathAL,D'50' call Div24x8 call I2CStart movlw B'11000000' call I2COutByte call I2CSync ;; ASK movf MathCM,w call I2COutByte call I2CSync ;; ASK movf MathCL,w call I2COutByte call I2CSync ;; ASK movlw B'10001000' btfsc MemFlg,Gain movlw CONST__OnGAIN ;; Weak Signal Booster ON ;;;;;;;;movlw B'10001001' ;; Weak Signal Booster ON call I2COutByte call I2CSync ;; ASK movlw CONST__LoBAND ;; Low BAND (default) ;;;;;;;;movlw B'00000001' ;; Low BAND (default) btfsc MemFlg,MiBand movlw CONST__MiBAND ;;;;;;;;movlw B'00000010' btfsc MemFlg,HiBand movlw CONST__HiBAND ;movlw B'00001100' call I2COutByte call I2CSync ;; ASK call I2CStop return ;;;;;;;;;;;;;;;;;;;; Revers btfss Flag, CNG goto ReversPls bcf Flag, CNG return ReversPls bsf Flag, CNG return ;;;;;;;;;;;;;;;;;;;;;;;;; SLevel GetAN Level3 movwf MathBL clrf MathBM clrf MathBH call Bin2Dec printc ' ' printf MathR2 printf MathR3 return ;;;;;;;;;;;;;;;;;;;;;;;;; GLevel ; GetAN Level1 ; movwf MathBL ; clrf MathBM ; clrf MathBH ; ; call Bin2Dec ; ; printc ' ' ; printc ' ' ; printf MathR2 ; printf MathR3 return ;;;;;;;;;;;;;;;;;;;;;;;;; ULevel ; GetAN Level0 ; movwf MathBL ; clrf MathBM ; clrf MathBH ; ; call Bin2Dec ; ; printc ' ' ; printf MathR2 ; printf MathR3 return ;;;;;;;;;;;;;;;;;;;;;;;;; SetFIN call mc3362PLL call KSH14xPLL FrcPRN call Wrk2MathB call Bin2Dec call Rcv2Lcd printc CR printc LF printc 'F' printc ' ' GetAN Level3 movwf LevelS printf MathR1 printd MathR2 printf MathR3 GetAN Level3 movwf LevelS call SMeter ;------- SlvPRN movff LevelS,MathBL clrf MathBM clrf MathBH call Bin2Dec printc ' ' printf MathR2 printf MathR3 return ;---------------- ;---------------- ReadEE BANKSEL AdrEEE movf AdrEEE, w BANKSEL EEADR movwf EEADR BANKSEL EECON1 bcf EECON1, EEPGD bsf EECON1, RD BANKSEL EEDATA movf EEDATA, w BANKSEL AdrTMP movwf AdrTMP BANKSEL EECON1 bcf EECON1, EEPGD bsf EECON1, RD BANKSEL EEDATA movf EEDATA, w BANKSEL AdrTMP xorwf AdrTMP,f btfss STATUS,Z goto ReadEE return ;---------------- ;---------------- WriteEE BANKSEL EECON1 WaitWR btfsc EECON1, WR goto WaitWR BANKSEL EEDATA movwf EEDATA BANKSEL AdrEEE movf AdrEEE, w BANKSEL EEADR movwf EEADR BANKSEL EECON1 bcf EECON1, EEPGD bsf EECON1, WREN cli movcf EECON2, 0x55 movcf EECON2, 0xaa bsf EECON1, WR sti bcf EECON1, WREN BANKSEL EECON1 WaitWRo btfsc EECON1, WR goto WaitWRo BANKSEL AdrEEE return ;---------------- ;---------------- Ram2EE movwf TmpCnt CopyNext movf INDF, w call WriteEE incf FSR, f incf AdrEEE,f decfsz TmpCnt,f goto CopyNext return ;---------------- ;---------------- EE2Ram movwf TmpCnt Copy2Ram call ReadEE movwf INDF incf FSR, f incf AdrEEE,f decfsz TmpCnt,f goto Copy2Ram return ;---------------- Ram2Mem movff MemInd,AdrEEE ;; MemInd -> AdrEEE movlw B'11111100' rlf AdrEEE,f rlf AdrEEE,f andwf AdrEEE,f movcf FSR,MathR0 movlw D'4' call Ram2EE return ;---------------- Wrk2MathA movff FrcvWrkH,MathAH movff FrcvWrkM,MathAM movff FrcvWrkL,MathAL return ;---------------- Wrk2MathB movff FrcvWrkH,MathBH movff FrcvWrkM,MathBM movff FrcvWrkL,MathBL return ;---------------- ;---------------- Woo2MathB movff FrcvWooH,MathBH movff FrcvWooM,MathBM movff FrcvWooL,MathBL return ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; Rcv2Lcd movlw B'00000100' ; ',' andwf LcdBuf2,f andwf LcdBuf3,f andwf LcdBuf4,f andwf LcdBuf5,f andwf LcdBuf6,f andwf LcdBuf7,f swapf MathR1,w call LcdDigit iorwf LcdBuf2,f movf MathR1,w call LcdDigit iorwf LcdBuf3,f swapf MathR2,w call LcdDigit iorwf LcdBuf4,f movf MathR2,w call LcdDigit iorwf LcdBuf5,f swapf MathR3,w call LcdDigit iorwf LcdBuf6,f movf MathR3,w call LcdDigit iorwf LcdBuf7,f movlw B'10111011' ; "0" btfsc LcdBuf2,2 movlw B'10111111' ; "0," xorwf LcdBuf2,w movlw B'00000100' ; "," btfsc STATUS, Z andwf LcdBuf2,f return ;;;;;;;;;;;;;;;;;;;;;; Ind2Lcd clrf MathBH clrf MathBM movff MemInd,MathBL incf MathBL,f call Bin2Dec movlw B'00000100' ; ',' andwf LcdBuf0,f andwf LcdBuf1,f swapf MathR3,w call LcdDigit iorwf LcdBuf0,f movf MathR3,w call LcdDigit iorwf LcdBuf1,f return ;;;;;;;;;;;;;;;;;;;;;; Step2Lcd clrf MathBH clrf MathBM movf FrcvStep,w call STPTab movwf MathBL call Bin2Dec movlw B'00000100' ; ',' andwf LcdBuf5,f andwf LcdBuf6,f andwf LcdBuf7,f movf MathR2,w call LcdDigit iorwf LcdBuf5,f swapf MathR3,w call LcdDigit iorwf LcdBuf6,f movf MathR3,w call LcdDigit iorwf LcdBuf7,f return ;;;;;;;;;;; ;;;;;;;;;;; UapyControl clrf MathAH clrf MathAM movff LevelS,MathAL clrf MathBH movff UapyM,MathBM movff UapyL,MathBL call D_Add ;;; MathB24 + MathA24 -> MathB24 movff MathBM,UapyM movff MathBL,UapyL decfsz UapyCnt,f return UapyDIV movcf MathAL,UapyNN call Div24x8 ;;; MathB24 / MathA8 -> MathC24 ; printc '<' ; MathCL = (S-meter1 + ... + S-meterN) / N ; printf MathCL ; printc '>' movlw UapyHi subwf MathCL, w btfsc STATUS, C goto UapySUB ;; S-meter > UapyHi movlw UapyLo subwf MathCL, w btfss STATUS, C goto UapyADD ;; S-meter < UapyLo goto UapyEND UapyADD incf LevelDAC,w btfsc STATUS,Z goto UapyEND incf LevelDAC,f call SetDAC ; printc '+' goto UapyEND UapySUB movf LevelDAC,w btfsc STATUS,Z goto UapyEND decf LevelDAC,f call SetDAC ; printc '-' UapyEND clrf UapyM clrf UapyL movcf UapyCnt,UapyNN return END