#include <msp430x14x.h>
#include "Config.h"
unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数
unsigned int old_cap=0;//捕获的旧值
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{
P4SEL = 0x00;
P4DIR = 0xFF; //数据口输出模式
P5SEL = 0x00;
P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式
}
//***********************************************************************
// 显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com; //命令写入端口
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
RS_SET;
RW_CLR;
EN_SET;
DataPort = data; //数据写入端口
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01); //清屏幕显示
delay_ms(5);
}
//***********************************************************************
// 显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //第一行显示
}
else
{
LCD_write_com(0xC0 + x); //第二行显示
}
while (*s)
{
LCD_write_data( *s);
s ++;
}
}
//***********************************************************************
// 显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //第一行显示
}
else
{
LCD_write_com(0xC0 + x); //第二行显示
}
LCD_write_data( data);
}
//***********************************************************************
// 显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
LCD_write_com(0x38); //显示模式设置
delay_ms(5);
LCD_write_com(0x08); //显示关闭
delay_ms(5);
LCD_write_com(0x01); //显示清屏
delay_ms(5);
LCD_write_com(0x06); //显示光标移动设置
delay_ms(5);
LCD_write_com(0x0C); //显示开及光标设置
delay_ms(5);
}
/*****系统时钟配置****/
void init_MCLK()
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1&=~ XT2OFF; //msp430f149 选择XT2频率,一般为8MHz
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0); // SMCK=MCLK=8MHz
}
/*********/
/****捕获方式设置****/
void cap_init()
{
P1SEL|=0X02;
P1DIR |= 0x08; // P1.2 and P1.3 output
CCTL0|=CM_1+SCS+CAP+CCIE;
TACTL|= TASSEL_2 + MC_2+TAIE; // SMCLK, up-down mode
_EINT();
while(1);
}
#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
if(TACCTL0&CM1)
{P1OUT&=~0X08;
TACCTL0|=CM_1+SCS+CAP+CCIE;
}
else if(TACCTL0&CM0)
{P1OUT|=0X08;
TACCTL0=CM_2+SCS+CAP+CCIE;
}
}
/****频率计算及显示****/
void display_freq()
{
uchar lcdbuf[8];
unsigned long temp;
temp=period;
if(temp>1000)//表示频率小于1KHz
{
temp=1000000/temp;//定时器的计数时钟为1MHz,且以Hz为单位只显示整数部分
lcdbuf[0]=temp/100+0x30;
lcdbuf[1]=(temp%100)/10+0x30;
lcdbuf[2]=temp%10+0x30;
lcdbuf[3]='H';
lcdbuf[4]='z';
lcdbuf[5]=' ';
lcdbuf[6]=' ';
lcdbuf[7]=' ';
if(lcdbuf[0]==0x30)
{
if(lcdbuf[1]==0x30)
LCD_write_str(5,2,&lcdbuf[2]);
else
LCD_write_str(5,2,&lcdbuf[1]);
}
else
LCD_write_str(5,2,&lcdbuf[0]);
}
else//表示频率大于1KHz
{
temp=10000/temp;//定时器的计数时钟为1MHz,以KHz为单位显示,且显示2位小数
//1000/period再扩大10倍以显示小数
lcdbuf[0]=temp/1000+0x30;
lcdbuf[1]=(temp%1000)/100+0x30;
lcdbuf[2]=(temp%1000)%100/10+0x30;
lcdbuf[3]='.';
lcdbuf[4]=(temp%1000)%10+0x30;;
lcdbuf[5]='K';
lcdbuf[6]='H';
lcdbuf[7]='z';
if(lcdbuf[0]==0x30)
{
if(lcdbuf[1]==0x30)
{
LCD_write_str(5,2,&lcdbuf[2]);
LCD_write_str(11,2," ");
}
else
{
LCD_write_str(5,2,&lcdbuf[1]);
LCD_write_str(12,2," ");
}
}
else
LCD_write_str(5,2,&lcdbuf[0]);
}
}
//***********************************************************************
// 主程序
//***********************************************************************
void main(void)
{
volatile unsigned int i;
init_MCLK();//初始化系统时钟
for (i=0; i<20000; i++); // 延时等待晶振稳定
cap_init();//捕获初始化
_EINT(); // 开总中断
LCD_init();//液晶初始化
LCD_write_str(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
display_freq();//脉宽计算及显示
}
}
|