⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 测量脉搏的源码 Cypress公司使用 CY27443 完成相关的功能
💻 C
字号:
//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#include "exchange.h"
#include "utils.h"
#include "globdefs.h"
#include "sigproc.h"
#include "dataproc.h"
#include "display.h"
#include "stdlib.h"
#include "string.h"

#define POS_LAST_ROW 0
#define POS_MIN_ROW 1
#define POS_MAX_ROW 2
#define POS_MODE_ROW 3
#define POS_GAIN_ROW 4
#define POS_STATUS_ROW 5
#define POS_DATA_COL 35
#define POS_BARGRAPH 75
#define POS_BARGRAPH_START 0
#define POS_BARGRAPH_STOP 5

#define INFO_LAST_TEXT 		"LAST:"
#define INFO_MIN_TEXT  		" MIN:"
#define INFO_MAX_TEXT  		" MAX:"
#define INFO_MODE_TEXT 		"MODE:"
#define INFO_MODE_INSTANT 	"Slow"
#define INFO_MODE_AVERAGE 	"Fast"
#define INFO_GAIN_TEXT		"GAIN:"
#define INFO_STATUS_TEXT    "COND:"
#define INFO_STATUS_ERROR   "Error"
#define INFO_STATUS_WORK    "Work "
#define INFO_BLANK_NUMBER   " -- "

#define FLAG_ERROR_BIT   0
#define FLAG_INIT_BIT    1
#define FLAG_MODE_BIT    2

#define ADC_RANGE_SHIFT 6

#define CONV_BUFFER_LENGHT 5
#define MAX_VALUE 999

#if DEBUG
struct TADC_DATA {WORD y, x;}  ADC_Data; 
#endif

typedef struct 
{
  INT last, min, max;
  BYTE gain, swing, flags;
} TPULSE_STATE;

static INT temp;
static TPULSE_STATE pulse;

BYTE *strfrm(WORD value, WORD max_val, BYTE *dest)
{
  BYTE *ps = dest;
  if (value > max_val) value = max_val;
  itoa(dest, value,10);
  
  while (*ps) ps++;
  while (ps < (dest + CONV_BUFFER_LENGHT - 1)) *ps++ = ' ';
  *ps = 0;

  return dest;
}

void LCDUpdate(TPULSE_STATE *params)
{
  BYTE buffer[CONV_BUFFER_LENGHT];

  
  if (CHECKBIT(params->flags, FLAG_INIT_BIT))
  {
    LcdInit();
  
    LcdGoto(0, POS_LAST_ROW); 	  LcdCStr(INFO_LAST_TEXT);
    LcdGoto(0, POS_MIN_ROW);  	  LcdCStr(INFO_MIN_TEXT);
    LcdGoto(0, POS_MAX_ROW);  	  LcdCStr(INFO_MAX_TEXT);
    LcdGoto(0, POS_MODE_ROW); 	  LcdCStr(INFO_MODE_TEXT);
    LcdGoto(0, POS_GAIN_ROW); 	  LcdCStr(INFO_GAIN_TEXT);
    LcdGoto(0, POS_STATUS_ROW);   LcdCStr(INFO_STATUS_TEXT);
    
    LcdVBargraph(POS_BARGRAPH, POS_BARGRAPH_START, POS_BARGRAPH_STOP, 0);
      
    CLEARBIT(params->flags, FLAG_INIT_BIT);
  }
   
  LcdGoto(POS_DATA_COL, POS_LAST_ROW); 
  if (params->last) LcdStr(strfrm(params->last, MAX_VALUE, buffer)); else LcdCStr(INFO_BLANK_NUMBER);
  
  LcdGoto(POS_DATA_COL, POS_MIN_ROW); 
  if (params->min) LcdStr(strfrm(params->min, MAX_VALUE, buffer)); else LcdCStr(INFO_BLANK_NUMBER);
  
  LcdGoto(POS_DATA_COL, POS_MAX_ROW); 
  if (params->max) LcdStr(strfrm(params->max, MAX_VALUE, buffer)); else LcdCStr(INFO_BLANK_NUMBER);
  
  LcdGoto(POS_DATA_COL, POS_MODE_ROW);   
  CHECKBIT(params->flags, FLAG_MODE_BIT)?(LcdCStr(INFO_MODE_INSTANT)):(LcdCStr(INFO_MODE_AVERAGE));    
  
  LcdGoto(POS_DATA_COL, POS_GAIN_ROW); 
  LcdStr(strfrm(params->gain, MAX_VALUE, buffer));   
  
  LcdGoto(POS_DATA_COL, POS_STATUS_ROW); 
  CHECKBIT(params->flags, FLAG_ERROR_BIT)?(LcdCStr(INFO_STATUS_ERROR)):(LcdCStr(INFO_STATUS_WORK));
  
  LcdVBargraph(POS_BARGRAPH, POS_BARGRAPH_START, POS_BARGRAPH_STOP, params->swing);
}

BYTE ReadButtons(void)
{
  static BYTE last_read = 0;
  BYTE temp, result = 0;
  
  BUTTONS_PORT |= BIT(BUTTON_MODE_BIT) | BIT(BUTTON_RESET_BIT);
  temp = BUTTONS_PORT & (BIT(BUTTON_MODE_BIT) | BIT(BUTTON_RESET_BIT));
  
  result = (temp ^ last_read) & (~temp);  
  last_read = temp; 
  
  return result;
}



void main()
{        
  In_PGA_Start(In_PGA_HIGHPOWER);
  In_PGA_SetGain(In_PGA_G1_00);
  
  Carrier_Timer_Start();    
  Mixer_Start(Mixer_HIGHPOWER);
  
  In_BPF_Start(In_BPF_HIGHPOWER);
  
#if DEBUG  
  Exchange_Start();
#endif  
  
  //AMD_CR1 |= 0x01; -- global output bus driven
  AMD_CR1 |= 0x04; // -- comparator bus driven
  
  SETBIT(INT_MSK3, 0);
  SETBIT(INT_MSK0, 6);
  
  ADC_SetResolution(13);
  
  ADC_bPWM_IntTime_LSB = (BYTE)ADC_INTEGRATION;
  ADC_bPWM_IntTime_MSB = (BYTE)(ADC_INTEGRATION >> 8);
  
  ADC_bPWM_Period_LSB = (BYTE)ADC_PERIOD;
  ADC_bPWM_Period_MSB = (BYTE)(ADC_PERIOD >> 8);
  
  M8C_EnableGInt;
  
#if DEBUG  
  Exchange_Start();
#endif  
    
  ADC_Start(ADC_HIGHPOWER);
  ADC_GetSamples(0);  
    
  
  pulse.flags = BIT(FLAG_INIT_BIT);
  LCDUpdate(&pulse);
  
  while(1) 
  {
    temp = ReadButtons();
    if (CHECKBIT(temp, BUTTON_MODE_BIT))
    {
      pulse.flags ^= BIT(FLAG_MODE_BIT);
      Pulse_Init_Calculate();     
      LCDUpdate(&pulse);
    }  
    
    if (CHECKBIT(temp, BUTTON_RESET_BIT))
    {
      pulse.last = pulse.min = pulse.max = 0;
      LCDUpdate(&pulse);
      Pulse_Init_Calculate();      
    }
    
    temp = (CHECKBIT(pulse.flags, FLAG_MODE_BIT))?
      (Pulse_Averaged_Calculate()) : (Pulse_Instant_Calculate());
    
    pulse.gain = GetGainLevel();
    pulse.swing = GetADCRange() >> ADC_RANGE_SHIFT;
    
    if (PULSE_IN_PROGRESS == temp) CLEARBIT(pulse.flags, FLAG_ERROR_BIT);
      else 
    if (PULSE_CALC_ERROR == temp) SETBIT(pulse.flags, FLAG_ERROR_BIT);
     else
    {
      pulse.last = temp;
      if (pulse.max < pulse.last) pulse.max = pulse.last;
      if ((pulse.min > pulse.last) || (0 == pulse.min)) pulse.min = pulse.last;
    } 
    
    if (Check_Update_Timeout()) LCDUpdate(&pulse);
    
#if DEBUG
     while (!ADC_fIsDataAvailable());
     ADC_Data.y = GetDebugVar();
     ADC_Data.x = ADC_iGetDataClearFlag();
     Exchange_SendBuf((BYTE*)&ADC_Data, 4);
#endif    
     
  }
   
  
}
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -