|
stc15L104w單鍵學(xué)習(xí)型紅外遙控開關(guān),
開關(guān)狀態(tài)切換時只是燈閃爍一次,
修改成開關(guān)狀態(tài)切換時指示燈熄滅的什么修改 勞煩各位師兄幫忙看看謝謝
#include<stc15f104e.h>
#include<intrins.h>
#include"IR.h"
#include"EEPROM.h"
#define uint unsigned int
#define uchar unsigned char
sbit led=P3^0; //指示燈
sbit turn=P3^2; //開關(guān)控制
sbit key=P3^4; //按鍵
uchar cou; //掉電計數(shù)器
/***************************************
//30ms延時,按鍵處理用
***************************************/
void Delay() //@12.000MHz 30毫秒
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 2;
j = 95;
k = 43;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/***************************************
//500ms延時,指示燈用
***************************************/
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/***************************************
//500ms延時,掉電計時用
***************************************/
void Timer2Init(void) // 定時器2 50ms
{
T2L = 0xB0; //裝初值
T2H = 0x3C;
AUXR |= 0x10; //開始計時
IE2 |=0x04; //允許中斷
}
/***************************************
//定時器2中斷處理
***************************************/
void timer2() interrupt 12{
cou++; //掉電計時
if(cou>100){
cou=0;
PCON=0x02; //進(jìn)入掉電模式
}
}
/*****************************************
//開關(guān)狀態(tài)切換
*****************************************/
void SW(){
led=1;
turn=~turn; //開關(guān)狀態(tài)切換
Delay500ms();
led=0;
cou=0; //重置掉電計時
}
/***************************************
//紅外學(xué)習(xí)
***************************************/
void IR_get(){
uchar i;
bit flag; //學(xué)習(xí)標(biāo)志位
cou=0; //重置掉電計時
led=1;
while(!irok){//等待紅外解碼完成
i++;
flag=0;
if(i==255) break; //等待超時,退出學(xué)習(xí)
Delay();
flag=1;
}
if(flag){
SectorErase(0); //擦除扇區(qū)
for(i=0;i<4;i++){ //寫入紅外編碼信息
byte_write(i,IRcode);
}
}
led=0;
irok=0;
}
/**************************************
//紅外比對
***************************************/
void Compare(){
uchar i=1; //避開第一個信號,只比對用戶反碼、按鍵碼、按鍵反碼
while(IRcode==byte_read(i)){ //依次比較
if(i==3){
SW(); //開關(guān)狀態(tài)切換
}
i++;
}
}
/**************************************
//按鍵處理
****************************************/
void key_scan(){
uchar i=0;
if(key==0){
EA=0; //防止中斷發(fā)生
while(key==0){
i++;
Delay();
if(i>50) break; //超過50次為長按
}
if(i>50){ //長按進(jìn)入紅外學(xué)習(xí)
EA=1; //重開中斷
IR_get();
}
if(i<50){ //短按切換開關(guān)狀態(tài)
EA=1; //重開中斷
SW();
}
}
}
/********************************
//主函數(shù)
********************************/
void main(){
Timer2Init(); //定時器2初始化
IRinit(); //紅外初始化
turn=1;
led=0;
while(1){
key_scan(); //按鍵掃描
if(irok){ //紅外查詢
Compare();
irok=0;
}
}
}
|
|