?? 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 + -