📄 userfunction.c
字号:
//=============================================================
// 文件名称: UserFunction.c
// 实现功能: 用户功能子程序程序
// 完成日期: 2004,7,21
//==============================================================
#include "SPCE061A.h"
#define M_LCD_SHOW_DOT 0x0008 //LCD显示小数点给p+9
#define M_TIMERA_EN 0x0001 //使能TimerA的配置,计数频率为96KHz
#define M_TIMERA_STOP 0x0006 //停止TimerA的配置,计数器停止工作
#define Data_Addr0 (struct Robot_xx *)0xf600 //数据存储地址
#define Data_Addr1 (struct Robot_xx *)0xf700 //标识存储地址
extern unsigned int uiIOB_20Hz_flag; //IOB01口(即20Hz方波输出口)的状态标识
extern unsigned int uiEXT_EN_flag; //外部中断使能标识位
extern unsigned int uiMeasure_Index; //当前测量的次数
extern unsigned int uiResult[4]; //保存测四次测量结果的缓存区
extern unsigned int uiMeasure_Num; //况的测量次数
extern unsigned int uiMeasure_Data[50]; //测量的数据个数
extern unsigned int uiMeasure_Read_Index; //测量结果查询索引号
extern unsigned int uiTX_Buff[5]; //发送数据缓冲区
//用于液晶显示及键盘扫描用的
extern void InitIsr(void);
extern void InitSPL10A(void);
extern void RefreshLCD(void);
extern CheckKeypad(void);
extern DisplayBuffer;
extern unsigned int *p; //指向显示缓冲区的指针
//....end
extern unsigned int F_Binary_BCD(unsigned int Binary);
void Flash_erase(unsigned int adr);
void Flash_write(unsigned int adr,unsigned int dat);
void ShowData_LCD(unsigned int Show_Data,unsigned int Data_Index);
unsigned int ResultOS(void);
void ErrorOS(void);
unsigned int uiError_Counter; //出错累加器
//=============================================================
// 函数名称: BeginMeasure()
// 功能描述: 进行一次测距 包括数据处理、数据显示、语音报结果
// 同时还要存贮测量值(存放在Flash)中
// 语法格式: void BeginMeasure(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void US_Send200us(void)
{
*P_TimerB_Data = 0x0000; //TimerA计数器清零
*P_IOB_Data=0x0001;
*P_TimerB_Ctrl = M_TIMERA_EN; //使能TimerA
User_Delay(19); //延时,发送完十一个完整的40KHz方波脉冲
*P_IOB_Data=0x0000; //停止发送
uiIOB_20Hz_flag = 1; //置位标识位
}
void BeginMeasure(void)
{
unsigned int uiExit_RQ; //退出循环标识
unsigned int uiMeasure_Result; //测量结果
unsigned int i;
uiExit_RQ = 1;
uiMeasure_Index = 0; //开始测量
*P_INT_Ctrl = 0x0002;
while(uiExit_RQ)
{
if(uiIOB_20Hz_flag)
{
if(*P_TimerB_Data>=400)
{
*P_INT_Clear = 0x0100; //开中断前先清中断
*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100;
uiEXT_EN_flag = 1;
uiIOB_20Hz_flag = 0;
}
}
//一次测量结束,进入结果处理
if(uiMeasure_Index>4)
{
uiMeasure_Index=0;
uiMeasure_Result = ResultOS();
if(uiMeasure_Result<=75)
{//测量时出错,进入错误管理
ErrorOS();
}
else
{
uiTX_Buff[0] = uiMeasure_Result;
UART_SendChar(2);
//下面应该把测量得到的数据进行保存,可以先存在RAM中
if(uiMeasure_Num<50)
{
uiMeasure_Data[uiMeasure_Num] = uiMeasure_Result;
uiMeasure_Num++;
uiMeasure_Read_Index = uiMeasure_Num;
}
else
{
for(i=1;i<50;i++)
{
uiMeasure_Data[i-1]=uiMeasure_Data[i];
}
uiMeasure_Data[49] = uiMeasure_Result;
}
ShowData_LCD(uiMeasure_Result,uiMeasure_Num+1);
Speech_Result(uiMeasure_Result);
uiError_Counter = 0; //错误计数器清零
}
uiExit_RQ=0;
break;
}
}
}
//=============================================================
// 函数名称: ResultOS()
// 功能描述: 对结果进行软件处理 包括结果解算、软件补偿等。
// 语法格式: unsigned int ResultOS(void)
// 入口参数: 无
// 出口参数: 十进制的距离,以cm为单位
// 注意事项: 仅为用户模型
//=============================================================
unsigned int ResultOS(void)
{
unsigned long int uliResult2;
unsigned int uiResult1;
unsigned int i;
uiResult1 = (uiResult[1]+uiResult[2])/2; //取平均值
uliResult2 = (unsigned long int)uiResult1*33550;//数据处理
uliResult2 = uliResult2/96;
uliResult2 = uliResult2/2;
uliResult2 = uliResult2/1000;
uiResult1 = (unsigned int)uliResult2;
for(i=0;i<4;i++)
{
uiResult[i]=0;
}
return uiResult1;
}
//=============================================================
// 函数名称: void ShowData_LCD(unsigned int Show_Data)
// 功能描述: 对测量结果在LCD上显示
// 语法格式: void ShowData_LCD(unsigned int Show_Data)
// 入口参数: Show_Data---要在LCD上显示的数据
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void ShowData_LCD(unsigned int Show_Data,unsigned int Data_Index)
{
unsigned int uiShow_Data_BCD;
unsigned int uiTemp;
uiShow_Data_BCD = F_Binary_BCD(Show_Data);
uiTemp = uiShow_Data_BCD&0x000f;
*(p+6) = uiTemp;
uiTemp = (uiShow_Data_BCD>>4)&0x000f;
*(p+5) = uiTemp;
uiTemp = (uiShow_Data_BCD>>8)&0x000f;
*(p+4) = uiTemp;
*(p+9) = M_LCD_SHOW_DOT;
uiShow_Data_BCD = F_Binary_BCD(Data_Index);
*(p+1) = uiShow_Data_BCD&0x000f;
*p = (uiShow_Data_BCD>>4)&0x000f;
RefreshLCD();
}
//=============================================================
// 函数名称: void ErrorOS(void)
// 功能描述: 测量出错管理(处理)
// 语法格式: void ErrorOS(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void LCD_Draw(unsigned int type);
void ErrorOS(void)
{
unsigned int i;
for(i=0;i<3;i++)
{
LCD_Draw(1);
User_Delay(20000);
LCD_Draw(0);
User_Delay(20000);
}
uiError_Counter++;
if(uiError_Counter>3) uiError_Counter = 3;
switch(uiError_Counter)
{
case 1: Speech_Resource(14);break;
case 2: Speech_Resource(15);break;
case 3: Speech_Resource(16);break;
default: break;
}
}
void LCD_Draw(unsigned int type)
{
if(type)
{//全部填充8
*p=0x0008;
*(p+1) = 0x0008;
*(p+2) = 0x0008;
*(p+3) = 0x0008;
*(p+4) = 0x0008;
*(p+5) = 0x0008;
*(p+6) = 0x0008;
*(p+7) = 0x0008;
}
else
{//全部清零
*p=0x000a;
*(p+1) = 0x000a;
*(p+2) = 0x000a;
*(p+3) = 0x000a;
*(p+4) = 0x000a;
*(p+5) = 0x000a;
*(p+6) = 0x000a;
*(p+7) = 0x000a;
}
RefreshLCD();
}
//=============================================================
// 函数名称: void Measure_Data_Read(unsigned int type)
// 功能描述: 测量历史数据查询
// 语法格式: void Measure_Data_Read(unsigned int type)
// 入口参数: unsigned int type 向前或向后进行查询
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void Measure_Data_Read(unsigned int type)
{
if(uiMeasure_Num == 0)
ErrorOS();
else
{
if(type)//向前面的数据查询
uiMeasure_Read_Index++;
else//向后面的数据查询
uiMeasure_Read_Index--;
if(uiMeasure_Read_Index == 0) uiMeasure_Read_Index = uiMeasure_Num;
if(uiMeasure_Read_Index > uiMeasure_Num) uiMeasure_Read_Index = 1;
ShowData_LCD(uiMeasure_Data[uiMeasure_Read_Index-1],uiMeasure_Read_Index);
}
}
//=============================================================
// 函数名称: void Measure_Data_Save(void)
// 功能描述: 测量数据保存
// 语法格式: void Measure_Data_Save(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void Measure_Data_Save(void)
{
unsigned int uiData_Pointer;
unsigned int i;
uiData_Pointer = (unsigned int)Data_Addr0;
Flash_erase(uiData_Pointer);
for(i=0;i<uiMeasure_Num;i++)
{
Flash_write(uiData_Pointer+i,uiMeasure_Data[i]);
}
uiData_Pointer = (unsigned int)Data_Addr1;
Flash_erase(uiData_Pointer);
Flash_write(uiData_Pointer,0xaaaa);
Flash_write(uiData_Pointer+1,0xbbbb);
Flash_write(uiData_Pointer+2,uiMeasure_Num);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -