📄 function.asm
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////
//| 文件名:function.asm
//| 功 能:将系统需要的各项功能封装为模块函数
//| 编码人:陈欣蕊
//| 版 本:V1.0
//| 时 间:2005.11.25
//| 修改历史:
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////
//| 包含的头文件
.include SPT6608.INC
.include main.h
////////////////////////////////////////////////////
//| 外部函数声明
.external F_ChNameInit
////////////////////////////////////////////////////
//| 全局函数定义
//系统初始化
.public F_WakeUpCheck; //判断是否是从standby模式唤醒
.public F_CPUInit; //CPU硬件资源复位
.public F_PlatInit; //软件平台和各项参数初始化
.public F_Restore; //系统唤醒后各项参数恢复
//消息队列函数
.public F_PostMessage; //投递消息函数
.public F_GetMessage; //获取消息函数
.public F_ClearMessage; //清消息队列函数
//UART处理
.public F_UARTProc;
.public F_UARTSetBaudRate; //设置波特率处理模块
.public F_UARTGotoSleep; //进入休眠状态
.public F_UARTGotoSleep1;
.public F_UARTSendByte; //串口发送BYTE
.public F_UARTSendWord; //串口发送WORD
.public F_UARTSendBuffer; //串口发送Buffer
//系统函数
//.public F_UARTInit; //系统重新初始化
.public F_Delay; //延时程序
.public F_TimerAEnable; //使能TimerA中断
.public F_TimerADisable; //禁止TimerA中断
.public F_TimerBEnable; //使能TimerB中断
.public F_TimerBDisable; //禁止TimerB中断
.public F_ComposePlay;
.public F_PhrasePlay;
.public F_SoundPlay
.public F_StopPlay
.public F_VolumeSet
//.public F_bMultiVoiceMode
.public F_SetSpaceTime
.public F_SetSilenceTime
.public F_SetPlayTime
.public F_ClearPlayRam
.public F_ClearOnePlayRam
.PUBLIC F_SPT6608_Init
.Public RW_Length,RW_CountAddr;
.Public RW_Flag,RW_Address,RW_Temp1;
.external _RES_CHIMES24_ENC_SA;
.external _RES_CORRECT24_ENC_SA;
.external _RES_FOLDER24_ENC_SA;
.external _RES_LING24_ENC_SA;
.external _RES_MCITEST24_ENC_SA;
.external _RES_RIGHT_ENC_SA;
.external _RES_SYSMSG24_ENC_SA;
.ram
.var RW_DebounceReg
.VAR RW_KeyBufOld;
.VAR RW_KeyCode;
.VAR RW_Flag
.var RW_Length
.Var RW_Address
.var RW_CountAddr
.var RW_Temp1
.var TTS_Status
.var R_StrLen
.const B_RecordBeginAddr = 0x1000
.public R_Resouce_BS
.public R_Resouce_DS
.var R_Resouce_BS
.var R_Resouce_DS
.const B_PhraseNum = 0x41
.const B_SoundNum = 0x07
.define C_UserBuffer 0x1000;
.define C_EndAddrBuf 0x6FFF
.define C_EndAddrFlag 0x2
.define C_RecEndFlag 0x1
////////////////////////////////////////////////////
//| 函数模块实现
.CODE
////////////////////////////////////////////////////
//| 函数名:F_WakeUpCheck
//| 功 能:检测系统是否是从休眠模式刚刚被唤醒的
//| 入 口:无
//| 出 口:R1 =C_True 被唤醒
//| =C_False 不是被唤醒的
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_WakeUpCheck:
R1 = [P_WakeUpClr];
TEST R1, 0x0002 //保留其低11位
JZ ?_WakeUpCheck_False; //是0,表示不是被唤醒的
R1 = C_True;
JMP ?_WakeUpCheck_Quit;
?_WakeUpCheck_False:
R1 = C_False;
?_WakeUpCheck_Quit:
RETF
//END F_WakeUpCheck;
////////////////////////////////////////////////////
//| 函数名:F_CPUInit
//| 功 能:对硬件进行初始化
//| 入 口:无
//| 出 口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_CPUInit:
PUSH R1, R5 TO [SP];
//IO口初始化
r1 = 0x00FF
[P_IOA_Dir] = r1 //Set IOA as output ports
[P_IOB_Dir] = r1 //Set IOB as output ports
[P_IOC_Dir] = r1 //Set IOC as output ports
R1 = 0x7F;
[P_IOE_Dir] = R1; //IOE7设置为输入
R1 = 0x8000;
[P_IOE_PullR] = R1; //IOE7上拉电阻
R1 = 0x0080
[P_IoeWakeUp] = R1; //设置IOE7唤醒
R1 = [P_IOE_Latch];
R2 = 0x00FF;
[P_IOD_Dir] = R2; //设置IOD为输出状态(都设置为输出状态--低功耗)
R2 = 0x0000;
[P_IOD_Data] = R2;
R2 = 0x00FF;
[P_IOA_Dir] = R2; //设置IOA为输出状态(都设置为输出状态--低功耗)
R2 = 0x0000;
[P_IOA_Data] = R2;
R2 = 0x00FF;
[P_IOB_Dir] = R2; //设置IOB为输出状态(都设置为输出状态--低功耗)
R2 = 0x0000;
[P_IOB_Data] = R2;
R2 = 0x00FF;
[P_IOC_Dir] = R2; //设置IOC为输出状态(都设置为输出状态--低功耗)
R2 = 0x0000;
[P_IOC_Data] = R2;
//允许串行中断、定时器中断
R1 = 0x0020;
[P_UARTCmd1] = R1;
R1 = B_RxIntEn; //Set register again
[P_UARTCmd1] = R1; //Enable RX , auto-calibrate clock
R1 = B_TxIntEn | B_RxIntEn;
[P_UARTCmd2] = R1;
CALL F_UARTConfigCheck
CALL F_UARTSetBaudRate
//设置时钟源和计数
R1 =B_8KHz+B_Enable32768+B_Strong32768+B_128Hz
[P_TimeBaseSet] = R1;
R1 = B_UARTInt | B_IoaInt| B_T128HzInt;// | B_TmrBInt;//B_TmrAInt ;//允许UART、timerA、timerB中断
[P_Int] = R1;
[P_IntClr] = R1;
R1 = 0x8000;
[R_DAC] = R1;
[P_DAC] = R1;
nop
R1 = 0x55AA
R2 = 16
R4 =0
R3 = R1 ror 4
R3 = R1 ror 4
Loop1:
R3 = R3 LSL 1
R2 -=1
JNZ Loop1
//timerA定时中断16K
R1 = 0xFFFE;
[P_TmrA_Data] = R1;
[P_TmrA_Load] = R1;
R1 = C_WaitTime1000; //timerB定时中断50ms
[P_TmrB_Data] = R1;
[P_TmrB_Load] = R1;
R1 = 0xD5D0;//0xD5D0;//0xDDD0; //定时器A使能
[P_Tmr_Ctrl] = R1;
//关闭PGA等等
r1 = 0x55aa
[P_Watchdog_Clr] = r1 //Reset watchdog
R1 = 0xFFFF
[P_IntClr] = R1
Int IRQ,FIQ;
nop
POP R1, R5 FROM [SP];
RETF
//END F_CPUInit;
////////////////////////////////////////////////////
//| 函数名:F_PlatInit
//| 功 能:对软件平台进行初始化
//| 入 口:无
//| 出 口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_PlatInit:
PUSH R1 TO [SP];
//消息队列初始化
R1 = MsgQueue;
[R_MQHeadPtr] = R1;
[R_MQTailPtr] = R1;
R1 = M_Null;
[R_MessageType] = R1; //消息全局变量设置为空消息
R1 = 0x0000;
[R_MsgNum] = R1; //消息队列中消息的个数设置为0
[R_MessageValue] = R1; //消息参数全局变量设置为0
[R_CommandType] = R1; //命令全局变量设置为0
[R_CommandValue] = R1; //命令参数变量设置为0
[R_playnumhead] = R1; //清播放队列的头
[R_playnumtail] = R1; //清播放队列的尾
[R_playnum] = R1; //清空播放条数
[R_MultiMode] = R1; //姓名多音字设置默认为无效
R1 = 15
[R_spacetime] = R1;
R1 = 80
[R_chartime] = R1;
R1 = 0 //默认设置为延时0s
[R_playspacetime] = R1;
R1 = 0x0F
[R_VolumeSet] = R1;
R1 = C_True
[R_PlayName] = R1; //初始化为播放姓名
R1 = C_False
[R_StopSign] = R1
R1 = C_False;
[R_ValidFrame] = R1
POP R1 FROM [SP];
RETF;
//END F_PlatInit;
////////////////////////////////////////////////////
//| 函数名:F_UARTConfigCheck
//| 功 能:检测UART跳线设置
//| 入 口:无
//| 出 口:R1
//| =C_UARTConfig9600 不跳线时波特率配置为9600
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_UARTConfigCheck:
PUSH R2 TO [SP];
R1 = 0x0078;
[P_IOE_Dir] = R1; //IOE0-2 配置为输入
R1 = 0x8700;
[P_IOE_PullR] = R1; //将IOE0-2配置为PULL HIGH
R1 = [P_IOE_Data];
R1 &= 0xFF
CMP R1 , 0
JE ?_UARTConfigCheck_1200
CMP R1 , 1
JE ?_UARTConfigCheck_2400
CMP R1 , 2
JE ?_UARTConfigCheck_4800
CMP R1 , 3
JE ?_UARTConfigCheck_19200
CMP R1 , 4
JE ?_UARTConfigCheck_38400
CMP R1 , 5
JE ?_UARTConfigCheck_57600
CMP R1 , 6
JE ?_UARTConfigCheck_115200
CMP R1 , 7
JE ?_UARTConfigCheck_9600
JMP ?_UARTConfigCheck_9600
?_UARTConfigCheck_1200:
R1 = C_UARTConfig1200;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_2400:
R1 = C_UARTConfig2400;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_4800:
R1 = C_UARTConfig4800;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_19200:
R1 = C_UARTConfig19200;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_38400:
R1 = C_UARTConfig38400;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_57600:
R1 = C_UARTConfig57600;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_115200:
R1 = C_UARTConfig115200;
JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_9600:
R1 = C_UARTConfig9600;
?_UARTConfigCheck_Quit:
//恢复IOE1低功耗状态
// R2 = 0x007F;
// [P_IOE_Dir] = R2; //将IOE6配置为输出状态,其他设置为输入状态
// R2 = 0x0000;
// [P_IOE_PullR] = R2; //将IOE全部悬空
POP R2 FROM [SP];
RETF
//END F_UARTConfigCheck;
////////////////////////////////////////////////////
//| 函数名:F_Restore
//| 功 能:当系统被唤醒后恢复系统的默认的设置
//| 入 口:无
//| 出 口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_Restore:
PUSH R1 TO [SP];
//关闭唤醒触发
//恢复波特率
R1 = C_False
[R_StopSign] = R1
R1 = 0x0020;
[P_UARTCmd1] = R1; //串口初始化
R1 = B_RxIntEn;
[P_UARTCmd1] = R1;
R1 = B_RxIntEn | B_TxIntEn;
[P_UARTCmd2] = R1;
R1 = [R_UARTStatus];
CALL F_UARTSetBaudRate;
?_Restore_Uart:
R1 = [P_UARTCmd2]
R1 &= 0x01
JZ ?_Restore_Uart
R1 = [P_UARTData] //清除PE,OE
R1 = B_UARTInt | B_IoaInt | B_T128HzInt;
[P_Int] = R1;
[P_IntClr] = R1;
CALL F_ClearMessage;
POP R1 FROM [SP];
RETF
//END F_Restore;
////////////////////////////////////////////////////
//| 函数名:F_PostMessage
//| 功 能:向系统消息队列投递消息的函数
//| 入 口:R1 消息类型
//| 出 口:R1 =C_True 成功 =C_False 失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_PostMessage:
PUSH R2 TO [SP];
R2 = [R_MsgNum];
CMP R2, C_MQLen
JGE ?_PostMessage_Quit1; //如果消息队列中的消息个数已经达到上限,退出(C_False)
//投递消息
R2 = [R_MQHeadPtr];
[R2] = R1; //消息放入到消息队列
//消息队列中消息个数++
INT OFF
R1 = [R_MsgNum];
R1 += 1;
[R_MsgNum] = R1;
INT FIQ, IRQ
R1 = C_True; //设置返回值为C_True;
//移动消息队列尾指针
CMP R2, MsgQueue + C_MQLen - 1
JL ?_PostMessage_Next; //如果消息队列头指针没有到达缓冲区最后,直接++
//否则尾指针回到消息缓冲区头
R2 = MsgQueue;
[R_MQHeadPtr] = R2;
JMP ?_PostMessage_Quit; //返回
?_PostMessage_Next:
R2 += 1;
[R_MQHeadPtr] = R2; //消息队列头指针++
JMP ?_PostMessage_Quit;
?_PostMessage_Quit1:
R1 = C_False;
?_PostMessage_Quit:
POP R2 FROM [SP];
RETF
//END F_PostMessage;
////////////////////////////////////////////////////
//| 函数名:F_GetMessage
//| 功 能:从系统消息队列中获取消息的函数
//| 入 口:无
//| 出 口:[R_MessageType]的消息值
//| R1 =C_True 成功 =C_False 失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_GetMessage:
PUSH R2 TO [SP];
R1 = [R_MsgNum];
JZ ?_GetMessage_Failure; //系统消息队列中没有消息,跳转退出
R2 = [R_MQTailPtr];
R1 = [R2];
[R_MessageType] = R1; //取消息到消息全局变量中
//消息队列中的消息个数--
//INT OFF
R1 = [R_MsgNum];
R1 -= 1;
[R_MsgNum] = R1;
//INT FIQ, IRQ
R1 = C_True; //设置返回值=C_False
CMP R2, MsgQueue + C_MQLen - 1
JL ?_GetMessage_Next; //尾指针可以直接++处理
R2 = MsgQueue;
[R_MQTailPtr] = R2;
JMP ?_GetMessage_Quit; //将尾指针设置到消息缓冲区的头
?_GetMessage_Next:
R2 += 1;
[R_MQTailPtr] = R2;
JMP ?_GetMessage_Quit; //重新设置尾指针,退出
?_GetMessage_Failure:
R1 = M_Null;
[R_MessageType] = R1; //取消息失败,消息变量设置为空消息
R1 = C_False; //返回值设置C_False
?_GetMessage_Quit:
POP R2 FROM [SP];
RETF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -