📄 system.c
字号:
//========================================================
// 文件名称: system.c
// 功能描述: 系统初始化、部分功能程序
// 维护记录: 2005-12-12 v1.0
//========================================================
#include "SPCE061A.h"
//下面的函数定义在Speech.c当中,播放A2000语音资源子程序
extern void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel);
unsigned int Show_Freq_Set[3] = {0,0,0};
unsigned int Show_Counter_1KHz[3] = {0,0,0};
//=======================================================================
// 语法格式: void Initial_IO(void)
// 实现功能: 系统端口初始化程序
// 参数: 无
// 返回值: 无
//=======================================================================
void Initial_IO(void)
{
*P_IOA_Dir = *P_IOA_Dir|0xff00;
*P_IOA_Attrib = *P_IOA_Attrib|0xff00;
*P_IOA_Data = *P_IOA_Buffer&0x00ff;
*P_IOB_Dir = *P_IOB_Dir|0x0003;
*P_IOB_Attrib = *P_IOB_Attrib|0x0003;
*P_IOB_Data = *P_IOB_Buffer&0xFFFc;
}
//=======================================================================
// 语法格式: void Channel_Sel(unsigned int ch)
// 实现功能: 传感器通道选择
// 参数: ch 选择的通道号(0~2)
// 返回值: 无
//=======================================================================
void Channel_Sel(unsigned int ch)
{
unsigned int uiTemp;
ch = ch&0x0003; //只取低二位,因为系统设计仅使用了IOB0和IOB1
uiTemp = *P_IOB_Buffer; //采用先读,再计数,再写的方式
uiTemp = uiTemp&0xfffc; //保证其它端口状态不变
uiTemp = uiTemp|ch;
*P_IOB_Data = uiTemp;
}
//=======================================================================
// 语法格式: void Result_Check(unsigned int ch,unsigned int Result[3])
// 实现功能: 测量结果处理程序 更新状态显示频率设置值,更新状态显示
// 针对测量结果进行语音播报
// 参数: unsigned int ch 通道号数
// unsigned int Result 该通道的测量值
// 返回值: 无
//=======================================================================
void Result_Check(unsigned int ch,unsigned int Result[3])
{
if(Result[ch]<150) //判断测量结果是否大于150cm?
{ //小于,则设置显示频率值
if(Result[ch]>40) Show_Freq_Set[ch] = Result[ch]*6; //如果非零,则结果乘以6
else Show_Freq_Set[ch] = 100; //如果结果为零,则设置为100
} //数值越大,则频率越低
else
{
Show_Freq_Set[ch] = 0; //测量值大于150cm
switch(ch)
{ //对应通道的状态显示进行熄灭操作
case 0:*P_IOA_Data = *P_IOA_Buffer&(~0x0100); break;
case 1:*P_IOA_Data = *P_IOA_Buffer&(~0x0200); break;
case 2:*P_IOA_Data = *P_IOA_Buffer&(~0x0400); break;
default: break;
}
}
if(Result[1]<150||(Result[0]<150&&Result[2]<150))
{
PlaySnd_Auto(1,3);
}
else if(Result[0]<150)
{
PlaySnd_Auto(0,3);
}
else if(Result[2]<150)
{
PlaySnd_Auto(2,3);
}
}
//=======================================================================
// 语法格式: void Show_Flag(void)
// 实现功能: 状态显示程序,在IRQ4的1KHz中断当中调用
// 参数: 无
// 返回值: 无
//=======================================================================
void Show_Flag(void)
{
if(Show_Freq_Set[0]!=0) //第一组传感器(左)
{ //该显示频率设置的变量非零,表示要进行状态显示
Show_Counter_1KHz[0] = Show_Counter_1KHz[0]+1; //计数器加1
if(Show_Counter_1KHz[0]>Show_Freq_Set[0]) //如果计数达到了显示频率设置的值,表示需要对端口
{ //输出进行翻转
Show_Counter_1KHz[0] = 0; //计数器清零
*P_IOA_Data = *P_IOA_Buffer^0x0100; //与1进行异或, 相当于对该位进行取反
}
}
if(Show_Freq_Set[1]!=0) //第二组传感器(中)
{
Show_Counter_1KHz[1] = Show_Counter_1KHz[1]+1;
if(Show_Counter_1KHz[1]>Show_Freq_Set[1])
{
Show_Counter_1KHz[1] = 0;
*P_IOA_Data = *P_IOA_Buffer^0x0200;
}
}
if(Show_Freq_Set[2]!=0) //第三组传感器(右)
{
Show_Counter_1KHz[2] = Show_Counter_1KHz[2]+1;
if(Show_Counter_1KHz[2]>Show_Freq_Set[2])
{
Show_Counter_1KHz[2] = 0;
*P_IOA_Data = *P_IOA_Buffer^0x0400;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -