#include<msp430x14x.h>
#include<stdio.h>
#include "lcd1602.h"
#include "ad.h"
#include "usart.h"
#define keyin (P1IN & 0x0F)
uchar key=0; // 按键赋值变量
int key_flag=0; // 按键标志变量
int count=0 ; // 定时器计数变量
int usart_flag=0; // 发给pc机ad 标志变量
char temp1[14]; // 数型转换数组
char temp2[14];
uint countCCR0=1000; // 基本采样定时
void init_cpu_clk( void ); //系统时钟初始化
void init_time(); // 定时器B 初始化
void keyscan(); // 按键中断初始化
void delay(void); // 延时函数
void main()
{
P1DIR = BIT4; //设置P1.0~P.3为输入状态,P.7为输出
P1OUT = 0x00;
init_cpu_clk(); // 系统时钟初始化
LcdReset(); // 初始化液晶
init_adc(); // AD初始化
usart_init(); // 发给pc机ad 标志变量
init_time(); // 定时器初始化
_EINT(); //使能开总中断
while(1)
{ keyscan(); // 按键扫描
if(usart_flag==1)
{
send_AD(A0results); // 发送AD 采回的100个值
while (!(IFG1 & UTXIFG0)); // USART1 TX buffer ready? 判断发送数据缓存区是否结束
TXBUF0 ='T'; // TXBUF1 to TXBUF1
while (!(IFG1 & UTXIFG0)); // USART1 TX buffer ready? 判断发送数据缓存区是否结束
TXBUF0 ='W'; // TXBUF1 to TXBUF1
while (!(IFG1 & UTXIFG0)); // USART1 TX buffer ready? 判断发送数据缓存区是否结束
TXBUF0 ='O'; // TXBUF1 to TXBUF1
while (!(IFG1 & UTXIFG0)); // USART1 TX buffer ready? 判断发送数据缓存区是否结束
TXBUF0 ='\t'; // TXBUF1 to TXBUF1
send_AD(A1results); // 发送AD 采回的100个值
usart_flag=0;
}
}
}
//设置系统时钟
void init_cpu_clk( void )
{
uint i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1 &= ~XT2OFF; // 打开XT2时钟
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS ; // MCLK= XT2=8MHZ (safe) SMCLK= 8mhz
}
/*********************TimeB时钟函数初始化*****************/
void init_time()
{
TBCTL = TBCLR ; // SMCLK=8MHZ, clear TBR
TBCCTL0 = CCIE; // CCR0 interrupt enabled
TBCCR0 = 1000-1; // 50Ms初始化
TBCTL = TBSSEL_2 + MC_1 + ID_3 ; // SMCLK 8MHZ, UP-mode 8DIV
}
/*************TIME_B中断***********************/
#pragma vector=TIMERB0_VECTOR // Timer B0 interrupt service routine 定时50MS
__interrupt void Timer_B0(void)
{
// TBCCR0 =countCCR0-1 ; // Add Offset to CCR0 1ms中断一次
count++;
if(index<100)
{
ADC12CTL0 |= ADC12SC; // Start conversion
}
if(index==100)
{
TBCTL = TBCLR ; // 关闭TBR计数器
TBCCTL0 &= ~CCIE; // 关闭中断
}
if(count==101) // 0.2s刷新显示
{
count=0;
sprintf(temp1,"A0: %6.2f mV ",value0); // 转换ADMEM寄存器里的 采回1000个求平均值显示
sprintf(temp2,"A1: %6.2f mV ",value1);
DispNchar(0,0,14,temp1);
DispNchar(0,1,14,temp2);
}
}
/*******************按键扫描*****************/
void keyscan()
{
if(keyin != 0x0f) //如果有键被按下
{
if(key_flag==1)
{
key_flag=0;
delay(); //延时消抖
if(keyin != 0x0f) //再次检测按键状态
{
key=keyin;
switch(key) //转换键值
{ case 0x0e:{
if(countCCR0<=31)
{ countCCR0 =1000 ; // 程序在此处会多走一步
TBCCR0 = countCCR0-1;
}
else { countCCR0=(uint)(countCCR0/2);
TBCCR0 = countCCR0-1; // 采样率为2KBps,4KBps,8KBps,16KBps,32KBps
}
index=0; // 重新存储ADMEM的值 在采样率改变时
count=0; // 定时器变量 计数为置0
TBCTL = TBSSEL_2 + MC_1 + ID_3 ; // SMCLK 8MHZ, UP-mode 8DIV
TBCCTL0 = CCIE; // CCR0 interrupt enabled
} break;
// case 0x0d: break;
case 0x0b: usart_flag=1; break;
// case 0x07: break;
// default: break;
}
key=0;
}
}
}
else key_flag=1; // 使按键不会误认为多次使用
}
/**************delay 延时消抖函数****************/
void delay(void)
{ uint tmp;
for(tmp = 12000;tmp > 0;tmp--);
}