#include "STC15F2K60S2.H"
#include "bsp_key.h"
#include "bsp_led.h"
#include "timer.h"
#define uint8 unsigned char
#define doublekey_time_define 60
#define longkey_time_define 200 //>255就等于255,变量只有8位
//按键的状态
#define key_up 0
#define key_down 1
//LED的位定义
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
//定时器
uint8 count = 0;
//状态变量,记录当前时刻的状态
uint8 key_state = key_up;//默认是抬起状态
//区分第一次进去key_up还是第二次
bit first_key = 0;
//存结果
bit one_key = 0;
bit double_key = 0;
bit long_key = 0;
bit total_key = 0;
//500ms倒计时
bit timer_doublekey_start = 0;
uint8 timer_doublekey_time = doublekey_time_define;
//2s倒计时
bit timer_longkey_start = 0;
uint8 timer_longkey_time = longkey_time_define;
//bit timer_start = 0
void main()
{
P0 = 0XFF;
P2 = P2 & 0x1F | 0x80; // 0x80,选通Y4,也就是LED的锁存器,将数据透传过去
//P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开
EA = 1;
Timer0Init(); //1毫秒@12.000MHz
while(1){
}
}
void timer0( ) interrupt 1 //10ms一次
{
count++;
if(timer_doublekey_start == 1&&timer_doublekey_time!= 0) timer_doublekey_time--;
if(timer_longkey_start == 1&&timer_longkey_time!= 0) timer_longkey_time--;
//50ms检测一次按键的电平状态
if(count >= 5){
count = 0;
switch(key_state){
case key_up:
if(Key_Read_BTN() == 7){
key_state = key_down;
//第一次按下
if(first_key == 0){
timer_doublekey_start = 1;
timer_longkey_start = 1;
first_key = 1;
}
//第二次按下
else{
double_key = 1;
total_key = 1;
}
}
//第二次进去key_up
else{
if(first_key == 1&&timer_doublekey_time <= 0){
one_key = 1;
total_key = 1;
}
}
break;
case key_down:
if(Key_Read_BTN() == 0){
key_state = key_up;
}else{
if(timer_longkey_time <= 0){
long_key = 1;
total_key = 1;
}
}
break;
}
//为下次作准备
if(total_key == 1){
if(one_key == 1){
LED1 = !LED1;
}
if(double_key == 1){
LED2 = !LED2;
}
if(long_key == 1){
LED3 = !LED3;
}
//相关变量回到初始状态
first_key = 0;
one_key = 0;
double_key = 0;
long_key = 0;
total_key = 0;
timer_doublekey_start = 0;
timer_doublekey_time = doublekey_time_define;
timer_longkey_start = 0;
timer_longkey_time = longkey_time_define;
}
}
}