MTouch 用PIC16F883开发的4个按键

来源:互联网 发布:怎样阻止软件自动更新 编辑:程序博客网 时间:2024/05/11 12:34

#include    <pic.h>

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS);
const unsigned char COMP1[4] = {0x94, 0x95, 0x96, 0x97};
const unsigned char COMP2[4] = {0xA0, 0xA1, 0xA2, 0xA3};
#define NUM_BTTNS   4
#define ON     0
#define OFF     1
#define AVG_DELAY   16
#define PCT_ON  65
#define PCT_OFF  60
#define PCT_AVG  18

#define TRISC2OUT   TRISA5
#define TRISC2OUT   TRISA5    
#define TRISC12IN0   TRISA0     
#define TRISC12IN1   TRISA1     
#define TRISC12IN2   TRISB3     
#define TRISC12IN3   TRISB1 

#define LED1 RC1
#define LED2 RC2
#define LED3 RB4
#define LED4 RB5
#define SPA RB0///090217
#define TRISSPK   TRISB0//090217
#define TRISLED1 TRISC1
#define TRISLED2 TRISC2
#define TRISLED3 TRISB4
#define TRISLED4 TRISB5
unsigned char  index;
long percent;
unsigned int RAW[NUM_BTTNS];


unsigned int AVERAGE[NUM_BTTNS];
unsigned char INDEX; 
unsigned char first; 
unsigned int value;

#define B1   0
#define B2  1
#define B3   2
#define B4   3

      
typedef struct {
     char B11 :1;
     char B22 :1;
     char B33 :1;
     char B44 :1;
    }BButtons;

BButtons Buttons;
void Abit_init(void);
void Abit_capinit(void);
void Abit_restart_timers(void);
void interrupt isr(void);
void Abit_next_channel(void);
void AbitDisplayLEDs(char i);
void AbitDisunplayLEDs(char i);


void main(void)
{
 Abit_init();
 LED1=OFF;
 LED2=OFF;
 LED3=OFF;
 LED4=OFF;
SPA=OFF;
 while(1)
 {
  Buttons.B11==1 ? AbitDisplayLEDs(0):AbitDisunplayLEDs(0);
  Buttons.B22==1 ? AbitDisplayLEDs(1):AbitDisunplayLEDs(1);
  Buttons.B33==1 ? AbitDisplayLEDs(2):AbitDisunplayLEDs(2);
  Buttons.B44==1 ? AbitDisplayLEDs(3):AbitDisunplayLEDs(3);
 }
}
void Abit_init(void)
{
 TRISC2OUT=0;
 TRISC12IN0=1;
 TRISC12IN1=1;
 TRISC12IN2=1;
 TRISC12IN3=1;
TRISSPK=0;
 TRISLED1=0;
 TRISLED2=0;
 TRISLED3=0;
 TRISLED4=0;
 Buttons.B11 = 0;
 Buttons.B22 = 0;
 Buttons.B33 = 0;
 Buttons.B44 = 0;
 Abit_capinit();
 GIE=1;
}
void Abit_restart_timer(void)
{

 TMR1L = 0;       
 TMR1H = 0;        
 TMR1ON = 1;        
 TMR0 = 0;       
 T0IF = 0;
}

void Abit_next_channel(void)
{


 INDEX = (++INDEX) & 0x03;            
 CM1CON0 = COMP1[INDEX];             
 CM2CON0 = COMP2[INDEX];
}

void Abit_capinit(void)
{
 for(INDEX=0;INDEX< NUM_BTTNS;INDEX++)
 {
  RAW[INDEX]=0;
  AVERAGE[INDEX]=0;
 }
 first=50;
 OSCCON=0X7F;//内部8M晶振
 INDEX=0;
 CM1CON0=COMP1[INDEX];
 CM2CON0=COMP2[INDEX];
 CM2CON1=0X32;
 ANSEL=0X05;
 ANSELH=0X00;
 VRCON   = 0x8d;
 SRCON   = 0xF0;
 T1CON = 0x06;    
 OPTION = 0x82; 
 Abit_restart_timer();
 INTCON = 0;
 T0IE = 1;
}
void interrupt isr(void)
{
 if (T0IF==1 && T0IE==1)
 {
  TMR1ON = 0;
  value = TMR1L + (unsigned int)(TMR1H << 8);
  RAW[INDEX]=value;
  if (first > 0)
  {
   first--;               
   AVERAGE[INDEX] = value;            
   Abit_next_channel();
   Abit_restart_timer();             
   return; 
  }
  percent=((long)AVERAGE[INDEX]-(long)value);
  if(percent<0)
  {
   percent=0;
  }
  else
  {
   percent=percent*1000;
   percent=percent/AVERAGE[INDEX]; 
  }

 


  if (percent > PCT_ON)
  {
   switch (INDEX)
   {
    case B1:  Buttons.B11 = 1; break;  
    case B2:  Buttons.B22 = 1; break; 
    case B3:  Buttons.B33 = 1; break; 
    case B4:  Buttons.B44 = 1; break;  
    default: break;        
   }

  }
  else if (percent < PCT_OFF)
  {
   switch (INDEX)
   {
    case B1:  Buttons.B11 = 0; break; 
    case B2:  Buttons.B22 = 0; break; 
    case B3:  Buttons.B33 = 0; break; 
    case B4:  Buttons.B44 = 0; break;  
    default: break;       
   }
 
  }
  if (value > AVERAGE[INDEX])
  AVERAGE[INDEX] = value;  
  if (percent < PCT_AVG)
  {
   if (index< AVG_DELAY)   index++;
   else        index = 0;
  
   if (index == AVG_DELAY)
   AVERAGE[INDEX] = AVERAGE[INDEX] + ((long)(value) - (long)(AVERAGE[INDEX]))/8;
  
  }
 Abit_next_channel();
 Abit_restart_timer();

}

}
void AbitDisplayLEDs(char i)
{
 switch (i)
 {
  case 0xFF:               
  case 0:  LED1 = ON;SPA=ON; break; 
  case 1:  LED2 = ON;SPA=ON; break;
  case 2:  LED3 = ON; SPA=ON;break; 
  case 3:  LED4 = ON; SPA=ON;break; 
  
  default: break;
 }
}
void AbitDisunplayLEDs(char i)
{
 switch (i)
 {
  case 0xFF:               
  case 0:  LED1 = OFF;SPA=OFF; break; 
  case 1:  LED2 = OFF;SPA=OFF; break;
  case 2:  LED3 = OFF;SPA=OFF; break; 
  case 3:  LED4 = OFF; SPA=OFF;break; 
  
  default: break;
 }
}

原创粉丝点击