📄 yaok2.c.bak
字号:
/**********************************************************
*遥控解码程序(C语言)
*遥控IC型号:RSM2222-001 与PT6122,uPD6122相同
*版本:V0.2
*编程:飞扬
*学习C语言15天重写的,希望高手把你们写的好的程序贴出来给我们
*这些菜鸟看看!!.
*用12M晶振把引导信号检测次数改为10次
**********************************************************/
#include <sm8954a.h>
//引脚定义
//#define LED2 P0
#define LED P1
sbit Led = P1 ^ 7;
sbit Beep = P1^6;//P1.4脚音效输出
sbit P3_2 = P3^2;
sbit K2 = P2 ^ 2;
sbit K3 = P2 ^ 3;
sbit K4 = P2 ^ 4;
sbit K5 = P2 ^ 5;
static unsigned char data DT;
//函数声明
void delay1s();
void Delay400us();
void Sound();
/**********************************************************
*外中断0 遥控解码函数(子程序)
**********************************************************/
void IR() interrupt 0 using 3 //选择工作寄存器组
{
//LED=0xff;
//unsigned int a;
unsigned char i,k;
unsigned char KeyCoding[4]; //定义数组,存放接收到的数据
/*我的遥控按键编码 确定 上 下 左 右 菜单 退出*/
//unsigned char code KeyCode[9]={0x51,0x06,0x44,0x47,0x40,0x02,0x07,0x4b,0x03};
EA = 0; //关外中断0
if (P3_2==0) //P3.2低电平继续
{
for (i=20;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
{
Delay400us(); //延时438us
if (P3_2==1) //低电平引导信号出现高电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==0); //等待高电平引导信号到了.
for (i=10;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
{
Delay400us();
if (P3_2==0) //高电平引导信号出现低电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==1); //等待高电平引导信号结束.
//接收4个字节的数据
for (k=0;k<4;k++)
{
for (i=8;i>0;i--) //8位数据
{
while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
Delay400us();
Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
KeyCoding[k]>>= 1; //右移1位
if(P3_2==1) //仍是1,最高位写入1,0跳过
KeyCoding[k]|= 0x80;
while(P3_2==1); //等待高电平结束
}
}
//比较地址码和地址反码,不同解码错误退出
if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
{
EA = 1; //开外中断
return;
}
Sound(); //解码成功声音提示.
}
switch (KeyCoding[2])
{//按键判断
case 0x14:
LED=0xfe;
DT = 1;//确定键
//这里添加代码
break;
case 0x11: //向上键
LED=0xfb;
DT = 1;
//这里添加代码
break;
case 0x09: //向下键
LED=0xef;
DT = 1;
//这里添加代码
break;
case 0x1b: //向左键
LED=0xdf;
DT = 1;
//这里添加代码
break;
case 0x12: //向右键
LED=0xfa;
DT = 1;
//这里添加代码
break;
case 0x16:
EA=1;
EX0=1; //标题菜单键
do
{
LED=0xfe;
delay1s();
LED=0xfb;
delay1s();
LED=0xef;
delay1s();
LED=0xdf;
delay1s();
}while(1);
LED=0x00;
DT = 1;
//这里添加代码
break;
case 0x07: //系统设定键
LED=0x00;
DT = 1;
//这里添加代码
break;
case 0x18:
LED=0xff;
DT=1;
break;
}
EA = 1; //开外中断
//return;
}
/**********************************************************
*延时400us
**********************************************************/
void Delay400us() //晶振=12MHz 延时时间=404us
{ //晶振=11.0592MHz 延时时间≈438us
unsigned char i,j; //总的延时时间=[(2*i)+1]*j+1+1
for (j=2;j>0;j--)
for (i=100;i>0;i--);
}
void delay1s()
{
unsigned int b;
for (b=6000;b>0;b--) //循环检测10次,低电平引导信号干扰检测(2700ms)
{
Delay400us(); //延时438us
}
}
/**********************************************************
*音效子程序
**********************************************************/
void Sound()
{
unsigned char k;
for (k=100;k>0;k--)
{
Beep=~Beep;
Delay400us();
}
}
void Delay(unsigned char a)//延时函数
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
void main(void)
{
unsigned int de;
//TMOD = 0x01; //定时器0方式1
EA = 1; //允许CPU中断
IT0 = 1; //INT0下降沿有效
EX0 = 1; //开INT0中断
P1 = 0xff;
do
{
if(K2 == 0)//判断K2是否被按下
{
Delay(10);//延时10MS
if(K2 == 0)//再次确定K2是否被按下
{
LED = 0xfe; //p1.3的LED被点亮
while(K2 == 0);//等待肯定K2的松开
LED = 0xff; //关闭P13的LED
}
}
if(K3 == 0)
{
Delay(10);
if(K3 == 0)
{
LED = 0xFB;
while(K3 == 0);
LED = 0xff;
}
}
if(K4 == 0)
{
Delay(10);
if(K4 == 0)
{
LED = 0xef;
while(K4 == 0);
LED = 0xff;
}
}
if(K5 == 0)
{
Delay(10);
if(K5 == 0)
{
LED = 0xdf;
while(K5 == 0);
LED = 0xff;
}
}
for (de=0; de<8000; de++)
Led = 1; //LED点亮
for (de=0; de<8000; de++)
Led = 0; //LED熄灭
if (DT)
{
EX0=0; //关闭外中断
for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止重复按键
Led = 1;
for (de=0; de<30000; de++)
Led = 0;
DT = 0;
}
EX0 = 1;
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -