⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_send.c

📁 这是一个红外发送的程序
💻 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 + -