?? ir.c
字號:
//參考程序B: C程序 //IR.C
//程序說明:此程序接收紅外發射過來的數據解碼后由CPU讀取并顯示在LED數碼管上.
#include <c8051f020.h> /*SFR定義*/
#include <intrins.h>
#define PORTA 0x8000 /*8255的A口*/
#define PORTB 0x8001 /*8255的B口*/
#define PORTC 0x8002 /*8255的C口*/
#define PORTCON 0x8003 /*8255的控制口*/
#define DataPort 0x8400 /*紅外數據接收口*/
void PORT_Init (void); //端口初始化
void displayled(void) ;//顯示1位數據
sbit BUZ = P3^5;
unsigned char ReadFlag; /*讀紅外數據標志*/
unsigned char ReadData,IRData;
unsigned char WE[6]={1,2,4,8,0x10,0x20}; //位選
void sleep_ms(unsigned int count)//延時
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
void INITEXINT67(void)
{
EIE2 |= 0x10; /*允許外部中斷6*/
}
void INT6_ISR(void) interrupt 18
{
P3IF &= ~0x40; /*清外部中斷6標志*/
ReadFlag = 0x01; /*置允許讀標志*/
}
void main (void) {
unsigned char xdata *idata Pointir;
WDTCN = 0xde; /*無效看門狗*/
WDTCN = 0xad;
PORT_Init(); /*輸入/輸出口初始化*/
INITEXINT67(); /*初始化外部中斷6*/
EA=1; /*開總中斷*/
ReadFlag=0;
while(1){
while(ReadFlag==0x00); /*是否允許讀紅外數據*/
Pointir=DataPort;
ReadData=*Pointir; /*讀紅外數據*/
if((ReadData&0x80)==0x00) continue; /*是否接到紅外數據*/
IRData = (~ReadData )&0x0f; /*保存收到的紅外數據*/
BUZ = 0; /*蜂鳴器響*/
sleep_ms(250);
BUZ = 1; /*蜂鳴器滅*/
displayled() ;//顯示1位數據
do{
ReadData = *Pointir;
}while((ReadData&0x80)==0x80); /*上次紅外中斷是否結束*/
_nop_();
}
_nop_();
}
void PORT_Init (void)
{
EMI0CF |= 0x2c; /*EMIF工作在地址/數據復用方式,只用外部存儲器,ALE高*/
/*低脈寬占1個SYSCLK周期*/
EMI0TC |= 0x6d; /*地址建立/保持時間占1個SYSCLK周期,/WR和/RD占12個SYSCLK周期*/
P74OUT=0x3f; /*P7為漏極開路,P4,P5,P6為推拉方式*/
}
void displayled(void)
{unsigned int i;
unsigned char k;
char j;
unsigned char xdata * Pointm;
unsigned char code F7SEG[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
Pointm=PORTCON;
*Pointm=0x80; //8255初始化,設定B口輸出,C口輸出,A口不用
while(1) //循環顯示
{
k=F7SEG[IRData]; // 查表,得到字形碼數值存放在變量K中
Pointm=PORTB; // B口存放字位碼
*Pointm=0x01; //從左邊第一位數碼管開始顯示數字
Pointm=PORTC; //C口存放字形碼
*Pointm=k; //顯示K中存放的字形碼
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -