这款TI的单片机大家都很熟悉了,所以我也就不在多多赘述,直接上代码好了,IO使用常用的P1.0口。使用P1.0口的原因是P1 P2口 有IO中断模块。
思路:红外接收头发出的脉冲信号激发IO中断,然后MSP430单片机计数解码,从而得出遥控指令。
声明:代码由一位姓刘的大神用C51移植而来,从此摘录者,定要铭记在心。
代码部分:
#hongwai.h /* * hongwai.h * * Created on: 2014-12-12 * Author: dell */ #ifndef HONGWAI_H_ #define HONGWAI_H_ #define HONGWAI_BIT BIT0//红外接收头接于P1.0 #define HONGWAI_DIR_IN P1DIR&=~HONGWAI_BIT//设置p1.0为输入 #define HONGWAI_IES_ON P1IES|=HONGWAI_BIT//p1.0设置为低电平中断 红外引脚定义 #define HONGWAI_IE_ON P1IE|=HONGWAI_BIT//允许pl.0中断 #define HONGWAI_IE_OFF P1IE&=~HONGWAI_BIT//禁止p1.0中断 #define HONGWAI_IFG P1IFG//p1.0中断标志 #define HONGWAI_IFG_OFF P1IFG&=~HONGWAI_BIT #define HONGWAI_IN (P1IN & BIT0) //P1.0输入 #define uchar unsigned char #define uint unsigned int static uint DISPLAY=0; void int_clk();//时钟初始化子程序声明 void int_io();//制口的初始化 unsigned int return_waiwai(); void RebootDat(); void show(); #endif /* HONGWAI_H_ */
#hongwai.c /* * hongwai.c * * Created on: 2014-12-12 * Author: dell */ #include#include "hongwai.h" #include"LCD12864.h" #define uchar unsigned char #define uint unsigned int //时钟初始化子程序 uint dat[4]; #define XT1_XT2_PORT_DIR P5DIR #define XT1_XT2_PORT_OUT P5OUT #define XT1_XT2_PORT_SEL P5SEL #define XT1_ENABLE (BIT4 + BIT5) #define XT2_ENABLE (BIT2 + BIT3) void int_clk() { XT1_XT2_PORT_SEL |= XT1_ENABLE + XT2_ENABLE; UCSCTL6 |= (XT1OFF+XT2OFF); //关闭XT1和XT2 UCSCTL3 |= SELREF_2; //FLL基准源选择REFOCLK(32.768KHz) UCSCTL4 |= SELA_2; //设置ACLK时钟为REFOCLK(32.768KHz) __bis_SR_register(SCG0); //失能FLL循环控制器 UCSCTL0 = 0x0000; //设置DCO频率的大致范围为最低,开启FLL,DCO和MOD可以自动修改 UCSCTL1 = DCORSEL_5; //选择DCO工作频率范围24MHz UCSCTL2 = FLLD_1 + 374; //设置DCO乘数位,使DCOCLKDIV达到12MHz,(N + 1) * FLLRef = Fdco // (374 + 1) * 32768 = 12MHz // 设置锁相环2分频,因此DCOCLK=24MHz,DCOCLKDIV=12MHz __bic_SR_register(SCG0); // 使能FLL循环控制器 // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle __delay_cycles(375000); // 循环等待XT1,XT2和DCO的错误标志被清除 do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除XT2,XT1,DCO 的错误标志 SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); } //############################# void int_io() { P1SEL&=~BIT0; P1OUT|=BIT0; P1REN|=BIT0; // HONGWAI_DIR_IN;//设置接红外引脚的IO为输入 HONGWAI_IE_ON;//允许红外引脚中断 HONGWAI_IES_ON;//设置红外引脚IO为下降沿中断 HONGWAI_IFG_OFF; } 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(); } } void disp() { uint i,j,k=0;//,d;//,temp; if((HONGWAI_IN)==0){ for (i=0;i<14;i++) { if(HONGWAI_IN) {return;} } while(!(HONGWAI_IN)); for(i=0;i<4;i++) { for(j=0;j<8;j++) { while (HONGWAI_IN ); //等 IR 变为低电平 while (!(HONGWAI_IN) ); //等 IR 变为高电平 {delay_us(28);} while (HONGWAI_IN) //计算IR高电平时长 { delay_us(100); k++; if (k>=30){return;} } dat[i]=dat[i] >> 1; if (k>=8) {dat[i] = dat[i]|0x80;} k=0; } } } } void RebootDat() { dat[2]=0; } unsigned int return_waiwai() { return dat[2]; } void show(void) {char dis[2]; dis[0]=(dat[2]/10)+0x30; dis[1]=(dat[2]%10)+0x30; display_string_5x8(1,5,dis); /* switch(dat[2]) { case 70: {dis[0]=(dat[2]/10)+0x30;dis[1]=(dat[2]%10)+0x30; display_string_5x8(1,5,dis);dat[2]=0;break;} case 68: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 67: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 21: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 64: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 22: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 25: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 13: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 12: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 24: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 94: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 8: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 28: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 66: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 82: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} case 74: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;} default:break; }*/ } #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) { disp(); P1IFG=0; }