今天突然翻百度長按按鍵喚醒掉電模式,沒有發現有資料介紹,于是自己用STC15W408AS做了個實驗,用于長按按鍵喚醒。
構思如下,查數據手冊表示,掉電模式無系統時鐘,外部設備除掉電前開啟喚醒的外設一律停止工作,故想用系統執行任務判斷按下時間是不可能了,但注意到數據手冊中寫到,喚醒后執行下一條語句后轉向中斷服務程序,于是想在中斷服務程序中判斷按鍵按下時長,并作出處理,短按則再次進入掉電狀態,長按則喚醒。實驗代碼如下,基本實現了長按喚醒led發光,再次長按掉電led熄滅,正常狀態短按則改變led狀態。代碼如下:
單片機源程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^2;
sbit k1 =P3^2;//STC15W408AS此腳為外部中斷0,在非掉電模式下做按鍵用,按一次led改變一次狀態。
uint num=0,kn=0;
uchar km;
void delay (uint yc)//僅在喚醒掉電時用
{
uint i,j;
for (i=yc;i>0;i--)
for (j=100;j>0;j--);
}
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256; //11.0592M晶振定時1ms數為1000
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num==10) //如果到了10次,說明10ms秒時間
{
if(k1==0)
{
kn++;
if(kn>200)//長按標志
led1=1;
}
if(k1==1)
{
if(kn>0&&kn<100)//短按判定
{
led1=~led1;
kn=0;
}
if(kn>200)//長按判定
{
kn=0;
IT0 = 1;
EX0 = 1;
PCON = 0x02;
delay(10);//手冊中寫到,喚醒會執行中斷命令后一條語句之后轉向中斷服務程序,故在此設置一個喚醒執行語句。
}
}
num=0;//重新計數
}
}
}
void T_time()interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
num++;
}
void exint0() interrupt 0
{
uint x=0;
IT0=0;
EX0=0;
while(k1==0)
{
x++;
delay(10);
if(x>=1000)
led1=0;//喚醒標志
}
if(x<1000)
{
IT0=1;
EX0=1;
PCON=0x02;
delay(10);
}
}
|