|
今天突然翻百度長按按鍵喚醒掉電模式,沒有發(fā)現(xiàn)有資料介紹,于是自己用STC15W408AS做了個實驗,用于長按按鍵喚醒。
構(gòu)思如下,查數(shù)據(jù)手冊表示,掉電模式無系統(tǒng)時鐘,外部設(shè)備除掉電前開啟喚醒的外設(shè)一律停止工作,故想用系統(tǒng)執(zhí)行任務(wù)判斷按下時間是不可能了,但注意到數(shù)據(jù)手冊中寫到,喚醒后執(zhí)行下一條語句后轉(zhuǎn)向中斷服務(wù)程序,于是想在中斷服務(wù)程序中判斷按鍵按下時長,并作出處理,短按則再次進(jìn)入掉電狀態(tài),長按則喚醒。實驗代碼如下,基本實現(xiàn)了長按喚醒led發(fā)光,再次長按掉電led熄滅,正常狀態(tài)短按則改變led狀態(tài)。代碼如下:
單片機(jī)源程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^2;
sbit k1 =P3^2;//STC15W408AS此腳為外部中斷0,在非掉電模式下做按鍵用,按一次led改變一次狀態(tài)。
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數(shù)為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)//長按標(biāo)志
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);//手冊中寫到,喚醒會執(zhí)行中斷命令后一條語句之后轉(zhuǎn)向中斷服務(wù)程序,故在此設(shè)置一個喚醒執(zhí)行語句。
}
}
num=0;//重新計數(shù)
}
}
}
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;//喚醒標(biāo)志
}
if(x<1000)
{
IT0=1;
EX0=1;
PCON=0x02;
delay(10);
}
}
|
評分
-
查看全部評分
|