📄 function.asm
字号:
//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 + -