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

📄 main.asm

📁 EM78P153源代码,含24C02,I2C,以及1418FM发射模块控制部分!
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==========================================================
;
;	模块:	FM发射模块控制代码
;
;	版本:	1.01
;
;	日期:	2007-5-21
;
;	作者:	施探宇
;
;	说明:	24C02,FM1417,Keys,LED-Light,LCD1621
;
;
;==========================================================
;==========================================================
;	初始化寄存器
;==========================================================
		R0 			== 0X00
		R1 			== 0x01
		PC			== 0x02
		STATU		== 0x03
		R4 			== 0x04
		P5 			== 0x05
		P6 			== 0x06
		IOCB		== 0x0B
		IOCC		== 0x0C
		IOCD		== 0x0D
		WTD 		== 0x0E
		RF 			== 0x0F

		C			== 0x00
		DC			== 0x01
		Z			== 0x02

;==========================================================
;	自定义的变量(全局变量)
;==========================================================
		A_buff		== 0x10	;A寄存器备份
		MenuMode	== 0x11 ;菜单模式
		FmChannel	== 0x12	;频道(0~7)
		FmMode		== 0x13	;FM模式(87.5-108.0)(0x00-0xCD)
		FmChange 	== 0x14	;FM是否改变,CH是否改变

		N1			== 0x15	;Delay5ms循环
		N2			== 0x16	;Delay5ms循环

		SpiAddr 	== 0x17	;Spi模式地址
		SpiData 	== 0x18	;Spi模式数据
		I2cDevId	== 0x19	;I2c器件序号
		I2cAddr		== 0x1A	;I2c地址
		I2cData		== 0x1B	;I2c数据

		L1			== 0x1C	;5
		L2			== 0x1D	;7
		L3			== 0x1E	;8
		L4			== 0x1F	;0

;==========================================================
;	计数变量
;==========================================================
		LedCnt0		== 0x20 ;背光计时
		LedCnt1		== 0x21 ;背光计时(>200?)

		PressCnt0   == 0x22	;按键计时
		PressCnt1   == 0x23	;按键计时

		FlashCnt0	== 0x24	;闪屏计时
		FlashCnt1	== 0x25	;闪屏计时

		RepeatKeys	== 0x26 ;连续按键
;==========================================================
;	全局常量
;==========================================================		
		;按键触发标志
		BIT_FM_CHG	== 0
		BIT_CH_CHG	== 1
		BIT_MD_CHG	== 2

		;频道保存地址
		ChAddress	== 0x08
		
		;24c02器件地址
		A24c02Id	== 0xA0
		
		;背光关闭时间
		LedOffTime	== 200
		
		;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		;(87.5)*10->036B
		;(108.0 - 87.5)*10 = 0xCD
		;MIN_FM_HI	== 0x03
		;MIN_FM_LO	== 0x6B
		;MAX_STEP	== 0xCD
		;MIN_C4		== 0
		;MIN_C3		== 8
		;MIN_C2		== 7
		;MIN_C1		== 5
		
		;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		;(88.1)*10=0x0371
		;(107.9-88.1)*10=0xC6
		MIN_FM_HI	== 0x03
		MIN_FM_LO	== 0x71
		MAX_STEP	== 0xC6
		MIN_C4		== 0
		MIN_C3		== 8
		MIN_C2		== 8
		MIN_C1		== 1

;==========================================================
;
;	MenuMode: = 0
;		Up,Down,Menu = Chanel+/Chanel-/FmMode
;	MenuMode: = 1
;		Up,Down,Menu = Fm+/Fm-/Save
;
;==========================================================
;	 定义数据位
;==========================================================
		;---------------------------------------------
		;	I2C控制脚位
		;---------------------------------------------
		ACK			== 0			;应答位

		;---------------------------------------------
		;	(Port6.1 - SCL,Port6.2 - SDA)
		;---------------------------------------------
		SCL			== 1			;I2c-SCL脚
		SDA			== 2			;I2c-SDA脚
		OI2c_SDA	== 0B00000100	;OR 控制位用
		AI2c_SDA	== 0B11111011	;AND控制位用
		I2cPort		== P6

		;---------------------------------------------
		;	(Port5.0 - STB,Port5.2 - CLK,Port5.3 - DAT)
		;---------------------------------------------
		STB 		== 0	;	用于1621
		ENA			== 1	;	用于1418
		CLK 		== 2	;	WR共用
		DAT 		== 3	;	DI/DO共用
		RD			== 1	;	读数据
		WR			== 2	;	写数据
		OSPI_DAT	== 0B00001000
		ASPI_DAT	== 0B11110111
		SpiPort		== P5

		;---------------------------------------------
		;	(Port6.7 - Up,Port6.6 - Menu,Port6.3 - Down)
		;---------------------------------------------
		KeyUp		== 7
		KeyDown 	== 3
		KeyMenu 	== 6
		KeyPort		== P6

		;---------------------------------------------
		; 	(Port6.5 - led Light.Port6.6 - FmPower)
		;---------------------------------------------
		LedLight	== 5
		LedPower	== 6
		LedPort		== P6

;===========================================================
;	Start()
;===========================================================
		ORG		0x00
		JMP		Start
		
		;------------------------------
		;	中断表[1]
		;------------------------------
		ORG		0x01
		RETI
				
		;------------------------------
		;	中断表[8]
		;------------------------------
		ORG		0x08
		RETI

		;------------------------------
		;	程序开始
		;------------------------------
		ORG		0x20
Start:
		CALL	Clean

		;设定看门狗
		MOV		A,	@0B00001110
		CONTW

		;开启看门狗
		MOV		A,	@0B10000000
		IOW		WTD

		;P5端设置
		MOV		A,	@0B00000000
		IOW		P5
		MOV		A,	@0B00001111
		MOV		P5,	A

		;P6漏极开关
		MOV		A,	@0B00000000
		IOW		IOCC

		;P6上拉设定
		MOV		A,	@0B00000000
		IOW		IOCD

		;P6端设置输入(P6.3-Down,P6.6-Menu,P6.7-Up)
		MOV		A,	@0B11001000
		IOW		P6
		MOV		A,	@0B11111111
		MOV		P6,A

		;---------------------------
		;	初始化模式(87.5+FmMode)
		;---------------------------		
		CLRA
		MOV		MenuMode,A
		MOV		FmChannel,A
		MOV		FmMode,A
		MOV		FmChange,A
	
		;---------------------------
		;	测试24C02:OK
		;---------------------------
		;读出频道
		MOV		A,@A24c02Id
		MOV		I2cDevId,A
		MOV		A,@ChAddress
		MOV		I2cAddr,A
		CALL	I2cRead

		;检查频道(CH = 0~7)
		AND		A,@0x07
		MOV		FmChannel,A
		CALL	Delay5ms

		;读出频率
		MOV		A,FmChannel
		MOV		I2cAddr,A
		CALL	I2cRead
		MOV		FmMode,A
		CALL	CheckModeDown
		CALL	Delay5ms

		;---------------------------
		;	开机FM模式
		;---------------------------
		MOV		A,FmMode
		CALL	SpiFmWrite

		;---------------------------
		;	初始化LCD
		;---------------------------
		CALL	LcdInit
		CALL	LcdClearAll

		;---------------------------
		;	显示FM
		;---------------------------
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

		;---------------------------
		;	显示CH
		;---------------------------
		MOV		A,FmChannel
		CALL	LcdShowCh

		;---------------------------
		;	显示背光		
		;---------------------------
		BS		LedPort,LedLight
		
		;---------------------------
		;	清全局变量
		;---------------------------
		CLR		LedCnt0
		CLR		LedCnt1
		CLR		FlashCnt0
		CLR		FlashCnt1
		CLR		PressCnt0
		CLR		PressCnt1
		CLR		RepeatKeys

;===================================================
;	Main();万物由此开始,盘古在此开天地!
;===================================================
Main:
		CALL	Delay5ms

BckLightBegin:
		
		;检查背光是否到时间关闭!
		;if(LedCnt1 > LedOffTime)
		;	goto BckLightEnd;
		;else
		;	LedCnt1++;
		MOV		A,LedCnt1
		SUB		A,@LedOffTime
		JBS		STATU,C
		JMP		BckLightEnd

		;	LedCnt[01]++;
		INC		LedCnt0
		JBC		STATU,Z
		INC		LedCnt1

		CALL	Delay5ms

		;if(LedCnt1 == LedOffTime)
		;	LightOff();
		MOV		A,LedCnt1
		SUB		A,@LedOffTime
		JBS		STATU,Z
		JMP		BckLightEnd

		;关闭背光灯
		BC		LedPort,LedLight
		
		;保存频道
		MOV		A,@ChAddress
		MOV		I2cAddr,A
		MOV		A,FmChannel
		MOV		I2cData,A
		CALL	I2cWrite

BckLightEnd:
		NOP

		;是否需要闪动?
		JBS		MenuMode,0
		JMP		FlashDone

FlashBegin:
		;闪动计数器
		INC		FlashCnt0
		JBC		STATU,C
		INC		FlashCnt1

		;
		MOV		A,FlashCnt1
		SUB		A,@5
		JBC		STATU,Z
		JMP		FlashShow

		MOV		A,FlashCnt1
		SUB		A,@10
		JBC		STATU,Z
		JMP		FlashHide
		JMP		FlashDone

FlashShow:
		INC		FlashCnt1
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm
		JMP		FlashDone
		
FlashHide:
		CLR		FlashCnt1
		CALL	LcdCleanFm
		JMP		FlashDone

FlashDone:
		NOP

		JMP		labMainNext
;---------------------------------------------------
		;调试24C02代码
Debug24C02:
		MOV		A,@0x20
		MOV		R4,A
		MOV		A,@16
		MOV		N2,A
		CLR		I2cAddr

ReadSave:
		CALL	I2cRead
		MOV		R0,A
		INC		I2cAddr
		INC		R4
		DJZ		N2
		JMP		ReadSave

;---------------------------------------------------
labMainNext:
		;读取按键
		CALL	ReadKey
		CALL	Delay5ms

		;MenuMode是否改变?
		JBC		FmChange,BIT_MD_CHG
		JMP		labModeChange

		;Channel是否改变?
		JBC		FmChange,BIT_CH_CHG
		JMP		labChChange

		;FmMode是否改变?
		JBC		FmChange,BIT_FM_CHG
		JMP		labFmChange

		JMP		Main
;----------------------------------------------------
labFmChange:
		CALL	CheckModeDown
		
		;显示FM的值到LCD
		MOV		A,FmMode
		CALL	ConvertFm
		CALL	LcdShowFm

		;改变频段
		MOV		A,FmMode
		CALL	SpiFmWrite

		;清FM标志
		BC		FmChange,BIT_FM_CHG
		JMP		Main
;----------------------------------------------------
labChChange:
		;读取频道的频率
		MOV		A,FmChannel
		MOV		I2cAddr,A
		CALL	I2cRead
		MOV		FmMode,A
		CALL	CheckModeDown
		MOV		A,FmMode

⌨️ 快捷键说明

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