📄 ir_send.c
字号:
#include "iom8v.h"
#include "macros.h"
#define focs 8000000 //晶振8M
#define unchar unsigned char
#define unint unsigned int
#define TXD PD1
#define Cls_TXD PORTD &= ~(1<<TXD)
#define Set_TXD PORTD |= (1<<TXD)
char key;
unsigned long forkey=0; //记录键值和上一次的按键值
unchar key_sign=1; //记录有无有效键按下,1为无效,0为有效
//I/O口初始化--------------------------------------------------------------------------------------------------
void init_IO()
{DDRB=0X0F;
PORTB=0XF0; //PB4~PB7输入,PB3~PB0输出
DDRC=0XFF;
PORTC=0X00; //C口输出
DDRD=0XFF;
PORTD=0XFD; //D口输出,TXD初始值为0
}
//T/C1初始化---------------------------------------------------------------------------------------------------
void init_TC1()
{TCCR1A=0X43; //匹配时取反
TCCR1B=0X19; //无预分频
TIMSK=0; //溢出中断关闭
OCR1AH=0;
OCR1AL=0X6a; //产生38kH波形
}
//延时程序-------------------------------------------------------------------------------------------------------
//微秒级延时程序
void delay_us(int time)
{
do
{
time--;
}while (time>1);
}
//毫秒级延时程序
void delay_ms(unint time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
//扫键程序------------------------------------------------------------------------------------------------------
void key_scan()
{unchar scan1;
unchar scan2;
DDRB=0X0F;
PORTB=0XF0; //PB4~PB7输入,PB3~PB0输出
DDRC=0XFF;
PORTC=0X00;
scan1=(PINB>>4);
if(scan1!=0X0F)
{delay_ms(50);
scan1=(PINB>>4);
if(scan1!=0X0F)
{key_sign=0;
DDRB=0XFF;
PORTB=0;
DDRC=0XF0;
PORTC=0X0F; //矩阵键盘的输入输出交换
scan2=(PINC&0X0F);
if(scan1==0X0E)
{if(scan2==0x0E)
key=1;
else if(scan2==0X0D)
key=4;
else if(scan2==0X0B)
key=7;
else if(scan2==0X07)
key=10;
else
key_sign=1; //按键1,4,7,clr
}
else if(scan1==0X0D)
{if(scan2==0x0E)
key=2;
else if(scan2==0X0D)
key=5;
else if(scan2==0X0B)
key=8;
else if(scan2==0X07)
key=0;
else
key_sign=1; //按键2,5,8,0
}
else if(scan1==0X0B)
{if(scan2==0x0E)
key=3;
else if(scan2==0X0D)
key=6;
else if(scan2==0X0B)
key=9;
else if(scan2==0X07)
key=11;
else
key_sign=1; //按键3,6,9,con
}
else if(scan1==0X07)
{if(scan2==0X07)
key=12;
else
key_sign=1; //备用按键SW
}
else
key_sign=1;
}
}
else
key_sign=1;
}
//通讯部分
//------------------------------------------0、1编码函数-----------------------------------------------------------------
void code(unint cod)
{
switch(cod)
{
case 0: //0为2500微秒低电平,565微秒高电平
Cls_TXD;
delay_us(2500);
Set_TXD;
delay_us(565);
break;
case 1: //1为2500微秒低电平,1690微秒高电平
Cls_TXD;
delay_us(2500);
Set_TXD;
delay_us(1690);
break;
default:
break;
}
}
//------------------------------------------发送函数----------------------------------------------------------------
void Send(unsigned long skey)
{
unchar temp=0,i=0;
Set_TXD;
delay_us(4500);
Cls_TXD;
delay_ms(9);
Set_TXD;
delay_us(4500); //以上为发送引导码
do
{
temp=skey%10;
for(i=1;i<=8;i++)
{
code(temp&0X01);
temp=temp>>1;
}
skey=skey/10;
}while(skey>0); //发送键值
Cls_TXD;
delay_us(2500);
Set_TXD;
delay_us(3500);
Cls_TXD; //发送结束标志
}
//主函数-----------------------------------------------------------------------------------------------------------
void main()
{init_IO();
init_TC1();
while(1)
{do
{key_scan();
}
while(key_sign);
delay_ms(200); //去除按键抖动
switch(key)
{case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
forkey=forkey*10+key;
break;
case 10:
break;
case 11:
Send(forkey);
forkey=0;
break;
case 12:
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -