;************************************************************* ;************************************************************* ; ; Source code for P-45M receiver (version 0.3) ; ; 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 P45M_v03.asm ; ; For KS-H-132 compile: mpasm.exe /dKSH=132 /q P45M_v03.asm ; ;************************************************************* ; ; distribute by GPL licence ; ;************************************************************* ;************************************************************* list p=16f819 #include errorlevel -302 ; suppress message 302 from list file __CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _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 PortMOD equ PORTB MODclc equ BIT7 MODdat equ BIT6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BitS equ 0x02 ; ',' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CR equ 0DH ;;; \r LF equ 0AH ;;; \n BS equ 08H ;;; \b ;******************************** ;***** VARIABLE DEFINITIONS ***** ;******************************** ;----- RS-232 Port ----- ; ;----- SndChr ----- SndCnt equ 0x20 SndReg equ 0x21 ;----- Delay 104 ----- ;----- Delay 52 ----- CntDelay equ 0x22 ;----- delay ----- Tmp1 equ 0x23 Tmp2 equ 0x24 ;----- PutD ----- ;----- PutH ----- TmpOut equ 0x25 ;----------------------- ;----- LCD Display ----- LcdOutH equ 0x26 LcdOutL equ 0x27 LcdTmp equ 0x28 LcdInd equ 0x29 LcdCnt equ 0x2A KBDind 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 WrkMm equ D'0' WrkHi equ D'1' WrkLo equ D'2' TMRon equ D'3' LCDon equ D'4' DACfl equ D'5' DACon equ D'6' PRES2 equ D'7' ;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; Flag3 equ 0x67 InpFc equ D'0' Memfl equ D'1' ;;;;;;;;;;;;;;;;;;;;;;;;; InpInd equ 0x68 InpTmp equ 0x69 iFbuf1 equ 0x6a iFbuf2 equ 0x6b iFbuf3 equ 0x6c 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 0xF0 AdrScanH equ 0xF3 AdrFrcv equ 0xF8 ;; 0xF8 -> 248 / 4 = 62 (IndFrcv) IndFrcv equ D'62' ;############################# DontWrkIf_scan MACRO btfsc MemFlg,ScanM return btfsc MemFlg,ScanF return ENDM ;------------- ;############################# DontWrkIf_writeMem MACRO btfsc Flag2,WrkHi return btfsc Flag2,WrkLo return btfsc Flag2,WrkMm return 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 clrf STATUS movwf Save_S ;++++++++++++++++ movf FSR, w movwf Save_F ;++++++++++++++++ ;;;; 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) movlw B'00000000' ; set RB6 - Out (Rx RS-232) movwf TRISB ; ;;;;; 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 clrf KBDind 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 0x0f addwf PCL, f retlw 0xff ; nop retlw 0x07 ; "7" retlw 0x0b ; "E" retlw 0x0a ; "F" retlw 0x00 ; "0" retlw 0x01 ; "1" retlw 0x05 ; "5" ;0x00 ;;Regim retlw 0x04 ; "4" ;0x08 ;;Enter retlw 0x08 ; "8" retlw 0x0c ; "+" retlw 0x0d ; "-" retlw 0x09 ; "9" retlw 0x06 ; "6" retlw 0x03 ; "3" retlw 0x02 ; "2" retlw 0xff ; 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 ;============ ;============ SwNext movf KBDtmp,w andlw 0x0f btfsc Flag3,InpFc iorlw 0x10 addwf PCL,f goto KEY_ENT_MOD goto KEY_STEP goto KEY_GAIN goto KEY_Uapy goto KEY_Wri_Hi goto KEY_Wri_Mem goto KEY_Wri_Lo goto KEY_Scan_F goto KEY_Mem2Wrk goto KEY_Scan_M goto KEY_INP_F goto KEY_RADIO goto KEY_PLUS goto KEY_MINUS goto Key_Nop goto Key_Nop ;-InpFc goto Key_i0 goto Key_i1 goto Key_i2 goto Key_i3 goto Key_i4 goto Key_i5 goto Key_i6 goto Key_i7 goto Key_i8 goto Key_i9 goto KEY_INP_F goto KEY_RADIO goto Key_Nop goto Key_Nop goto Key_Nop goto Key_Nop Key_Nop 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 ;----- ;----- RLFbuf movlw D'4' movwf TmpCnt LoopRlf bcf STATUS,C rlf iFbuf3,f rlf iFbuf2,f rlf iFbuf1,f decfsz TmpCnt, f goto LoopRlf return ;-------- ;-------- Buf2Dec clrf MathR0 movff iFbuf1,MathR1 movff iFbuf2,MathR2 movff iFbuf3,MathR3 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 ;;;;;;; SMeter2 call SMeterWRK call SlvPRN call SMeterWRK call SlvPRN 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 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 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 bsf MemFlg,STEP1 bcf MemFlg,Gain bsf MemFlg,Mute ; 1 - Switch Mute work clrf Flag2 clrf Flag3 bsf Flag2,LCDon bsf Flag2,DACon 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 ;:::::::: 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,ScanM call ScanerM btfsc MemFlg,ScanF call ScanerF call SMeterWRK call UapyControl call SetMute 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 Flag2,PRES2 return btfsc Flag, WM goto SetFM btfsc Flag, FM goto SetAM btfsc Flag, AM goto SetWM return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_STEP DontWrkIf_scan DontWrkIf_writeMem btfss Flag2,PRES2 goto Step4Lcd incf FrcvStep,f btfsc FrcvStep,BIT3 ;;; 00001xxx clrf FrcvStep Step4Lcd bsf Flag2,PRES2 movcf LcdBuf0,0xDA ;; "S" movcf LcdBuf1,0xD1 ;; "t" movcf LcdBuf2,0xD3 ;; "e" movcf LcdBuf3,0x73 ;; "p" clrf LcdBuf4 ;; " " clrf LcdBuf5 ;; " " call Step2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_GAIN DontWrkIf_scan DontWrkIf_writeMem btfss Flag2,PRES2 goto Gain4Lcd btfss MemFlg,Gain goto GainOn GainOff bcf MemFlg,Gain call KSH14xPLL goto Gain4Lcd GainOn bsf MemFlg,Gain call KSH14xPLL Gain4Lcd bsf Flag2,PRES2 movcf LcdBuf0,0x9B ;; "G" movcf LcdBuf1,0x7B ;; "a" movcf LcdBuf2,0x28 ;; "i" movcf LcdBuf3,0x49 ;; "n" clrf LcdBuf4 ;; " " call Gain2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Uapy DontWrkIf_scan DontWrkIf_writeMem btfss Flag2,PRES2 goto Uapy4Lcd btfss Flag2,DACon goto UapyOn UapyOff movcf LevelDAC,0xff bsf Flag2,DACfl bcf Flag2,DACon goto Uapy4Lcd UapyOn bsf Flag2,DACon Uapy4Lcd bsf Flag2,PRES2 movcf LcdBuf0,0xB9 ;; "U" movcf LcdBuf1,0x7B ;; "A" movcf LcdBuf2,0x73 ;; "P" movcf LcdBuf3,0xF8 ;; "Y" clrf LcdBuf4 ;; " " call Uapy2Lcd return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_RADIO movcf LcdBuf0,0x73 ;; "P" call Mod2Lcd btfsc MemFlg,ScanF call StartStopScaner clrf LcdBlc bsf MemFlg,STEP1 bcf MemFlg,ScanF bcf MemFlg,ScanM bcf Flag2, PRES2 bcf Flag2, WrkMm bcf Flag2, WrkHi bcf Flag2, WrkLo bcf Flag3, InpFc bcf Flag3, Memfl goto SetFIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Scan_F btfsc MemFlg,ScanM return btfsc Flag2,WrkHi return btfsc Flag2,WrkLo return btfsc Flag2,WrkMm return btfsc Flag3,Memfl return bcf Flag2, PRES2 movcf LcdBuf0,0x3B ;; "POISK" call Mod2Lcd goto StartStopScaner ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Scan_M btfsc MemFlg,ScanF return btfsc Flag2,WrkHi return btfsc Flag2,WrkLo return btfsc Flag2,WrkMm return btfsc Flag3,Memfl return bcf Flag2, PRES2 btfsc MemFlg,ScanM goto StopScanM bsf MemFlg,ScanM return StopScanM bcf MemFlg,ScanM return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Mem2Wrk DontWrkIf_scan DontWrkIf_writeMem bsf Flag3,Memfl call Ind2Lcd goto INS_MEM_F ;;;;;; Key_i9 movlw D'9' goto Key_ii ;;;;;; Key_i8 movlw D'8' goto Key_ii ;;;;;; Key_i7 movlw D'7' goto Key_ii ;;;;;; Key_i6 movlw D'6' goto Key_ii ;;;;;; Key_i5 movlw D'5' goto Key_ii ;;;;;; Key_i4 movlw D'4' goto Key_ii ;;;;;; Key_i3 movlw D'3' goto Key_ii ;;;;;; Key_i2 movlw D'2' goto Key_ii ;;;;;; Key_i1 movlw D'1' goto Key_ii ;;;;;; Key_i0 movlw D'0' Key_ii movwf InpTmp call RLFbuf movff LcdBuf3,LcdBuf2 movff LcdBuf4,LcdBuf3 movff LcdBuf5,LcdBuf4 movff LcdBuf6,LcdBuf5 movff LcdBuf7,LcdBuf6 movf InpTmp, w iorwf iFbuf3, f call LcdDigit movwf LcdBuf7 incf InpInd,f movf InpInd,w xorlw D'6' btfss STATUS,Z return call Buf2Dec call Dec2Bin call SetFii goto KEY_RADIO ;;;;;;;;; KEY_INP_F DontWrkIf_scan DontWrkIf_writeMem btfsc Flag2,PRES2 return btfsc Flag3,Memfl goto MemClear bsf Flag3,InpFc movcf LcdBuf0,0x53 ;; "F" call Mod2Lcd clrf LcdBlc clrf InpInd clrf iFbuf1 clrf iFbuf2 clrf iFbuf3 clrf LcdBuf7 clrf LcdBuf6 clrf LcdBuf5 clrf LcdBuf4 clrf LcdBuf3 clrf LcdBuf2 return ;======= MemClear movlw 0xff movwf MathR0 movwf MathR1 movwf MathR2 movwf MathR3 movff MemInd,AdrEEE movlw B'11111100' rlf AdrEEE,f rlf AdrEEE,f andwf AdrEEE,f movcf FSR,MathR0 movlw D'4' call Ram2EE movcf LcdBlc,0xff call delay call delay call delay call delay clrf LcdBlc goto INS_MEM_F ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Wri_Hi DontWrkIf_scan btfsc Flag2,PRES2 return btfsc Flag3,Memfl return btfsc Flag2,WrkHi goto WriHiYes bsf Flag2,WrkHi bcf Flag2,WrkLo bcf Flag2,WrkMm movcf LcdBuf0,0x79 ;; "H" movcf LcdBlc, 0x80 clrf LcdBuf1 ;; " " call Wrk2MathB call Bin2Dec call Rcv2Lcd return WriHiYes call KEY_ENT_H goto KEY_RADIO return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Wri_Lo DontWrkIf_scan btfsc Flag2,PRES2 return btfsc Flag3,Memfl return btfsc Flag2,WrkLo goto WriLoYes bsf Flag2,WrkLo bcf Flag2,WrkHi bcf Flag2,WrkMm movcf LcdBuf0,0x91 ;; "L" movcf LcdBlc, 0x80 clrf LcdBuf1 ;; " " call Wrk2MathB call Bin2Dec call Rcv2Lcd return WriLoYes call KEY_ENT_L goto KEY_RADIO return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY_Wri_Mem DontWrkIf_scan btfsc Flag2,PRES2 return btfsc Flag3,Memfl return btfsc Flag2,WrkMm goto WriMemYes bsf Flag2,WrkMm bcf Flag2,WrkHi bcf Flag2,WrkLo movcf LcdBlc,0xC0 call Ind2Lcd call Wrk2MathB call Bin2Dec call Rcv2Lcd return WriMemYes call KEY_ENT_m goto KEY_RADIO return ;;;;;;;;; IncMemInd movlw D'60' incf MemInd, f xorwf MemInd, w btfsc STATUS, Z clrf MemInd call Ind2Lcd return ;;;;;;;;; DecMemInd movlw D'59' decf MemInd, f btfsc MemInd, BIT7 movwf MemInd call Ind2Lcd return ;;;;;;;;;; Mem2RcvPls call IncMemInd goto INS_MEM_F ;;;;;;;;;; Mem2RcvMns call DecMemInd goto INS_MEM_F ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 ;;;;;;;;;;;;;;;;;;;;;;;;; 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,ScanM bcf MemFlg,ScanM 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 ;------- Uapy2Lcd btfsc Flag2,DACon goto OnUapy OffUapy movcf LcdBuf5,0xBB ;; "O" movcf LcdBuf6,0x53 ;; "f" movcf LcdBuf7,0x53 ;; "f" return OnUapy movcf LcdBuf5,0xBB ;; "O" movcf LcdBuf6,0x49 ;; "n" clrf LcdBuf7 ;; " " return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; StartStopScaner 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 ;;;;; if ( Fwrk > Fmax ) movff FrcvMaxH,MathBH movff FrcvMaxM,MathBM movff FrcvMaxL,MathBL call Wrk2MathA call D_Sub btfsc MathBH,7 goto SetBeginFScan ; if (Fwrk > Fmax) { Fwrk = Fmin } ;;;;; if ( Fwrk < Fmin ) call Wrk2MathB movff FrcvMinH,MathAH movff FrcvMinM,MathAM movff FrcvMinL,MathAL call D_Sub btfss MathBH,7 goto BeginScanF ; if (Fwrk < Fmin) { Fwrk = Fmin } SetBeginFScan movff FrcvMinH,FrcvWrkH ;; Fwrk = Fmin movff FrcvMinM,FrcvWrkM ; movff FrcvMinL,FrcvWrkL ; BeginScanF clrf MuteCnt bsf MemFlg,ScanF bcf MemFlg,STEP1 return StopScanF call Set2MaxMin bcf MemFlg,ScanF return ;;;;;;;;;;;;;;;;;;;;;;;;; ScanerM call IncMemInd goto INS_MEM_F ;;;;;;;;;;;;;;;;;;;;;;;;; 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 btfss MemFlg,ScanM return call SMeter2 call SMeter2 call SMeter2 call SMeter2 call SMeter2 call SMeter2 return NO_SET_MEM btfsc MemFlg,ScanM goto FindFullMem movlw 0x40 ;; '------' movwf LcdBuf2 movwf LcdBuf3 movwf LcdBuf4 movwf LcdBuf5 movwf LcdBuf6 movwf LcdBuf7 return FindFullMem movf MemInd, w btfsc STATUS, Z return call IncMemInd goto INS_MEM_F ;------- KEY_PLUS btfsc Flag2,WrkMm goto IncMemInd btfsc Flag3,Memfl goto Mem2RcvPls btfsc Flag2,PRES2 return ;-- 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_MINUS btfsc Flag2,WrkMm goto DecMemInd btfsc Flag3,Memfl goto Mem2RcvMns btfsc Flag2,PRES2 return ;-- 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 nop ;!!bcf Port232,BitTx ; Bit is one btfss STATUS, C nop ;!!bsf Port232,BitTx ; Bit is zero decfsz SndCnt, f goto SndNext call Delay104 SndStop nop ;!!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 ;;;;;;;;;;;;;;;;;;;;;;; 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 ;--------------------- LcdOutput ;;;; For U-apy ;;;; btfss Flag2,DACfl goto UapyDone bcf Flag2,DACfl 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 movlw D'16' movwf LcdTmp LoopKBD movf LcdTmp, w xorwf KBDind, w btfss STATUS, Z bsf PortMOD,MODdat ; Bit is one btfsc STATUS, Z bcf PortMOD,MODdat ; Bit is zero bcf PortMOD,MODclc bsf PortMOD,MODclc decfsz LcdTmp,f goto LoopKBD movf KBDind, w movwf LcdTmp incf LcdTmp, f incf KBDind, f btfsc KBDind, 4 clrf KBDind 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 ;; Timer PRESS & WAIT 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 movcf WriCnt,D'15' ;; Set Timer for write Fwrk to EEPROM 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,DACfl 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 btfss Flag2,DACon return 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