|
发表于 2012-8-11 21:52:54
|
显示全部楼层
下面的这个程序是我的一个可用的程序。可用给你参考一下了。
板子是MSP430F413的。直接了一个32768k的晶振。没有接高速晶振。显示用的LCD。这个不重要。
#include <msp430x41x.h>
unsigned long recode; //接收码
unsigned int recodehigh,recodelow; //接收码的高低16位
unsigned char hongwaicode[4]; //定义一个4字节的数组用来存储代
unsigned char CodeTemp; //编码字节缓存变量
unsigned char i,j,k; //延时用的循环变量
/***************************************************************
通用数组函数 digit[]
***************************************************************/
const char table[16] =
{
0x7D, // '0' LCD segments a+b+c+d+e+f
0x60, // '1'
0x3E, // '2'
0x7A, // '3'
0x63, // '4'
0x5B, // '5'
0x5F, // '6'
0x70, // '7'
0x7F, // '8'
0x7B, // '9'
0x77, // 'a'
0x4f, // 'b'
0x1d, // 'c'
0x6e, // 'd'
0x1f, // 'e'
0x17 // 'f'
};
void delayms(int ms)
{
char i;
while(ms--){
for(i=0;i<255;i++);
}
}
/*******************************************************
初始化定时器函数
*******************************************************/
void InitTimer(void)
{
//TACTL = TASSEL0 + MC0;//ACLK 单调递增模式
//CCTL0 = CCIE;
//TACCR0= 4096; //定时时间是1s
TACTL |= TASSEL0
+ MC0 + TACLR;
//使用32768Hz晶振工作
//初始化定时器 UP 模式,计数到CCR0
TACCR0 = 9999;
}
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{
InitTimer();
while(TAR<=29);
TACTL = 0;//停止计数
TAR = 0;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{
InitTimer();
while(TAR<=34);
TACTL = 0;//停止计数
TAR = 0;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{
InitTimer();
while(TAR<=145);
TACTL = 0;//停止计数
TAR = 0;
}
/*******************************************************
初始化LCD函数
******************************************************/
void InitLCD(void)
{
LCDCTL = LCDP0+LCDP1 + LCD4MUX + LCDON;
//液晶开启S0_S23端口,4 mux驱动方式 打开LCD
P5SEL = 0XFC;
//设置P5口为对应的COM口和R接口。
}
/********************************************************
清屏LCD 的函数
********************************************************/
void ClearLCD()
{
char i;
for(i=0;i<11;i++)
LCDMEM[i]=0;
}
/********************************************************
主函数 mai n
******************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
SCFQCTL = 0xff;//使用最高速度 有助于显示的速度和灵敏性
//InitTimer(); //初始化定时器A0
InitLCD(); //初始化LCD控制器
ClearLCD(); //清屏
P1DIR = 0X00;// 置为输入
P1IE = 0X40;//P1.6置为中断使能
P1IES = 0XFF;//下降沿触发
__enable_interrupt();
LCDCTL = LCDP0+LCD4MUX+LCDON; // 选择液晶端口为S0-S15 1/4周期 并且打开液晶输出
//LCDACTL |= LCDFREQ_128;
BTCTL = BT_fLCD_DIV32; // 选择液晶的晶振速度为 32.768K/128
P5SEL = 0xFF; // Set Rxx and COM pins for LCD
// _BIS_SR(LPM3_bits + GIE); // 打开总中断
while(1)
{
ClearLCD(); //清屏
}
}
#pragma vector = PORT1_VECTOR
__interrupt void intp1()
{
P1IE = 0X00;//P1.6置为中断禁止
if(P1IFG & 0X40)
{
for(k=0;k<10;k++)
{
Delay0_9ms();
if ((P1IN&0x40)==1) //如果0.9ms后IRDATA=1,说明不是引导码
{k=10;break;}
else if(k==9) //如果持续了10×0.9ms=9ms的低电平,说明是引导码
{
while((P1IN&0x40)==0);
Delay4_5ms(); //跳过持续4.5ms的高电平
for(i=0;i<4;i++) //分别读取4个字节
{
for(j=1;j<=8;j++) //每个字节8个bit的判断
{
while((P1IN&0x40)==0); //等待上升沿
Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms,再判断IRDATA
if((P1IN&0x40)==0x40) //如果IRDATA是"1",则向右移入一位"1"
{
Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else if(j<8)
CodeTemp=CodeTemp>>1;//如果IRDATA是"0",则向右移一位,自动补"0"
}
hongwaicode[i]=CodeTemp;
CodeTemp=0;
}
}
}
//end of for(k=0;k<10;k++)
recodehigh=hongwaicode[0]<<8|hongwaicode[1];
recodelow=hongwaicode[2]<<8|hongwaicode[3];
recode=recodehigh;
recode=recode<<16;
recode=recode|recodelow;
LCDMEM[0] = table[hongwaicode[0]>>4];
LCDMEM[1] = table[hongwaicode[0]&0x0f];
LCDMEM[2] = table[hongwaicode[1]>>4];
LCDMEM[3] = table[hongwaicode[1]&0x0f];
LCDMEM[4] = table[hongwaicode[2]>>4];
LCDMEM[5] = table[hongwaicode[2]&0x0f];
LCDMEM[6] = table[hongwaicode[3]>>4];
LCDMEM[7] = table[hongwaicode[3]&0x0f];
delayms(2500);
}
P1IFG = 0;
P1IE = 0X40;//P1.6置为中断使能
} |
|