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

📄 function.asm

📁 SPT6608平台软件
💻 ASM
📖 第 1 页 / 共 3 页
字号:
//END F_GetMessage;

////////////////////////////////////////////////////
//| 函数名:F_ClearMessage
//| 功  能:清空消息队列中的所有消息
//| 入  口:无
//| 出  口:R1 =C_True 成功 =C_False 失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_ClearMessage:
				//将消息队列的首尾指针都设置到消息缓冲区的头位置
				R1 = MsgQueue;
				[R_MQHeadPtr] = R1;
				[R_MQTailPtr] = R1;
				
				//消息缓冲区中的消息个数设置为0
				R1 = 0x0000;
				[R_MsgNum] = R1;
				//设置返回值为C_False
				R1 = C_True;
				RETF
//END F_ClearMessage;



////////////////////////////////////////////////////
//| 函数名:F_UARTProc
//| 功  能:UART命令解析通用处理程序
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_UARTProc:
				PUSH R1, R5 TO [SP];
				R1 = [R_CommandType];
				R1 &= 0x00FF;						//保留低字节,即命令
				CMP R1, M_ComposePlay
				JE ?_UARTProc_SendMessage;			//发送命令消息
				CMP R1, M_PhrasePlay
				JE ?_UARTProc_SendMessage;			//发送命令消息
				CMP R1, M_SoundPlay
				JE ?_UARTProc_SendMessage;			//发送命令消息
				CMP R1, C_CmdGotoSleep
				JE ?_UARTProc_SendMessage;			//发送命令消息
				JMP ?_UARTProc_Quit;				//不是上述几个命令,直接退出本模块
?_UARTProc_Stop:
				R1 = [R_PlayName] 
				CMP R1 , C_True
				JNE  ?_UARTProc_StopName
				CALL  F_ChNameStop
				JMP   ?_UARTProc_Quit
?_UARTProc_StopName:				
				CALL F_SACM_DVR1600_Stop;
				JMP  ?_UARTProc_Quit
?_UARTProc_SendMessage:
				CALL F_PostMessage;
//退出模块
?_UARTProc_Quit:				
				POP R1, R5 FROM [SP];
				RETF
//END F_UARTProc;


////////////////////////////////////////////////////
//| 函数名:F_UARTSetBaudRate
//| 功  能:UART设置波特率函数
//| 入  口:R1
//| 出  口:R1 =C_True	设置成功
//|			   =C_False	设置失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_UARTSetBaudRate:
				PUSH R2, R5 TO [SP];
				PUSH R1 TO [SP];
				CMP R1, C_Baud1200
				JE ?_UARTSetBaudRate_1200;			//设置波特率1200
				CMP R1, C_Baud2400
				JE ?_UARTSetBaudRate_2400;			//设置波特率2400
				CMP R1, C_Baud4800
				JE ?_UARTSetBaudRate_4800;			//设置波特率4800
				CMP R1, C_Baud9600
				JE ?_UARTSetBaudRate_9600;			//设置波特率9600
				CMP R1, C_Baud19200	
				JE ?_UARTSetBaudRate_19200;			//设置波特率19200
				CMP R1, C_Baud38400
				JE ?_UARTSetBaudRate_38400;			//设置波特率38400
				CMP R1, C_Baud57600
				JE ?_UARTSetBaudRate_57600;			//设置波特率57600
				CMP R1, C_Baud115200
				JE ?_UARTSetBaudRate_115200;		//设置波特率115200
				POP R1 FROM [SP];
				JMP ?_UARTSetBaudRate_False;
?_UARTSetBaudRate_1200:
				R1 = 0x0000;
				R2 = 0x0048;
				JMP ?_UARTSetBaudRate_True;				
?_UARTSetBaudRate_2400:
				R1 = 0x0000;
				R2 = 0x0096;
				JMP ?_UARTSetBaudRate_True;
?_UARTSetBaudRate_4800:
				R1 = 0x0001;
				R2 = 0x002C;
				JMP ?_UARTSetBaudRate_True;
?_UARTSetBaudRate_9600:
				R1 = 0x0002;
				R2 = 0x0058;
				JMP ?_UARTSetBaudRate_True;
?_UARTSetBaudRate_19200:
				R1 = 0x0004;
				R2 = 0x00B0;
				JMP ?_UARTSetBaudRate_True;
?_UARTSetBaudRate_38400:
				R1 = 0x0009;
				R2 = 0x0060;
				JMP ?_UARTSetBaudRate_True;
?_UARTSetBaudRate_57600:
				R1 = 0x000E;
				R2 = 0x0010;
				JMP ?_UARTSetBaudRate_True;
?_UARTSetBaudRate_115200:
				R1 = 0x001C;
				R2 = 0x0020;
?_UARTSetBaudRate_True:
				[P_UARTABR_High] = R1;
				[P_UARTABR_Low] = R2;

				POP R1 FROM [SP];
				[R_UARTStatus] = R1;				//保存要设置的波特率
				R1 = C_True;
				JMP ?_UARTSetBaudRate_Quit;
?_UARTSetBaudRate_False:
				R1 = C_False;
?_UARTSetBaudRate_Quit:
				POP R2, R5 FROM [SP];
				RETF
//END F_UARTSetBaudRate;


////////////////////////////////////////////////////
//| 函数名:F_UARTGotoSleep
//| 功  能:UART命令进入休眠状态函数
//| 入  口:R1 是否关闭触屏电源 =B_ClosePanel  关闭
//|                             =B_NClosePanel 不关闭
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_UARTGotoSleep:
				PUSH R1, R5 TO [SP];
				R2 = 0x00FF;
				[P_IOD_Dir] = R2;					//设置IOD为输出状态(都设置为输出状态--低功耗)
                R2 = 0x0000;
				[P_IOD_Data] = R2;	
				R2 = 0x00FF;
				[P_IOE_Dir] = R2;					//设置IOE为输出状态(都设置为输出状态--低功耗)
                R2 = 0x0000;
				[P_IOE_Data] = R2;	
//关闭串口
				R1 = [P_Int];
				R1 &= ~B_UARTInt;
				R1 &= ~B_IoaInt;
				R1 &= ~B_T128HzInt
//				R1 &= ~B_TmrAInt
				[P_Int] = R1;						//清除所有的中断
				
//				R1 = 0;
//				[P_UARTCmd1] = R1;
//				[P_UARTCmd2] = R1;
				

//设置休眠唤醒机制
				
				R1 = 0x007F;						//IOE7设置输入状态(其他都设置为输出,低功耗)
				[P_IOE_Dir] = R1;
				
				R1 = 0x0000;
				[P_WakeUpClr] = R1;					//清空所有唤醒标志
				
				R1 = 0x0002;
				[P_WakeUp] = R1;					//允许IOE外部唤醒
				
				R1 = 0x0080;
				[P_IoeWakeUp] = R1;
				
				R1 = 0x0007;				
				[P_SystemClock] = R1;				//系统进入到休眠状态
				
				POP R1, R5 FROM [SP];
				RETF
//END F_UARTGotoSleep;
/////////////////////////////////
F_UARTGotoSleep1:
				PUSH R1, R5 TO [SP];
				R1 = 0x0085;                        //进入3.5M
				[P_SystemClock] = R1;
				POP R1, R5 FROM [SP];
				RETF
////////////////////////////////////////////////////
//| 函数名:F_UARTSendByte
//| 功  能:通过UART发送一个字节的函数
//| 入  口:R1低字节:要发送的数据
//| 出  口:R1 =C_True	发送成功
//|            =C_False	发送失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_UARTSendByte:
				PUSH R2 TO [SP];
?_UARTSendByte_Wait:
				R2 = [P_UARTCmd2];
				TEST R2, B_TxRdy
				JZ ?_UARTSendByte_Wait;				//检测发送数据准备是否已经完成,没完成则循环检测。	
							
				INT OFF								//关闭系统中断
				[P_UARTData] = R1;					//发送数据
				R1 = C_True;						
				JMP ?_UARTSendByte_Quit;			//设置返回值为C_True,直接退出
				
?_UARTSendByte_Failure:
				R1 = C_False;
?_UARTSendByte_Quit:
				INT FIQ, IRQ						//允许系统中断
				POP R2 FROM [SP];
				RETF
//END F_UARTSendByte;

////////////////////////////////////////////////////
//| 函数名:F_UARTSendWord
//| 功  能:通过UART发送一个WORD的函数
//| 入  口:R1 要发送的数据(发送时先高字节后低字节)
//| 出  口:R1 =C_True	发送成功
//|            =C_False	发送失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_UARTSendWord:
				PUSH R2 TO [SP];
?_UARTSendWord_Wait1:
				R2 = [P_UARTCmd2];
				TEST R2, B_TxRdy
				JZ ?_UARTSendWord_Wait1;			//检测发送数据是否已经准备好,没完成则循环检测。
				
				INT OFF								//关闭中断允许
				
				//发送数据的第一个字节
				[P_UARTData] = R1;
				
//准备发送数据的第二个字节
?_UARTSendWord_Wait2:
				R2 = [P_UARTCmd2];
				TEST R2, B_TxRdy
				JZ ?_UARTSendWord_Wait2;
				
				//将R1的高字节移动到低字节
				R1 = R1 LSR 4;
				R1 = R1 LSR 4;
				[P_UARTData] = R1;					//发送数据的第二个字节
				
				R1 = C_True;
				JMP ?_UARTSendWord_Quit;			//发送数据完成后,设置返回值为C_True,返回
				
?_UARTSendWord_Failure:
				R1 = C_False;
?_UARTSendWord_Quit:
				INT FIQ, IRQ						//开启中断允许
				POP R2 FROM [SP];
				RETF
//END F_UARTSendWord;


////////////////////////////////////////////////////
//| 函数名:F_UARTSendBuffer
//| 功  能:通过UART发送一段数据的函数
//| 入  口:R1 数据存放的起始地址(ASCii)
//|         R2 数据的长度(WORD)
//| 出  口:R1 =C_True	发送成功
//|            =C_False	发送失败
//| 影响的寄存器:R1, R2
////////////////////////////////////////////////////
F_UARTSendBuffer:
				PUSH R3, R5 TO [SP]
				R3 = R1;							//保存数据缓冲区的首地址
			
?_UARTSendBuffer_Loop:
				R1 = [R3];							//获得要发送的数据
				CALL F_UARTSendByte;				//发送数据R1
				
				R3 += 1;							//数据缓冲区指针向后移动1个单元
				R2 -= 1;							//数据总数--
				JG ?_UARTSendBuffer_Loop;			//如果数据还没有发送完,回到循环中,继续发送
				
				R1 = C_True;
				JMP ?_UARTSendBuffer_Quit;			//发送完数据,设置返回值C_True,退出
				
//发送数据过程中,如果出现系统状态,返回失败
?_UARTSendBuffer_Failure:
				R1 = C_False;
				
?_UARTSendBuffer_Quit:
				POP R3, R5 FROM [SP]
				RETF
//END F_UARTSendBuffer;

/////////////////////////////////////////////////////////////
//延时程序
F_Delay:
				PUSH R1 TO [SP];
				R1 = 750;
?_Delay_Loop:
				CALL F_Nops;
				R1 -= 1;
				JG ?_Delay_Loop;
				POP R1 FROM [SP];
				RETF
//END F_Delay;

//延时程序
F_Nops:
				NOP
				NOP
				NOP
				NOP
				NOP
				RETF
//END F_Nops;

////////////////////////////////////////////////////
//| 函数名:F_TimerAEnable
//| 功  能:开启定时器A的定时,用来进行休眠设置
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_TimerAEnable:
				PUSH R1 TO [SP];
				INT OFF								//禁止中断
				//允许定时器A中断
				R1 = [P_Int];
				R1 |= B_TmrAInt;
				[P_Int] = R1;
				
				//清除定时器A中断标志
				R1 = [P_IntClr];
				R1 |= B_TmrAInt;
				[P_IntClr] = R1;
				INT FIQ, IRQ						//允许中断
				POP R1 FROM [SP];
				RETF				
//END F_TimerAEnable;

////////////////////////////////////////////////////
//| 函数名:F_TimerADisable
//| 功  能:开启定时器A的定时,用来进行休眠设置
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_TimerADisable:
				PUSH R1 TO [SP];
				INT OFF
				R1 = ~B_TmrAInt;					
				R2 = [P_Int];
				R2 &= R1;
				[P_Int] = R2;						//清除定时器A中断允许标志
				INT FIQ, IRQ
				POP R1 FROM [SP];
				RETF
//END F_TimerADisable;

////////////////////////////////////////////////////
//| 函数名:F_TimerBEnable
//| 功  能:开启定时器B的定时,用来进行识别前定时
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_TimerBEnable:
				PUSH R1 TO [SP];
				INT OFF
				//允许定时器B中断
				R1 = B_TmrBInt;
				R2 = [P_Int];
				R2 |= R1;
				[P_Int] = R2;
				//清定时器B中断标志
				R2 = [P_IntClr];
				R2 |= R1;
				[P_IntClr] = R2;
				
				//设置定时器P_TimeBaseSet
				R1 = 0xFDFF;							//timerB定时中断500ms
				[P_TmrB_Data] = R1;
				[P_TmrB_Load] = R1;
				R1 = 0
				[R_SleepAdd] = R1
				INT FIQ, IRQ
				POP R1 FROM [SP];
				RETF
//END F_TimerBEnable;

////////////////////////////////////////////////////
//| 函数名:F_TimerBDisable
//| 功  能:关闭定时器B的定时(用来进行识别前定时)
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_TimerBDisable:
				PUSH R1, R2 TO [SP];
				INT OFF
				R1 = ~B_TmrBInt;
				R2 = [P_Int];
				R2 &= R1;
				[P_Int] = R2; 
				
				//重新LOAD计数值
				R1 = 0xFDFF; //R_RecogTimeCount];
				[P_TmrB_Data] = R1;
				[P_TmrB_Load] = R1;
				R1 = 0
				[R_SleepAdd] = R1
				INT FIQ, IRQ
				POP R1, R2 FROM [SP];
				RETF
//END F_TimerBDisable;
////////////////////////////////////////////////////
//| 函数名:F_ComposePlay
//| 功  能:混合播放命令
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_ComposePlay:
                R2 = 0x00FF;
				[P_IOD_Dir] = R2;					//设置IOD为输出状态(都设置为输出状态--忙)
                R2 = 0x0001;
				[P_IOD_Data] = R2;
                CALL F_TimerBDisable
                R1 = C_True
                [R_PlayName] = R1
                CALL F_SPT6608_Init;
                CALL F_ChNameInit;                   //TTS初始化
                CALL F_VolumeSet                     //音量设置
                CALL F_SetSpaceTime                  //设置字符间隔时间
                CALL F_SetSilenceTime                //设置静音时间
                R2 = [R_playnumhead] 
				R3 = 65
				MR = R2 * R3
				BP = UartPlayBuffer
				BP += R3   
				R2 = BP + 1              //播放缓冲区首地址
			    R1 = [BP]
			    R1 += 1
			    R1 = R1 LSR 1
			    R3 = CurrentPlayBuffer
			    CALL F_StrToWstr
			    R2 = R1
			    R1 = CurrentPlayBuffer
			    R3 = [R_MultiMode]
                CALL F_ChNamePlay               
?_ChNameWait:
			    CALL F_ChNameServiceLoop;
			    CALL F_ChNameGetStatus;
			    R2 =    0x55AA;                        
		        [P_Watchdog_Clr] = R2;
			    R2 = [R_StopSign]
			    CMP R2, C_True
			    JE  ?_ComposePlayEnd
			    CMP R1,0x0
			    JNE   ?_ChNameWait 
			    CALL F_ChNameStop  
			    CALL F_TimerADisable 

⌨️ 快捷键说明

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