?? main.c
字號:
//xt1 32768KHZ xt2 8MHZ ,紅外接收頭接于P2.0
//遙控器的編碼芯片為:uPD6121G 遙控解碼原理請參考本實驗的說明
#include "msp430x14x.h"
#define SHUMA_PORT_DIR P5DIR//數碼管數據口
#define SHUMA_PORT_OUT P5OUT
#define SHUMA_1_LOW P6OUT&=~BIT6//開數碼管的第一位P6.6口控制數碼管的第一位
#define SHUMA_1_HIGH P6OUT|=BIT6//滅第一位數碼管
#define SHUMA_2_LOW P6OUT&=~BIT5//開數碼管的第二位
#define SHUMA_2_HIGH P6OUT|=BIT5//滅數碼管的第二位
#define SHUMA_3_LOW P6OUT&=~BIT4//開數碼管的第三位
#define SHUMA_3_HIGH P6OUT|=BIT4//滅數碼管的第三位
#define SHUMA_4_LOW P6OUT&=~BIT0//開數碼管的第四位
#define SHUMA_4_HIGH P6OUT|=BIT0//滅數碼管的第四位
//**********************************************************************
#define HONGWAI_BIT BIT0//紅外接收頭接于P2.0
#define HONGWAI_DIR_IN P2DIR&=~HONGWAI_BIT//設置p2.0為輸入
#define HONGWAI_IES_ON P2IES|=HONGWAI_BIT//p1.0設置為下降沿中斷 紅外引腳定義
#define HONGWAI_IE_ON P2IE|=HONGWAI_BIT//允許p2.0中斷
#define HONGWAI_IE_OFF P2IE&=~HONGWAI_BIT//禁止p2.0中斷
#define HONGWAI_IFG P2IFG//p2.0中斷標志
#define HONGWAI_IN (P2IN & BIT0) //P2.0輸入
//**********************************************************************
#define uchar unsigned char
#define uint unsigned int
static uint DISPLAY=0;
void int_clk();//時鐘初始化子程序聲明
void int_io();//制口的初始化
void delay_us(uint i);//2.5微妙延時程序
void delay(unsigned char x);
void shumaguan_xianshi();
const unsigned char tabl1[11]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0X20,0x38,0xff};
// ;0 ,1 ,2 ,3 , 4, 5, 6 ,7 ,8 ,9 ,滅}數碼管段碼表
//時鐘初始化子程序
void int_clk()
{
uchar i;
BCSCTL1&=~XT2OFF;
BCSCTL2|=SELM1+SELS;
do
{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}while((IFG1&OFIFG));
IFG1&=~OFIFG;
}
//#############################
void int_io()
{
SHUMA_PORT_DIR|=0XFF;//set P5 is out 設置控制數碼管數據口的IO口為輸出模式
P6DIR|=BIT0+BIT4+BIT5+BIT6;
P3DIR|=BIT0;//P3.0控制74HC573的OE,把這個口設置為輸出
P3OUT&=~BIT0;//使能74573,使得74573的輸出隨輸入變化
P2SEL&=~HONGWAI_BIT;
HONGWAI_DIR_IN;//設置接紅外引腳的IO為輸入
HONGWAI_IE_ON;//允許紅外引腳中斷
HONGWAI_IES_ON;//設置紅外引腳IO為下降沿中斷
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
uint i,j,n;//,d;//,temp;
uint dat[4];
n=0;
if((HONGWAI_IFG & HONGWAI_BIT)==HONGWAI_BIT)
{
HONGWAI_IFG&=~HONGWAI_BIT;//P1IFG &= ~BIT0;
HONGWAI_IE_OFF;//禁止P1.0中斷
I1:
for (i=0;i<4;i++)
{
if (!(HONGWAI_IN)) break;
if (i==3) {HONGWAI_IE_ON;return;}
}
delay_us(800);
if (HONGWAI_IN) goto I1; //確認IR信號出現
while(!(HONGWAI_IN)); //等待IR變為高電平
for(i=0;i<=3;i++)
{
for(j=0;j<8;j++)
{
while (HONGWAI_IN ) //等 IR 變為低電平
{delay_us(28);}
while (!(HONGWAI_IN) ) //等 IR 變為高電平
{delay_us(28);}
while (HONGWAI_IN) //計算IR高電平時長
{
delay_us(28);
n++;
if (n>=30){HONGWAI_IE_ON;return;}
}
dat[i]=dat[i] >> 1;
if (n>=11) {dat[i] = dat[i]|0x80;}
n=0;
}
}
// if (dat[2]=~dat[3]) {DISPLAY=~dat[2];}//此句剛開始可以屏蔽,見到效果后再嘗試打開校驗
DISPLAY=dat[2];
HONGWAI_IE_ON;//允許p1.0 中斷
}
}
void shumaguan_xianshi()
{
uint DISPLAY1;//=0x00;
uint DISPLAY2;//=0X01;
uint DISPLAY3;//=0X02;
uint DISPLAY4;//=0X03;
DISPLAY2=DISPLAY/100%10;
DISPLAY1=DISPLAY/1000%10;
DISPLAY3=DISPLAY/10%10;
DISPLAY4=DISPLAY%10;
SHUMA_PORT_OUT=tabl1[DISPLAY1];
SHUMA_1_LOW;
delay_us(500);
SHUMA_1_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY2];
SHUMA_2_LOW;
delay_us(500);
SHUMA_2_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY3];
SHUMA_3_LOW;
delay_us(500);
SHUMA_3_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY4];
SHUMA_4_LOW;
delay_us(500);
SHUMA_4_HIGH;
}
void delay_us(uint i)//delay 2.5us at 8M
{
uint ii;
for(ii =i;ii > 0;ii--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
int_clk();//初始化時鐘
int_io();
//_BIS_SR(GIE);
_EINT();
while(1)
{
shumaguan_xianshi();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -