|
一路紅外學(xué)習(xí)開關(guān),感覺路數(shù)不夠 自己尋思加一路。但是自己搞好程序下載進(jìn)去之后第二路無法遙控。開關(guān)按鍵有效用作指示的led 會動作。但是長按學(xué)習(xí)之后就不起效了。感覺應(yīng)該是寫入eeprom出問題了。單片機(jī)C語言水平不行,之前學(xué)過一點但是不熟練。最近又打算研究研究 。。各位師博幫忙看一下那里出問提 修改一下謝謝
#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; //按鍵
sbit turn1=P3^1; //開關(guān)控制1
sbit key1=P3^5; //按鍵1
uchar keyon; //按鍵按下標(biāo)簽
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; //重置掉電計時
}
/*****************************************
//開關(guān)狀態(tài)切換
*****************************************/
void SW1(){
led=1;
turn1=~turn1; //開關(guān)1狀態(tài)切換
Delay500ms();
led=0;
cou=0; //重置掉電計時
}
/***************************************
//紅外學(xué)習(xí) 對keyon進(jìn)行判斷如果為1則證明按鍵被按下對扇區(qū)0進(jìn)行操作,如果不為1則對扇區(qū)1進(jìn)行操作
***************************************/
void IR_get(){
uchar i;
uchar i1;
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){
if(keyon==1)
{
SectorErase(0); //擦除扇區(qū)
for(i=0;i<4;i++){ //寫入紅外編碼信息
byte_write(i,IRcode[i]);
}
}
else
SectorErase(0x0200); //擦出扇區(qū)1
for(i=0;i<4;i++){
i1=i+0x0200; //將寫入地址加上扇區(qū)1的起始地址0x0200
byte_write(i1,IRcode[i]);
}
}
led=0;
irok=0;
}
/**************************************
//紅外比對
***************************************/
void Compare(){
uchar i=1;
uchar i1; //避開第一個信號,只比對用戶反碼、按鍵碼、按鍵反碼
while(IRcode[i]==byte_read(i)){ //依次比較
if(i==3){
SW(); //開關(guān)狀態(tài)切換
}
i++;
}
i=1; //比對第1扇區(qū)內(nèi)的數(shù)據(jù)是否相符,如果相符調(diào)用SW1()
while(IRcode[i]==byte_read(i1)){
if(i==3){
SW1();
}
i++;
i1=i+0x0200;
}
}
/**************************************
//按鍵處理
****************************************/
void key_scan(){
uchar i=0;
uchar i1=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; //重開中斷
keyon=1; //按鍵按下 標(biāo)志(按鍵1)
IR_get();
}
if(i<50){ //短按切換開關(guān)狀態(tài)
EA=1; //重開中斷
SW();
}
}
//判斷按鍵1是否被按下,是長按進(jìn)入學(xué)習(xí)短按切換開關(guān)量
if(key1==0){
EA=0; //防止中斷發(fā)生
while(key1==0){
i1++;
Delay();
if(i1>50) break; //超過50次為長按
}
if(i1>50){ //長按進(jìn)入紅外學(xué)習(xí)
EA=1; //重開中斷
IR_get();
}
if(i1<50){ //短按切換開關(guān)狀態(tài)
EA=1; //重開中斷
SW1();
}
}
}
/********************************
//主函數(shù)
********************************/
void main(){
Timer2Init(); //定時器2初始化
IRinit(); //紅外初始化
turn=1;
led=0;
while(1){
key_scan(); //按鍵掃描
if(irok){ //紅外查詢
Compare();
irok=0;
}
}
}
|
|