不清楚为什么加了2秒时间到,发送串口指令这段代码就无法强制关机,屏蔽这段代码就能够正常关机
//把这段代码屏蔽就能够正常关机
else if(keydowntime >=1000 && PWR_ON_SYS && !comsend) //2秒钟发送指令到ARM控制开关机重启等D8 00 05 FF
{
_nop_();
_nop_();
UartSend(0xD8);
UartSend(0x00);
UartSend(0x05);
UartSend(0xFF);
comsend = 1;
}
//完整代码
#define _KEY_C
#include "Key.h"
#include "config.h"
#include "Uart.h"
bit keysta = 1;
bit istiming = 0;
sbit PWR_key_det = P3^2;
sbit PWR_ON_SYS = P1^0;
sbit PWR_HOLD = P1^1;
unsigned long keydowntime = 0; //记录按键按下时间
bit comsend = 0;//控制发送次数
void KeyDriver()
{
if(keysta == 1)
{
if(keydowntime >= 300 && !PWR_ON_SYS )//0.6秒开机
{
_nop_();
_nop_();
PWR_ON_SYS = 1;
istiming = 1;
keysta = 0;
}
else if(keydowntime >=1000 && PWR_ON_SYS && !comsend) //2秒钟发送指令到ARM控制开关机重启等D8 00 05 FF
{
_nop_();
_nop_();
UartSend(0xD8);
UartSend(0x00);
UartSend(0x05);
UartSend(0xFF);
comsend = 1;
}
else if(keydowntime >=2500 && PWR_ON_SYS) //5秒钟强制关机
{
_nop_();
_nop_();
PWR_HOLD = 0;
}
else
{}
}
}
void KeyScan() //按键扫描函数
{
static unsigned char keybuf = 0xFF;
keybuf = (keybuf <<1) |PWR_key_det;
if(keybuf == 0x00)
{
keydowntime ++;//按键按下每次进入中断就加2
}
else if(keybuf == 0xFF)
{
keydowntime = 0;
keysta = 1;
comsend = 0;
}
else
{}
}
void ConfigTimer0()
{
AUXR &= 0x7F; //2ms定时
TMOD &= 0xF0;
TH0 = 0xF8;
TL0 = 0xCD;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void TM0_Isr() interrupt 1
{
KeyScan();
if(istiming)
{
keydowntime = 0;
istiming = 0;
}
TH0 = 0xF8;
TL0 = 0xCD;
TF0 = 0;
}