📄 main.c
字号:
#include <reg52.h>
#define TIMEH 12 //基于22.1184M时钟晶振,数字越大,时间越长
#define TIMEL 50 //基于22.1184M时钟晶振,数字越大,时间越长
#define ROW P3 //矩阵按键接口定义
#define LINE P2 //矩阵按键接口定义
extern void timer_init(void);
extern void delay(unsigned int);
extern unsigned char scan_key(void);
unsigned char irm_code;
sbit QD = P1^0;
void main()
{
unsigned char tmp;
irm_code=0xff;
timer_init();
while(1) {
tmp = scan_key();
if(tmp!=0xff) {
if(irm_code==0xff) {//一次键值发射完成后会将irm_code置为0xff
irm_code = tmp; //键值传递
TR0 = 1; //启动定时器,完成编码发射
}
delay(10);//两次编码发射之间需要延时,连续发射会导致解码失败
}
}
}
void timer_init(void)
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xff;
EA = 1;
ET0 = 1;
TR0 = 0;
}
/*定时中断,红外编码*/
void timer_int(void) interrupt 1
{
static unsigned char i=0,flag=0;
QD=~QD;
if(i<10) { //连续发射5个“0”引导码
TH0 = 255-TIMEH/2;
TL0 = 255-TIMEL/2;
i++;
}
else if(i<18) { //数据编码
if((irm_code & 0x80)==0x80) {
TH0 = 255-TIMEH;
TL0 = 255-TIMEL;
irm_code <<= 1;
i++;
}
else {
TH0 = 255-TIMEH/2;
TL0 = 255-TIMEL/2;
if(flag) {
irm_code <<= 1;
i++;
}
flag ^= 0x01;
}
}
else {
TR0 = 0;
i=0;
QD=1;
irm_code=0xff;
TH0 = 0xff;
TL0 = 0xff;
}
}
void delay(unsigned int t)
{
unsigned char i;
while(t--) for(i=0;i<230;i++);
}
/*矩阵按键扫描*/
unsigned char scan_key(void)
{
unsigned char j;
static unsigned char i=0;
ROW = 255-(1<<i); //列扫描低电平有效,FE,FD,FB,F7
if(LINE!=0xff)
for(j=0;j<8;j++)
if(LINE==(255-(1<<j))) return (j+(i<<3));
i++; i&=0x03;
return(0xff);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -