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;
}
}
- MTouch 用PIC16F883开发的4个按键
- 51单片机STC89C52 4个独立按键的检测
- P1 接 8 个独立按键,P2 接 8 个 LED,要求用按键控制 LED 的发光状态
- 基于proteus的51单片机仿真实例五十三、4个按键的组成的按键扫描实例
- 4个按键控制51单片机上的4个LED灯
- 再加个找按键的值
- 发个模拟按键喊话的例子
- 多个WebBrowser的按键响应
- Android Studio按键的5个写法
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- fs2410开发板的按键驱动程序
- 关于4051开发板的按键学习
- 提供个小程序,得到按键值的,做小游戏啥的用
- 4个独立按键实现对数码管数字显示的加减清零等
- N层结构的J2EE项目中的异常处理之二 转载
- MSSQL 性能调优心得(二)
- 明明设了断点,程序却在断点处不停下,的bug
- Linux ftp 启动报错:500 OOPS: vsftpd: cannot open specified config file
- javascript 验证年月格式&判断闰年
- MTouch 用PIC16F883开发的4个按键
- 实现 IEnumerable
- 导线截面积与电流的关系
- N层结构的J2EE项目中的异常处理之三 转载
- 电子元器件
- Generating Model Information in IDA
- N层结构的J2EE项目中的异常处理之四 转载
- Java Math 类中的新功能,第 2 部分 浮点数
- J2EE项目中的异常处理 转载