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

📄 main.asm

📁 中颖示例程序,控制ROHM MP3芯片,调试OK已量产
💻 ASM
📖 第 1 页 / 共 3 页
字号:
VOICE_DEC_ING:		SBIM	VOICE_BACK_L,01H		LDI	R0,00H		SBCM	VOICE_BACK_H,00H						LDI	SEND_COM,0DH		CALL	SEND_COMMAND	;如果文件夹的编号还没有减到0,则再发送一个		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_5MS	;每写完1位延时5MS		CALL	DELAY_5MS	;每写完1位延时5MS		JMP	VOICE_DECVOICE_CHANGE_ADD:		SBIM	VOICE_BACK_L,0FH		LDI	R0	,00H		SBCM	VOICE_BACK_H,00H ;减去初始音量				JMP	VOICE_ADJUST		VOICE_NO_CHANGE:		LDI	DATA_L,0AH		LDI	DATA_H,01H	;设定写入I2C的值		LDI	DATA_ADDRL,04H		LDI	DATA_ADDRH,00H	;写入频率的位置为01H		CALL	WRITE_DATA	;将默认诉频率值写入给I2C,以便记忆		CALL	DELAY_5MS		;		LDI	DATA_ADDRH,00H;		LDI	DATA_ADDRL,04H;		CALL	READ_DATA	;读出音阶					LDI	VOICE_CNT_L,0AH		LDI	VOICE_BACK_L,00H		LDI	VOICE_CNT_H,01H		LDI	VOICE_BACK_H,01H		VOICE_ADJUST:;调整音阶的子程序		LDA	VOICE_BACK_H	,00H		BNZ	VOICE_ADJUST_ING		LDA	VOICE_BACK_L	,00H		BAZ	VOICE_EXITVOICE_ADJUST_ING:		SBIM	VOICE_BACK_L,01H		LDI	R0,00H		SBCM	VOICE_BACK_H,00H						LDI	SEND_COM,0CH		CALL	SEND_COMMAND	;如果文件夹的编号还没有减到0,则再发送一个		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_20MS	;每写完1位延时5MS		CALL	DELAY_5MS	;每写完1位延时5MS		CALL	DELAY_5MS	;每写完1位延时5MS		JMP	VOICE_ADJUST		VOICE_EXIT:		JMP	MAIN_VOICE;-----------------------------------------------------------------INT_TIMER0:	;	;这里发个波形是为了检测2MS波形是否标准		LDA	IRQ	,00H		BA2	$+2		JMP	TIMER_CNT_EXIT		ANDIM	IRQ	,1011B				ADIM	KEY_TIMER,01H	;发送按键的时间定时器		ADIM	TIMER_10MS,01H		SBI	TIMER_10MS,0AH		BNZ	TIMER_CNT_EXIT		LDI	TIMER_10MS,00H				adim	TIMER_100MS,01H		SBI	TIMER_100MS,0AH		BNC	TIMER_CNT_EXIT		LDI	TIMER_100MS,00H				ADIM	KEY_CONT_TIMER,01H				LDA	WORK_FLAG	,00H	;如果是在上电中,则LED闪烁,否则常亮		BA0	LED_DISPLAY		JMP	LED_NO_DISLED_DISPLAY:		ADIM	DISPLAY_TIMER,01H		SBI	DISPLAY_TIMER,05H		BNC	LED_DIS_END		LDI	DISPLAY_TIMER,00H		EORIM	PC_TMP	,1000B		STA	PC		JMP	LED_DIS_ENDLED_NO_DIS:		LDI	DISPLAY_TIMER,00H		ORIM	PC_TMP	,1000B		STA	PCLED_DIS_END:		adim	TIMER_1S,01H				SBI	TIMER_1S,05H		;每500MS读1次		BNC	TIMER_CNT_EXIT		LDI	TIMER_1S,00H		;		EORIM	PC_TMP	,1000B;		STA	PC;		ADIM	ADJUST_TIMER,01H	;此句因为已经把程序中的MODE键取消,故不用;		SBI	ADJUST_TIMER,05H;		BNC	TIMER_CNT_EXIT;		ANDIM	WORK_FLAG,1101B		LDI	SEND_COM,09H		CALL	SEND_COMMAND	;读出MP3的状态		CALL	DELAY_5MS	;比较文件夹与文件是否与以前一样						LDA	RD_STATUS10,00H		SUB	DIR_BACK_H,00H		BNZ	INT_BACK_DIR_FILE		LDA	RD_STATUS9,00H		SUB	DIR_BACK_L,00H		BNZ	INT_BACK_DIR_FILE		LDA	RD_STATUS6,00H		SUB	FILE_BACK_H		BNZ	INT_BACK_DIR_FILE				LDA	RD_STATUS5,00H		SUB	FILE_BACK_L		BAZ	TIMER_CNT_EXITINT_BACK_DIR_FILE:;如果4项里有任何一个不相同,则备份数据,写入24C01		LDA	RD_STATUS10,00H		STA	DIR_BACK_H,00H		LDA	RD_STATUS9,00H		STA	DIR_BACK_L,00H		LDA	RD_STATUS6,00H		STA	FILE_BACK_H,00H		LDA	RD_STATUS5,00H		STA	FILE_BACK_L,00H				LDI	DATA_ADDRL,02H		LDI	DATA_ADDRH,00H	;写入频率的位置为01H		LDA	DIR_BACK_L,00H		STA	DATA_L,00H		LDA	DIR_BACK_H,00H		STA	DATA_H,00H	;设定写入I2C的值		CALL	WRITE_DATA	;将默认诉频率值写入给I2C,以便记忆		CALL	DELAY_5MS				LDI	DATA_ADDRL,03H		LDI	DATA_ADDRH,00H	;写入频率的位置为01H		LDA	FILE_BACK_L,00H		STA	DATA_L,00H		LDA	FILE_BACK_H,00H		STA	DATA_H,00H	;设定写入I2C的值		CALL	WRITE_DATA	;将默认诉频率值写入给I2C,以便记忆		CALL	DELAY_5MS				TIMER_CNT_EXIT:		JMP	MAIN_INT_TIMER0;=================================================================;KEY_TIMER		equ	00h	;扫描按键的定时器;KEY_SCAN_CNT		equ	00h	;按键扫描次数计数器;KEY_VAL1		equ	00H	;按键值的寄存器1;KEY_VAL1.0				;PLWY/PAUSE的标志;KEY_VAL1.1				;PAUSE的标志;KEY_VAL1.2				;FB+或ADD的标志;KEY_VAL1.3				;FB-或DEC的标志;KEY_VAL2		equ	00H	;按键值寄存器2;KEY_VAL1.3				;MODE的标志;SEND_COM		equ	00h	;按键压下后发送的命令类型;=================================================================KEY_SCAN:		SBI	KEY_TIMER,02H		BNC	KEY_SCAN_EXIT		LDI	KEY_TIMER,00H	;再等2MS重新扫键				NOP		NOP		NOP				LDA	PB					STA	R0	,00H		EORIM	R0	,1111B;-----------------------------------------------------------------		LDA	KEY_VAL,00H		SUB	R0	,00H		BAZ	KEY_SAMEKEY_DIF:		LDA	R0	,00H		STA	KEY_VAL	,00H	;两次检测的按键值并不相同,则备份				LDI	KEY_CNT,00H		JMP	KEY_SCAN_EXITKEY_SAME:		ADIM	KEY_CNT	,01H		SBI	KEY_CNT	,05H	;如果按键相同的次数有8次相同,则检查		BNC	KEY_SCAN_EXIT		LDI	KEY_CNT	,00H		KEY_SCAN100:		LDA	KEY_VAL	,00H		BAZ	KEY_OFF_ALL	;如果按键值为零,则设定按键松开的标志		LDA	KEY_VAL	,00H		STA	KEY_VAL_BACK	;备份按键值				ORIM	KEY_FLAG,0100B	;按键压下,按键待处理,与连续的标志		SBI	KEY_VAL,02H		BAZ	KEY_SCAN_CONT		SBI	KEY_VAL,04H		BAZ	KEY_SCAN_CONT	;连续按键的子程序		JMP	KEY_SCAN_EXITKEY_SCAN_CONT:	;如果是ADD/DEC压下去的话,那么检查是否设定连续键标志?		LDA	KEY_FLAG,00H		BA1	KEY_CONT_ON	;如果设定了连续键标志,去处理				ORIM	KEY_FLAG,0010B	;连续键待处理的标志		LDI	KEY_CONT_TIMER,00H;连续键压下的时间清零		JMP	KEY_SCAN_EXITKEY_CONT_ON:		SBI	KEY_CONT_TIMER,04H		BNC	KEY_SCAN_EXIT	;如果压下去没有500MS,不形成连续按键		LDI	KEY_CONT_TIMER,00H;下一个500MS再响应一次				SBI	KEY_VAL,02H		BAZ	KEY_VOL_ADD	;声音连续的标志		SBI	KEY_VAL,04H		BAZ	KEY_VOL_DEC	;声音连续减的命令		ANDIM	KEY_FLAG,0101B	;如果不是单独压下,取消连续		JMP	KEY_SCAN_EXITKEY_VOL_ADD:		ORIM	KEY_FLAG,1000B	;已经响应连续按键的标志		LDI	SEND_COM,0CH	;发送声音加的命令		CALL	SEND_COMMAND		CALL	DELAY_5MS				SBI	VOICE_CNT_L,0AH		LDI	R0	,02H		SBC	VOICE_CNT_H,00H		BC	KEY_SCAN_EXIT	;如果音量已调入最大,则不改变				ADIM	VOICE_CNT_L,01H		LDI	R0	,00H		ADCM	VOICE_CNT_H,00H	;音阶数加1						LDA	VOICE_CNT_L,00H		STA	DATA_L	,00H		LDA	VOICE_CNT_H,00H		STA	DATA_H	,00H		LDI	DATA_ADDRH,00H		LDI	DATA_ADDRL,04H				CALL	WRITE_DATA	;写入调整后的音量		CALL	DELAY_5MS		JMP	KEY_SCAN_EXITKEY_VOL_DEC:		ORIM	KEY_FLAG,1000B	;已经响应连续按键的标志		LDI	SEND_COM,0DH	;发送声音减的命令		CALL	SEND_COMMAND		CALL	DELAY_5MS		LDA	VOICE_CNT_L,00H		BNZ	$+3		LDA	VOICE_CNT_H,00H		BAZ	KEY_SCAN_EXIT	;如果音量调整到0则结束				SBIM	VOICE_CNT_L,01H		LDI	R0	,00H		SBCM	VOICE_CNT_H,00H	;音阶数减1						LDA	VOICE_CNT_L,00H		STA	DATA_L	,00H		LDA	VOICE_CNT_H,00H		STA	DATA_H	,00H				LDI	DATA_ADDRH,00H		LDI	DATA_ADDRL,04H				CALL	WRITE_DATA	;写入调整后的音量		JMP	KEY_SCAN_EXITKEY_OFF_ALL:		LDA	KEY_FLAG,00H		BA3	KEY_OFF_END	;如果以前响应了连续按键则结束		BA2	KEY_OFF_CHULI	;如果以前设定了待处理按键的标志,则去处理		JMP	KEY_OFF_ENDKEY_OFF_CHULI:		LDA	KEY_FLAG,00H		BA0	$+2		JMP	KEY_OFF_END		ANDIM	KEY_FLAG,1110B		SBI	KEY_VAL_BACK,01H ;PLAY/PAUSE键压下去		BAZ	KEY_SCAN110	;		SBI	KEY_VAL_BACK,02H ;ADD/FB+键压下去		BAZ	KEY_SCAN120		SBI	KEY_VAL_BACK,04H ;DEC/FB-键压下去		BAZ	KEY_SCAN130		SBI	KEY_VAL_BACK,08H ;MODE键压下去		BAZ	KEY_SCAN140KEY_OFF_END:		LDI	KEY_FLAG,0001B		JMP	KEY_SCAN_EXIT;-----------------------------------------------------------------;WORK_FLAG:	;工作状态寄存器;WORK_FLAG.0	;1:PLAY中;0:STOP;WORK_FLAG.1	;1:调整的是文件与文件夹的 1:调整的是频率KEY_SCAN110:	;PLAY/STOP按键压下去		EORIM	WORK_FLAG,0001B	;转换9432的工作状态		LDA	WORK_FLAG,00H		BA0	KEY_SCAN_PLAYKEY_SCAN_STOP:		LDI	SEND_COM,02H	;发送STOP命令		JMP	KEY_PL_ST_SENDKEY_SCAN_PLAY:		LDI	SEND_COM,01H	;发送PLAY命令KEY_PL_ST_SEND:		CALL	SEND_COMMAND	;将命令发送出去		CALL	DELAY_5MS		JMP	KEY_SCAN_EXITKEY_SCAN120:	;ADD键压下;		LDA	WORK_FLAG,00H	;检查是在调整频率的过程中吗?;		BA1	KEY_ADD_FRE	;调整频率的过程中		LDI	SEND_COM,04H	;发送上一首的命令;		LDI	SEND_COM,0CH	;发送声音加的命令		CALL	SEND_COMMAND		CALL	DELAY_5MS		JMP	KEY_SCAN_EXIT		;KEY_ADD_FRE:;		LDI	ADJUST_TIMER,00H;如果5S没有调整频率,则认为频率结束;		SBI	FRE_MODE,06H;		BC	KEY_SCAN_EXIT	;如果频率调到最大值,则结束;		ADIM	FRE_MODE,01H	;将频率加一档,;KEY_CHANGE_FRE:				;改变频率(什么时候将其保存在24C02?);		LDA	FRE_MODE,00H;		STA	PC_TMP;		ORIM	PC_TMP	,1000B	;		STA	PC;		CALL	DELAY_5MS		;		LDI	DATA_ADDRH,00H;		LDI	DATA_ADDRL,01H;		LDI	DATA_H	,00H;		LDA	FRE_MODE,00H;		STA	DATA_L	,00H;		CALL	WRITE_DATA	;读出识别写入码;		CALL	DELAY_5MS	;延时5MS的子程式;		JMP	KEY_SCAN_EXITKEY_SCAN130:	;DEC/FB-按键压下去;		LDA	WORK_FLAG,00H	;检查是在调整频率的过程中吗?;		BA1	KEY_DEC_FRE	;调整频率的过程中		LDI	SEND_COM,05H	;发送下一首的命令;		LDI	SEND_COM,0dH	;发送声音减的命令		CALL	SEND_COMMAND		CALL	DELAY_5MS		JMP	KEY_SCAN_EXIT	;KEY_DEC_FRE:;		LDI	ADJUST_TIMER,00H;如果5S没有调整频率,则认为频率结束;		LDA	FRE_MODE,00H;		BAZ	KEY_SCAN_EXIT	;如果频率已调到最小,则不再调整;		SBIM	FRE_MODE,01H;		STA	PC_TMP	,00H;		ORIM	PC_TMP	,1000B;		STA	PC;		CALL	DELAY_5MS	;存储变更后的频率码		;		LDI	DATA_ADDRH,00H;		LDI	DATA_ADDRL,01H;		LDI	DATA_H	,00H;		LDA	FRE_MODE,00H;		STA	DATA_L	,00H;		CALL	WRITE_DATA	;读出识别写入码;		CALL	DELAY_5MS	;延时5MS的子程式;		JMP	KEY_SCAN_EXITKEY_SCAN140:;		EORIM	WORK_FLAG,0010B	;如果是调整频率中,则改为调整上/下首;		LDI	ADJUST_TIMER,00H		SBI	FRE_MODE,06H		BC	$+3	;如果频率调到最大值,则结束		ADIM	FRE_MODE,01H	;将频率加一档,		JMP	KEY_CHANGE_FRE		LDI	FRE_MODE,00H	;如果频率调整到最大,则从头开始调整KEY_CHANGE_FRE:				;改变频率(什么时候将其保存在24C02?)		LDA	PC_TMP	,00H		STA	R0		LDA	FRE_MODE,00H		STA	PC_TMP		LDA	R0	,00H		BA3	$+2		JMP	$+2		ORIM	PC_TMP	,1000B		LDA	PC_TMP	,00H;		ORIM	PC_TMP	,1000B			STA	PC		CALL	DELAY_5MS				LDI	DATA_ADDRH,00H		LDI	DATA_ADDRL,01H		LDI	DATA_H	,00H		LDA	FRE_MODE,00H		STA	DATA_L	,00H		CALL	WRITE_DATA	;读出识别写入码		CALL	DELAY_5MS	;延时5MS的子程式		JMP	KEY_SCAN_EXIT			KEY_SCAN_EXIT:		JMP	MAIN_KEY_SCAN;=================================================================;-----------------------------------------------------------------;在发送命令的过程中,如何处理显示?;1.1将显示放中中断,但是在显示的时候只改变;发送PLAY的波形;以下为发送的步骤:;1)先将发送的数字送给HST_DATA1/2,然后调用发送命令的子程式,发送出去;1.1发送命令的子程式,先发送一个起始标志,发送完成后再将D7(就是发送数的最高位)送到DATA上,;1.2DATA放上去后,然后再发生两次中断后,就再发送D6位,以此类推,直至8个数发送完毕.;=================================================================SEND_COMMAND:	;发送命令的子程式(HST_SCL=PE.3,HST_DATA=PE.2)		ANDIM	PA_TMP	,1011B		ORIM	PA_TMP	,1000B		STA	PA		;将SCL置为低,SDA置为高,				CALL	DELAY_1MS	;延时1MS				LDI	R0	,05HSEND_SYNC:	;发送同步波形的子程式				EORIM	PA_TMP	,0100B	;CLK置为低		STA	PA		CALL	DELAY_1MS	;延时1MS		SBIM	R0	,01H		BNZ	SEND_SYNC	;如果没有发送5个,则再延时发送

⌨️ 快捷键说明

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