?? 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 + -