?? irr.c
字號:
//Atmega16的紅外遙控器接收試驗
//使用1602液晶進行顯示,
#include<iom16v.h>
#include"1602.h"
#pragma interrupt_handler ext_int0_isr:2 //指定外部中斷函數
#define uchar unsigned char
#define uint unsigned int
uchar irr_b=0,s_s=0;
uchar wb=0,a=0,ds=0;
long da=0;
uchar d1,d2,d3,d4;
uchar ten_1,ten_2,ten_3,ten_4,i;
//中斷接收
void ext_int0_isr(void)
{
if(irr_b==0) //第一個中斷
{
irr_b=1; //狀態為:開始接收
TCNT1L=0x00; //定時器清零
}
else if(irr_b==1) //第二個以后的中斷
{
a=TCNT1L; //讀取定時器的值
//判斷是引導,還是數據
if((170<a)&&(a<235)) //引導
{
wb=0; //數據計數清零
da=0; //數據清零
TCNT1L=0x00; //定時器清零
}
else if((8<a)&&(a<25)) //數據0
{
wb++;
da=(da<<1);
TCNT1L=0x00;
}
else if((25<a)&&(a<45)) //數據1
{
wb++;
da=(da<<1)+1;
TCNT1L=0x00;
}
}
if(wb==32) //數據長度夠32位
{
irr_b=0; //狀態為停止接收
wb=0; //數據計數清零
s_s=1; //打開顯示許可
}
}
//定時器T1初始化
{
TCCR1B=0x00; //關閉定時器
TCNT1H=0x00; //定時器初值
TCNT1L=0x00;
TCCR1A=0x00; //普通模式
TCCR1B=0x05; //1024分頻
}
//主函數
main()
{
//初始化端口
DDRA=0xff;
PORTA=0x00;
DDRB=0xff;
DDRD=0x00; //中斷輸入
PORTD=0xff; //內部上拉
t1_init(); //定時器t1初始化
MCUCR = 0x02; //下降沿中斷
GICR = 0x40; //開外部中斷int_0
TIMSK = 0x00;
SREG=0x80; //開全局中斷
s_s=1; //開機進行一次顯示
while(1)
{
ds=TCNT1L;
if(ds>250) //定時器超時,接收復位
{
TCNT1L=0;
irr_b=0;
da=0;
wb=0;
s_s=0;
}
if(s_s==1) //顯示開關打開,開始顯示
{
SREG=0x00; //關閉全局中斷
LcdInit(); //1602初始化
//顯示設備碼
d1=da>>24;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,0,ten_1);
WriteNum(1,1,ten_2);
WriteNum(1,2,ten_3);
//顯示設備碼反碼
d1=da>>16;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,4,ten_1);
WriteNum(1,5,ten_2);
WriteNum(1,6,ten_3);
//顯示鍵碼
d1=da>>8;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,8,ten_1);
WriteNum(1,9,ten_2);
WriteNum(1,10,ten_3);
//顯示鍵碼反碼
d1=da;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,12,ten_1);
WriteNum(1,13,ten_2);
WriteNum(1,14,ten_3);
//復位D端口
DDRD=0x00; //中斷輸入
PORTD=0xff; //內部上拉
s_s=0; //關閉顯示開關
SREG=0x80; //開全局中斷
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -