//使用单片机的串口0 //P10~P13输入模式,接四个按键 // #include <msp430x14x.h>
#define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long
/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/ #define baud 9600 //设置波特率的大小 #define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式 #define baud_h (uchar)(baud_setting>>8) //提取高位 #define baud_l (uchar)(baud_setting) //低位 #define KeyPort P1IN //************************************************************************* // 系统时钟初始化 //************************************************************************* void Clock_Init() { uchar i; BCSCTL1&=~XT2OFF; //打开XT振荡器 BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{ IFG1&=~OFIFG; //清除震荡标志 for(i=0;i<100;i++) _NOP(); //延时等待 } while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待 IFG1&=~OFIFG; } //************************************************************************* // MSP430内部看门狗初始化 //************************************************************************* void WDT_Init() { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 }
//************************************************************************* // MSP430串口初始化 //************************************************************************* void UART_Init() { U0CTL|=SWRST; //复位SWRST U0CTL|=CHAR; //8位数据模式 U0TCTL|=SSEL1; //SMCLK为串口时钟 U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N U0BR0=baud_l; //N=UBR+(UxMCTL)/8 U0MCTL=0x00; //微调寄存器为0,波特率9600bps ME1|=UTXE0; //UART1发送使能 ME1|=URXE0; //UART1接收使能 U0CTL&=~SWRST; IE1|=URXIE0; //接收中断使能位 P3SEL|= BIT4; //设置IO口为普通I/O模式 P3DIR|= BIT4; //设置IO口方向为输出 P3SEL|= BIT5; }
//************************************************************************* // 串口0发送数据函数 //*************************************************************************
void Send_Byte(uchar data) { while((IFG1&UTXIFG0)==0); //发送寄存器空的时候发送数据 U0TXBUF=data; }
//************************************************************************* // 处理来自串口 0 的接收中断 //*************************************************************************
#pragma vector=UART0RX_VECTOR __interrupt void UART0_RX_ISR(void) {
} //************************************************************************* // 处理来自串口 0 的发送中断,预留 //*************************************************************************
#pragma vector=UART0TX_VECTOR __interrupt void UART0_TX_ISR(void) Send_Byte(data); {
}
/************************************************************************* // 初始化IO口子程序 //************************************************************************* void Port_init() {
P1SEL = 0x00; //P1普通IO功能 P1DIR = 0xF0; //P10~P13输入模式,外部电路已接上拉电阻 }
//********************************************************************** // 键盘扫描子程序,采用逐键扫描的方式 //**********************************************************************
uchar Key_Scan(void) { uchar key_check; uchar key_checkin; key_checkin=KeyPort; //读取IO口状态,判断是否有键按下 key_checkin&= 0x0F; //读取IO口状态,判断是否有键按下 if(key_checkin!=0x0F) //IO口值发生变化则表示有键按下 { delay_ms(20); //键盘消抖,延时20MS key_checkin=KeyPort; if(key_checkin!=0x1F) { key_check=KeyPort; switch (key_check & 0x0F) { case 0x0E:key=1;Send_Byte(key);break; case 0x0D:key=2;Send_Byte(key);break; case 0x0B:key=3;Send_Byte(key);break; case 0x07:key=4;Send_Byte(key);break;
} } } else { key=0xFF; } return key; }
//************************************************************************* // 主函数 //************************************************************************* void main(void) { WDT_Init(); //看门狗设置 Clock_Init(); //系统时钟设置 UART_Init(); //串口设置初始化 _EINT(); //开中断 while(1) //无限循环 {Key_Scan(); } } |