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

📄 main.asm

📁 EM78P153源代码,含24C02,I2C,以及1418FM发射模块控制部分!
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		;显示频率
		CALL	ConvertFm
		CALL	LcdShowFm

		;显示频道
		MOV		A,FmChannel
		CALL	LcdShowCh

		;通知发射模块改变频率
		MOV		A,FmMode
		CALL	SpiFmWrite

		;清CH标志
		BC		FmChange,BIT_CH_CHG
		JMP		Main
;----------------------------------------------------
labModeChange:
		JBC		MenuMode,0
		JMP		labSaveDone

		;保存频道
		MOV		A,@ChAddress
		MOV		I2cAddr,A
		MOV		A,FmChannel
		MOV		I2cData,A
		CALL	I2cWrite
		CALL	Delay5ms

		;保存频率
		MOV		A,FmChannel
		MOV		I2cAddr,A
		MOV		A,FmMode
		MOV		I2cData,A
		CALL	I2cWrite
		CALL	Delay5ms

labSaveDone:
		;显示频率(87.5-108.0)
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

		;显示频道(1~8)
		MOV		A,FmChannel
		CALL	LcdShowCh

		;改变频率
		MOV		A,FmMode
		CALL	SpiFmWrite

		;清标志
		BC		FmChange,BIT_MD_CHG

		;调试读出的数据
		;JMP	Debug24C02
		JMP		Main

;===============================================
;	Function:DigitChar(A)
;===============================================	
TblDigitChar:
		;[?]-[D|E|G|F,H|C|B|A]
		;[0]-[1,1,0,1-0,1,1,1][D7]
		;[1]-[0,0,0,0-0,1,1,0][06]
		;[2]-[1,1,1,0-0,0,1,1][E3]
		;[3]-[1,0,1,0-0,1,1,1][A7]
		;[4]-[0,0,1,1-0,1,1,0][36]
		;[5]-[1,0,1,1-0,1,0,1][B5]
		;[6]-[1,1,1,1-0,1,0,1][F5]
		;[7]-[0,0,0,0-0,1,1,1][07]
		;[8]-[1,1,1,1-0,1,1,1][F7]
		;[9]-[1,0,1,1-0,1,1,1][B7]
		;[-]-[0,0,1,0-0,0,0,0][20]
		;[ ]-[0,0,0,0-0,0,0,0][00]
		AND		A,@0x0f
		ADD	 	PC, A
		RETL 	@0xD7 ;0
		RETL 	@0x06 ;1
		RETL 	@0xE3 ;2
		RETL 	@0xA7 ;3
		RETL 	@0x36 ;4
		RETL 	@0xB5 ;5
		RETL 	@0xF5 ;6
		RETL 	@0x07 ;7
		RETL 	@0xF7 ;8
		RETL 	@0xB7 ;9
		RETL 	@0x20 ;A
		RETL 	@0x00 ;B
		RETL 	@0x00 ;C
		RETL 	@0x00 ;D
		RETL 	@0x00 ;E
		RETL 	@0x00 ;F
		;Return And Load to A

;===============================================
;	Function:TblDataIcon(A)
;===============================================	
TblDataIcon:
		;[X]-[7|6|5|4,3|2|1|0]
		;[1]-[0,0,0,0-1,0,0,0][08]
		;[2]-[0,0,0,0-0,1,0,0][04]
		;[3]-[0,0,0,0-0,0,1,0][02]
		;[4]-[0,0,0,0-0,0,0,1][01]
		;[5]-[0,0,0,1-0,0,0,0][10]
		;[6]-[0,0,1,0-0,0,0,0][20]
		;[7]-[0,1,0,0-0,0,0,0][40]
		;[8]-[1,0,0,0-0,0,0,0][80]

		AND		A,@0x07
		ADD	 	PC, A
		RETL 	@0x08 ;1
		RETL 	@0x04 ;2
		RETL 	@0x02 ;3
		RETL 	@0x01 ;4
		RETL 	@0x10 ;5
		RETL 	@0x20 ;6
		RETL 	@0x40 ;7
		RETL 	@0x80 ;8
		;Return And Load to A
;====================================================
;	function: ReadKeys()
;====================================================
ReadKey:
		;连续按键检查
		CLR		PressCnt0
		CLR		PressCnt1
		MOV		A,@100
		MOV		RepeatKeys,A
		
		;测试是否按键按下!
		BS		KeyPort,KeyUp
		CALL	Delay5ms
		JBS		KeyPort,KeyUp
		JMP		DoKeyUP

		BS		KeyPort,KeyDown
		CALL	Delay5ms
		JBS		KeyPort,KeyDown
		JMP		DoKeyDown

		BS		KeyPort,KeyMenu
		CALL	Delay5ms
		JBS		KeyPort,KeyMenu
		JMP		DoKeyMenu

		JMP 	ReadKeyDone
;--------------------------------------------------------
DoKeyUp:
		;背光重计时
		CLR		LedCnt1

		;开背光
		BS		LedPort,LedLight
		
		; Do While KeyUp Up
		WDTC
		
		;在调整模式才有效
		JBS		MenuMode,0
		JMP		LoopUpTest
		
		;显示数据,其实也当延时来用		
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

		;累计数据
		INC		PressCnt0
		JBC		STATU,C
		INC		PressCnt1
		
		;if(PressCnt1 > RepeatKeys)
		;	FmMode ++;ShowFm();
		MOV		A,PressCnt1
		SUB		A,RepeatKeys
		JBC		STATU,C
		JMP		LoopUpTest

		;RepeatKeys = 5;
		MOV		A,@5
		MOV		RepeatKeys,A
		CLR		PressCnt1
		INC		FmMode
		CALL	CheckModeUp
		
		;ShowFm(A)
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

LoopUpTest:
		JBS		KeyPort,KeyUp
		JMP		DoKeyUp

		JBS		MenuMode,0
		JMP		DoChUp
DoFmUp:
		INC		FmMode
		BS		FmChange,BIT_FM_CHG
		JMP		ReadKeyDone

DoChUp:
		INC		FmChannel
		BS		FmChange,BIT_CH_CHG
		JMP		ReadKeyDone
;--------------------------------------------------------
DoKeyDown:
		;重新计时
		CLR		LedCnt1

		;开背光
		BS		LedPort,LedLight

		; Do While KeyDown Up
		WDTC
		
		;在调整模式才有效
		JBS		MenuMode,0
		JMP		LoopDownTest
		
		;显示数据,其实也当延时来用
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

		;累计数据
		INC		PressCnt0
		JBC		STATU,C
		INC		PressCnt1
		
		;if(PressCnt1 > 100)
		;	FmMode ++;ShowFm();
		MOV		A,PressCnt1
		SUB		A,RepeatKeys
		JBC		STATU,C
		JMP		LoopDownTest

		MOV		A,@5
		MOV		RepeatKeys,A
		CLR		PressCnt1
		DEC		FmMode

		CALL	CheckModeDown
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

LoopDownTest:
		JBS		KeyPort,KeyDown
		JMP		DoKeyDown

		JBS		MenuMode,0
		JMP		DoChDown
DoFmDown:
		DEC		FmMode
		BS		FmChange,BIT_FM_CHG
		JMP		ReadKeyDone

DoChDown:
		DEC		FmChannel
		BS		FmChange,BIT_CH_CHG
		JMP		ReadKeyDone
;--------------------------------------------------------
DoKeyMenu:
		;重新计时
		CLR		LedCnt1

		;开背光
		BS		LedPort,LedLight

		; Do While KeyMenu Up
		WDTC
		JBS		KeyPort,KeyMenu
		JMP		DoKeyMenu

		INC		MenuMode
		MOV		A,@0x01
		AND		MenuMode,A

		;保存模式(从FM-CH,需要保存)
		BS		FmChange,BIT_MD_CHG
		JMP		ReadKeyDone

ReadKeyDone:
		MOV		A,@0x07
		AND		FmChannel,A
		MOV		A,@0x01
		AND		MenuMode,A

		NOP
		NOP
		RET

;====================================================
;	function: ConvertFm(A)->(0875 + A)
;====================================================
ConvertFm:
		MOV		A_buff,A
		
		;L4~L1=0875
		MOV		A,@MIN_C4
		MOV		L4,A
		MOV		A,@MIN_C3
		MOV		L3,A
		MOV		A,@MIN_C2
		MOV		L2,A
		MOV		A,@MIN_C1
		MOV		L1,A

		;if(A==0)goto done
		MOV		A,A_buff
		JBC		STATU,Z
		JMP		CheckDone

CheckLoopAll:
		MOV		A,@4
		MOV		N1,A
		MOV		A,@L1
		MOV		R4,A

CheckLoopOne:
		MOV		A,R0
		AND		A,@0x0f
		ADD		A,@1
		DAA
		MOV		R0,A
		JBS		R0,4
		JMP		CheckNext

		INC		R4
		DJZ		N1
		JMP		CheckLoopOne		

CheckNext:
		DJZ		A_buff			
		JMP		CheckLoopAll

CheckDone:
		;	数据高位可能不对!必须去掉!
		MOV		A,L4
		AND		A,@0x0f
		MOV		L4,A
		MOV		A,L3
		AND		A,@0x0f
		MOV		L3,A
		MOV		A,L2
		AND		A,@0x0f
		MOV		L2,A
		MOV		A,L1
		AND		A,@0x0f
		MOV		L1,A

		RET

;====================================================
;	function: CheckModeData(A) ->(0875 + A)
;====================================================
CheckModeUp:
		MOV		A,FmMode
		SUB		A,@MAX_STEP
		JBC		STATU,C
		CLR		FmMode
		RET
		
;====================================================
;	function: CheckModeData(A) ->(0875 + A)
;====================================================
CheckModeDown:
		MOV		A,FmMode
		SUB		A,@MAX_STEP
		JBC		STATU,C
		JMP		CheckDownEnd
		MOV		A,@MAX_STEP
		MOV		FmMode,A

CheckDownEnd:
		NOP
		RET

;===============================================
;	Function:Delay5ms(N1,N2)2500=5ms
;===============================================
;for(N1=0;N1<25;N1++)
;	for(N2=0;N2<98;N2++) 2000/400K=5
;		NOP();  400,000HZ, 2.5ns
Delay5ms:
		WDTC

		MOV A,@25
		MOV N1,A
D5MS_1:
		MOV A,@98
		MOV N2,A
D5MS_2:
		DJZ N2
		JMP D5MS_2
;D5MS_1:
		DJZ N1
		JMP D5MS_1

		CLRA
		RET

;===============================================
;	Function:Clean()
;===============================================	
Clean:
		MOV		A,@0x10
		MOV		R4,A
Loop:
		; CLR R0 ==> [R4]=0
		CLR		R0
		INC		R4
		MOV		A,R4
		OR	 	A,@0B11000000
		BC	 	STATU,Z
		XOR		A,@0xF0
		JBS		STATU,Z
		JMP		Loop
		RET

;===============================================
;	Includes Other Functions.
;===============================================
		include "I2cProc.h"
		include "SpiProc.h"
		include "LcdProc.h"

		END
;===============================================
;	End of file.
;===============================================

⌨️ 快捷键说明

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