首先需要硬件支持,也就是单片机某个引脚可以控制断电和维持上电
按键的的作用也可以给单片机供电,并且还要有个专门的引脚检测按键状态。
软件:首先是长按判尘庆颤断。这个最好用按键扫描。就是检测按键按下时候,定时器计时,如果松开就立即清零。在设置一个功能函数检测定时值,大于两秒后,就表示长按。
按键按下单片机供电开始计时,如果达到长按标准,就输出引脚派败控制持续供电,这时候按键松了也不会断电。
运行期间,按键再次按下并符合长按,差拦那木引脚输出停止供电,这时候如果按键松开,那就彻底没电关机。
以NEC格式为例:按键一次: 依次发送 引导码 + 地址 + 地址取反 + 数据 + 数据取反
长按键: 隔110ms左右发一次引导凳颂码(重复),并不带任何数据(全部为高枣雹郑电平)
所以根据这个特点可以识别长按键:
程序接收一帧数据后,提取出地址和数据,然后判断
......
//有地址和数据的,为一次按键
.....
//地址肆早和数据为空的,为重复按键
if((ir_addr_code==0xffff)&&(ir_origin_data==0xff)&&(ir_data==0xff))
{
repeat=1
key= last_key
}
unsigned char Funtion_Mode = 0// 定义一个功能模式的变量,=0:功能1 =1:功能2 等等
void main( void )
{
while( 1 )
{
if( KeyPort &KeyID != KeyID )// 就是功能模式选择键按下的意思
{
DelayMs(30)// 短延时消芦罩中抖
if( KeyPort &KeyID != KeyID )// 按键按下
{
Funtion_Mode ++// 按下一次,就选择一个功能
if( Funtion_Mode == 3 )
{
Funtion_Mode = 0 // 这里很重要,必须进行越限处理
}
whiel( KeyPort &KeyID != KeyID )// 等待按键松开
}
}
switch( Funtion_Mode )
{
case 0:
// 你闷和的功陪山能1代码在这
break
case 1:
// 你的功能2代码在这
break
case 2:
// 你的功能3代码在这
break
default:// 其他情况
break
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)