⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e468.dt

📁 FM发射器的源代码,义隆MCU+三洋发射IC,LV2280方案.可实现睡眠,省电,发射频率88MHZ~108MHZ.
💻 DT
📖 第 1 页 / 共 2 页
字号:
;************************************************************
;*  Tilte:       FM TRANSMITER FOR CAR                      *
;*  Description: MCU:EM78P468N ,RF IC:Sanyo Lv2280          *
;                xtal 32.768Khz,                            *
;*  Company:     Protech microelectronics (sz) ltd.         *
;*  Author:      Ellison.Lan                                *
;*  Date:        23/08/2006                                 *
;*  Version:     v4.0                                       *
;************************************************************

	INCLUDE "EM78x468xx.INC"
    INCLUDE "clrEM78RamBank.INC"

;============================================
;    START 
;
;============================================

	ORG	000H
Reset:
	JMP	START
;==============================================================
;      INTERRUPT VECTOR
;
;;==============================================================
	ORG     00CH
	PAGE 0
	JMP     INTCNT1_PRO     ; COUNTER1 INTERRUPT ;YES
    ;
    ORG   020H
;==============================================================
;----------------------------------------------------------------
;Couter1 Interrupt process subroutine
;----------------------------------------------------------------
INTCNT1_PRO:
   ; NOP
	CLR     RF
	BS      WORKFLAGS,FGINTON
    ;;JBC     PORT5,5
    ;;JMP     CNT1DONE
    ;;MOV     A,@85
    ;;SUB     A,INCOUNT
    ;;JBC     STATUS,C
    ;;JMP     CNT1DONE
    ;;MOV     A,@84
    ;;MOV     INCOUNT,A    
CNT1DONE:
    JBS     PORT5,7           ;TEST POWER STATUS
	JMP     $+3
	CALL    PowerDispOff      ; If Power<2.8v Power Bar Shine
	JMP     $+2
	CALL    PowerDispOn
	NOP
	CALL    StatusBarOnOff    ; 0.5S ON OFF STATUS BAR.
	NOP                      ;User define for special purpose!!
	MOV     A,@85
	XOR     A,INCOUNT
	JBC     STATUS,Z         ; 
	BS      PORT8,3          ; 10SEC,LED OFF
	DJZ     INCOUNT
	JMP     INT_RET
 	BS     WORKFLAGS,TwoMinUp;
INT_RET:
    NOP
	RETI
;=======================================
;     Table for Display
;=======================================	
TABLE: 
    ADD PC,A
	RETL 0xeb               ;0
	RETL 0x0a               ;1
	RETL 0xC7               ;2
	RETL 0x8f               ;3
	RETL 0x2e               ;4
	RETL 0xad               ;5
	RETL 0xed               ;6
	RETL 0x0b               ;7
	RETL 0xef               ;8
	RETL 0xaf               ;9
;=============================
;	清除所有LCD RAM
;=============================	
CLR_LCD:
	CLRA
	MOV	TEMP1,A
Clr_ALCD:	
	MOV	A,TEMP1
	MOV	RA,A
	CLR	RB
	INC	TEMP1
	JBS	TEMP1,5
	JMP	Clr_ALCD
	RET	
;==============================
;	主程序开始 
;==============================
START:
    NOP
    BC STATUS,C
    MOV A,DispFreq_Hi
    SUB A,@0x10
    JBS STATUS,C
    JMP POWERRESET
    MOV A,@0x08
    SUB A,DispFreq_Hi
    JBS STATUS,C
    JMP POWERRESET
    JBS STATUS,Z
    JMP CheckCharity
    MOV A,@0x80
    SUB A,DispFreq_Lw
    JBS STATUS,C
    JMP POWERRESET
CheckCharity:
    NOP    
    MOV A,DispFreq_Hi
    SUB A,CharityData1
    JBS STATUS,Z
    JMP POWERRESET
    MOV A,DispFreq_Lw
    SUB A,CharityData2
    JBC STATUS,Z
    JMP Sys_Init
POWERRESET:
    NOP
    m468ClrRamBank         ;RAM clear
   ;
   ;
    MOV A,@0x08
	MOV DispFreq_Hi,A      ; Display Frequence preset is 88.0 Mhz
	MOV A,@0x80
	MOV DispFreq_Lw,A      ;
	;
	MOV A,@0x09
	MOV M1_Value_Hi,A       ; M1 PRESET-> 90.0Mhz
	MOV A,@0x00
	MOV M1_Value_Lw,A
	;
    MOV A,@0x09
	MOV M2_Value_Hi,A        ; M2 PRESET-> 95.0Mhz
	MOV A,@0x50
	MOV M2_Value_Lw,A
	;
	MOV A,@0x10
	MOV M3_Value_Hi,A        ; M3 PRESET-> 100.0Mhz
	MOV A,@0x00
	MOV M3_Value_Lw,A
	;
	MOV A,@0x10
	MOV M4_Value_Hi,A        ; M4 PRESET-> 105.0Mhz
	MOV A,@0x50
	MOV M4_Value_Lw,A
Sys_Init:
	MOV    A,@0b0011111
	MOV    R4,A            ;Bank 0 ,From 00 to 3F
	CLR    RC              ; counter disable
	CLR	RE              ;Disable INT0,P5.4 for IO
	CLR	RF              ;Clear Interrupt Status
	;
	IOPAGE 0
	MOV	A,@0xF1       ; p5.4 P5.5,P5.6~7 INTPUT , p7.0~3->SEGMENT,P7.4~7 ->IO P8-> General IO
	IOW	IOC50	
	;
	MOV	A,@0xff       ; P6 INPUT FOR KEY 
	IOW	IOC60	
	;
	MOV A,@0x70
	IOW IOC70         ;P7.7 OUTPUT P7.4~P7.6,INPUT PORT,P7.4,AGC ,P7.5->PA0,P7.6->PA1
	;
	CLRA
	;IOW	IOC80         ;P8 OUTPUT FOR IIC
	IOW	IOC90         ;RAM
	IOW	IOCA0
	IOW	IOCC0
	IOW	IOCD0
	IOW	IOCE0
    ;
	MOV A,@0b00010000
    IOW IOC80            ;P8.4 FOR POWER OFF TEST
	;
	MOV A,@0xff          ;
	IOW IOCB0            ;COUNTER1 PRESET IS 255
	;
	MOV	A,@0x08		    ;mask all interrpt,Enable Counter1
	IOW	IOCF0
	
	IOPAGE 1
	MOV	A,@0x04         ; P6 Wake up enable ,P8 Wake up enable
	IOW	IOC61
    ;
	CLRA  
	IOW	IOC71
	IOW	IOC81
	IOW	IOCA1
	IOW	IOCC1
	;IOW	IOCD1
	IOW	IOCE1
	;
	MOV    A,@0x05         ; CNT1 Scale 1:32, 1sec INT,USE 32.768Khz
	IOW    IOC91           ;
	MOV	A,@0xff         ;Enable P6 pull high resister function 
	IOW	IOCB1
    MOV    A,@0xff
	IOW    IOCD1           ;Enable P8 pull high resister function
	;=====   port init ================
    IOPAGE 0            ;Return IOPage 0-
	;
	MOV	A,@0xf0          ;PORT 5 HIGH
	MOV	PORT5,A	         ;initial system status
	MOV	A,@0xff
	MOV	PORT6,A         ;P6 high for KEYscan
	MOV	A,@0xfb         ;IIC PORT,SCL/P8.1,SDA/P8.0 HIGH,LV2280 POWER OFF   
	MOV	PORT8,A
	DISI
	WDTC
	Clr WORKFLAGS       ;Clear WorkFlags
    Clr DISPFLAGS
   ;========= SET PRESET VALUE===================
    CLRA
	MOV ControlByte1,A     ;
	MOV A,@0x02            ; TS1-TS0 :  Test Mode Dedault state is: "01" 
	MOV ControlByte2,A
	
	JBC PORT7,4            ; option
	BS ControlByte2,0      ; AGC
	JBC PORT7,5
	BS ControlByte2,3      ; PA0
	JBC PORT7,6
	BS ControlByte2,4      ; PA1
	;
    ;=============================================
LCD_Init:
	MOV	A,@0xe0		;1/3 Bias,1/4 duty,lcd off
	MOV	R9,A
    ;
	MOV A,@0xF5
	MOV RD,A            ;Main Clock 8MhZ,Sleep mode,fm MODE
	CALL delay_5ms      ;
    ;
	;CALL	CLR_LCD

Dis_ON:
    ;
	CALL Display_Freq;
	CALL DispFreq_Change  ; dispfreq to freq,save in 0x31,0x30 
    CALL ChangeCtrlByte   ; Change Freq To Controlbyte
	CALL WriteLV2280      ;
;	NOP
	; 
    BS RC,CNT1EN        ; Start counter1
    MOV A,@100          ; 2 MIN SETING 
	MOV INCOUNT,A        
    BC  PORT8,3          ; LCD ON
	MOV A,@0x60
	MOV KEYCnt,A           ; 3 Sec Key Hold
	CLR OldKeyNum
	CLR KeyNum
	ENI                    ;interrupt enable  
    ;
Key_Scan:
	MOV A,@20      ;DELAY 20MS
	CALL DELAY
	MOV A, PORT6
	XOR A,@0xFf
	JBC STATUS,Z   ;if key press, Z=0
	JMP NO_Key          ;无按键,                                                                                                  
Key_Dl:
    MOV A,@2       ; 去抖 
	CALL DELAY     ;
	MOV A,PORT6    ;
	XOR A,@0xFf
	JBC STATUS,Z   ;
	JMP NO_Key   ;
	;
    BC  WORKFLAGS,TwoMinUp ; Clear 2Min Flag
	;
	MOV A,@100
	MOV INCOUNT,A
	;
	BC  PORT8,3            ;LED ON 
	;
	MOV PORT6,TEMP1;
	MOV KeyNum,OldKeyNum
	MOV TEMP1,KeyNum
	MOV A,OldKeyNum
	XOR A,KeyNum
	JBC STATUS,Z       
	JMP KeyHoldprocess    ;if oldkeynum==keynum
	
	;BC  WORKFLAGS,KeyHold ;
	;BC  WORKFLAGS,LongKeyOn ;
	MOV A,@0x60
	MOV KEYCnt,A
	JBS KeyNum,1
	JMP IncFreq           ;Freq++
	JBS KeyNum,0
	JMP DecFreq           ;Freq--
	JBS KeyNum,2
	JMP ShowM1Freq        ;M1
	JBS KeyNum,3
	JMP ShowM2Freq        ;M2
	JBS KeyNum,4
	JMP ShowM3Freq        ;M3
	JBS KeyNum,5
	JMP ShowM4Freq        ;M4
	JBS KeyNum,6
	JMP PowerOn           ;Power on
    JMP Key_Scan
DispFreq:
    BC DISPFLAGS,ShowM
    CALL Display_Freq     ;
	CALL DispFreq_Change  ; dispfreq to freq,save in 0x31,0x30 
    CALL ChangeCtrlByte   ; Change Freq To Controlbyte
	CALL WriteLV2280      ;
;	NOP
	JMP Key_Scan
NO_Key:
	BC  WORKFLAGS,KeyHold ;
	CLR OldKeyNum
	CLR KeyNum
	MOV A,@0x60
	MOV KEYCnt,A
	JBC DISPFLAGS,ShowM
	JMP DispFreq
	JBC WORKFLAGS,LongKeyOn
	JMP SleepDone
	JBS WORKFLAGS,TwoMinUp
	JMP IdleDone           ;
	;NOP
	BC  WORKFLAGS,TwoMinUp ; Clear 2Min Flag
	MOV A,@100             ; 2 MIN RESETING 
	MOV INCOUNT,A          ;  
    ;
SleepDone:
    BC WORKFLAGS,LongKeyOn
	BS  PORT8,3             ;LED Off 
	BC PORT8,2              ;CLOSE LV2280 POWER
	CALL CLR_LCD
	BC RC,CNT1EN             ;CNT1 OFF 
	BC  R9,LCDEN            ; LCD OFF 
    BC RD,IDLE
SleepDone1:
	BC RD,CPUS              ;CPUS=0,ENTER GREEN MODE

	NOP
	SLEP
	NOP
	BS RD,CPUS              ;CPU=1,FROM GREEN MODE TO NARMAL MODE
	NOP
	NOP
;	NOP
	JMP Dis_ON
IdleDone:
    BS RD,IDLE
    BC RD,CPUS              ;CPUS=0,ENTER GREEN MODE
	NOP
	SLEP
	NOP
	BS RD,CPUS              ;CPU=1,FROM GREEN MODE TO NARMAL MODE
	NOP
	JBC    WORKFLAGS,FGINTON
	JMP    IdleDone12
	MOV     A,@85
    SUB     A,INCOUNT
    JBC     STATUS,C
    JMP     IdleDone12
    MOV     A,@84
    MOV     INCOUNT,A  
IdleDone12:	
	BC  WORKFLAGS,FGINTON
	JBC WORKFLAGS,LongKeyOn
	JMP SleepDone
;	NOP
;	NOP
	JMP  Key_Scan
;---------- Key Freq ++ Done --------------------
IncFreq:
    CLR  DISPFLAGS
    ;NOP
	BC STATUS,C
	MOV A,DispFreq_Lw
	ADD A,@0x01
	DAA
    MOV DispFreq_Lw,A
    JBS STATUS,C
	JMP CompMax            ; go to compare 108.0Mhz	
	MOV A,DispFreq_Hi
	ADD A,@0x01
	DAA
	MOV DispFreq_Hi,A
CompMax:
	MOV A,@0x10
	XOR A,DispFreq_Hi
	JBS STATUS,Z
	JMP SetKeyShowFlags
	MOV A,@0x81
	XOR A,DispFreq_Lw
	JBS STATUS,Z
	JMP SetKeyShowFlags
    MOV A,@0x80     ;If Freq>108Mhz, TURN TO 88.0Mhz
	MOV DispFreq_Lw,A
	MOV A,@0x08
    MOV DispFreq_Hi,A
    JMP SetKeyShowFlags
;------------------Key Freq-- --------------------------
DecFreq:
    CLR  DISPFLAGS
    ;NOP
	MOV DispFreq_Lw,DispFreq_Lw
	JBC STATUS,Z
	JMP DecHi           ;DispFreq_Lw==0,有借位。 
	MOV A,@0x99
	ADD A,DispFreq_Lw
	DAA
	MOV DispFreq_Lw,A
    JMP CompMin
DecHi:
    MOV A,@0x99
	MOV DispFreq_Lw,A
    MOV A,@0x99
	ADD A,DispFreq_Hi
	DAA
	MOV DispFreq_Hi,A
CompMin:
    MOV A,@0x08
	XOR A,DispFreq_Hi
	JBS STATUS,Z
	JMP SetKeyShowFlags
	MOV A,@0x79
	XOR A,DispFreq_Lw
	JBS STATUS,Z
	JMP SetKeyShowFlags
    MOV A,@0x80          ;If Freq<88.0Mhz, TURN TO 108.0Mhz
	MOV DispFreq_Lw,A
	MOV A,@0x10
    MOV DispFreq_Hi,A
;	JMP DispFreq
SetKeyShowFlags:
    JMP DispFreq
    ;BS DISPFLAGS,ShowM
	;JMP Key_Scan
;------------------ Key M1,M2,M3,M4 -------------------------
ShowM1Freq:
    MOV DispFreq_Hi,DispFreqTmp_Hi
    MOV DispFreq_Lw,DispFreqTmp_Lw
    MOV M1_Value_Hi,DispFreq_Hi
	MOV M1_Value_Lw,DispFreq_Lw
	Clr DISPFLAGS
	BS  DISPFLAGS,M1on
    BS DISPFLAGS,ShowM
	JMP Key_Scan
ShowM2Freq:
	MOV DispFreq_Hi,DispFreqTmp_Hi
    MOV DispFreq_Lw,DispFreqTmp_Lw
	MOV M2_Value_Hi,DispFreq_Hi
	MOV M2_Value_Lw,DispFreq_Lw
	Clr DISPFLAGS
	BS  DISPFLAGS,M2on
    BS DISPFLAGS,ShowM
	JMP Key_Scan
ShowM3Freq:
	MOV DispFreq_Hi,DispFreqTmp_Hi
    MOV DispFreq_Lw,DispFreqTmp_Lw
	MOV M3_Value_Hi,DispFreq_Hi
	MOV M3_Value_Lw,DispFreq_Lw
	Clr DISPFLAGS
	BS  DISPFLAGS,M3on
	BS DISPFLAGS,ShowM
	JMP Key_Scan
ShowM4Freq:
	MOV DispFreq_Hi,DispFreqTmp_Hi
    MOV DispFreq_Lw,DispFreqTmp_Lw
	MOV M4_Value_Hi,DispFreq_Hi
	MOV M4_Value_Lw,DispFreq_Lw
	Clr DISPFLAGS
	BS  DISPFLAGS,M4on
	BS DISPFLAGS,ShowM
	JMP Key_Scan
;----------------- Key Power On -------------------------
PowerOn:
   ; BS WORKFLAGS,LongKeyOn
	NOP
	JMP   DispFreq
;---------------- Hold Key Done -------------------------
KeyHoldprocess:
	JBC  WORKFLAGS,KeyHold
	JMP  KeyHoldDone2  
	DJZ     KEYCnt            ; TEST LONG KEY 
	JMP Key_Scan
KeyHoldDone:
	MOV A,@0x60
	MOV KEYCnt,A
	;
	JBS KeyNum,1
	JMP QuickAdd
	JBS KeyNum,0
	JMP QuickDec	
	JBS KeyNum,2
	JMP SaveM1
	JBS KeyNum,3
	JMP SaveM2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -