//******************************************************************************
// MSP430P149 Demo - DS18B20, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
//
// Description: Echo a received character, RX ISR used. Normal mode is LPM3,
// USART1 RX interrupt triggers TX Echo.
// ACLK = UCLK1 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah )
// //* An external watch crystal is required on XIN XOUT for ACLK *//
//
//
// MSP430F149
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | |
// | Px.x |---->INR_TXD
// | |
//
// Copyright (c) 2009.04 WH, All Rights Reserved.
// WebSite:www.smart-dz.cn
// Description : The DS18B20 module
// History :
// [Author] [Date] [Version] [Description]
// [1] dragonhzw 2009/04/09 Ver 1.0.0 Initial file.
//
// Built with IAR Assembler for MSP430V3.20A/W32 (3.20.1.9)
//******************************************************************************
#include <msp430x14x.h>
#include "_printf.h"
#include "InfraredTX.h"
//-------------------------------------------------------------------------------
void IOsend_Data( unsigned char *ch )
{
unsigned char i,j;
//发引导码(9ms)
SET_INR_TXD; //给脉冲信号高
CLR_INR_TXD; //给脉冲信号低
Delay_Ms(9); //此处用时9ms
SET_INR_TXD; //给脉冲信号高
delay_us(450); //此处用时4.5ms
//一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms)
//8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
if(ch[j]&0x01)
{
CLR_INR_TXD; //给脉冲信号低
delay_us(56); //此处用时0.56ms
SET_INR_TXD; //给脉冲信号高
delay_us(168); //此处用时1.685ms
}
else
{
CLR_INR_TXD; //给脉冲信号低
delay_us(56); //此处用时0.56ms
SET_INR_TXD; //给脉冲信号高
delay_us(56); //此处用时1.685ms
}
ch[j]>>=1;
}
}
CLR_INR_TXD; //给脉冲信号低
delay_us(56); //此处用时0.56ms
SET_INR_TXD; //给脉冲信号高
}
/***FUNC+*********************************************************************/
/* Name : Init_Port */
/* Descrp : Init Port. */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void Init_Port(void)
{
//将P2口所有的管脚在初始化的时候设置为输入方式
P2DIR = 0;
//将P2口所有的管脚设置为一般I/O口
P2SEL = 0;
P2DIR |= BIT7;//P2.7设置为输出方向
SET_INR_TXD;
return;
}
/***FUNC+*********************************************************************/
/* Name : Init_CLK */
/* Descrp : Set PLL Clock. */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void Init_CLK(void)
{
int index;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
{
;
}
} while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
}
/***FUNC+*********************************************************************/
/* Name : main */
/* Descrp : 主程序 */
/* Input : num. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void main( void )
{
unsigned char key;
unsigned char IR_Data[4]={0,0,0,0};//接收到的4字节数据
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
Init_CLK();//时钟初始化
Init_Port();
Init_UART0();
Uart_Printf("\r\nMSP430F149 development board Infra red TX Test!\r\n");
Uart_Printf("\r\nPlease Button 3*3 Keyboard!\r\n");
P1DIR = (BIT0|BIT2|BIT4)&0xFF;
while(1)
{
key = GetKey();
if(key!=0xFF)
{
IR_Data[0] = 64;
IR_Data[1] = 191;
IR_Data[2] = key;
IR_Data[3] =0xFF - key;
IOsend_Data(IR_Data);
switch(key)
{
case 1:
Uart_Printf("you Button S1\r\n");
break;
case 2:
Uart_Printf("you Button S2\r\n");
break;
case 3:
Uart_Printf("you Button S3\r\n");
break;
case 4:
Uart_Printf("you Button S4\r\n");
break;
case 5:
Uart_Printf("you Button S5\r\n");
break;
case 6:
Uart_Printf("you Button S6\r\n");
break;
case 7:
Uart_Printf("you Button S7\r\n");
break;
case 8:
Uart_Printf("you Button S8\r\n");
break;
case 9:
Uart_Printf("you Button S9\r\n");
break;
default:
break;
}
}
}
}
/***FUNC+*********************************************************************/
/* Name : GetKey */
/* Descrp : get key value */
/* Input : num. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
unsigned char GetKey(void)
{
unsigned char temp;
unsigned char KeyValue = 0xFF;
/****************************************************************************/
/* 1、扫描第一列 */
/****************************************************************************/
P1OUT = (BIT0|BIT1|BIT2|BIT3|BIT5)&0xFF;
_NOP();
_NOP();
temp = P1IN & (BIT1|BIT3|BIT5);
if(temp == (BIT3|BIT5))
{
while(temp == (BIT3|BIT5))
{
Delay1ms(1);
P1OUT = (BIT0|BIT1|BIT2|BIT3|BIT5)&0xFF;
temp = P1IN & (BIT1|BIT3|BIT5);
KeyValue = 1;
}
}
if(temp==(BIT1|BIT5))
{
while(temp ==