#include
#include
uint16_t num=10,freq;
#define uint unsigned int
void Display_F(uint F_DISP);//显示频率
void lcd_init(void);//初始
void WriteCommandLcd(unsigned char wdata);////向1602液晶写入命令子程序
void WriteDataLcd(unsigned char wdata);//向1602液晶写入数据子程序;
uint captar=0,capfirst,caplast,time=0,pulse=0,f;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
lcd_init();
P1DIR&=~BIT4;
P1SEL|=BIT4;
TA1CCTL1=CM_1+SCS+CCIS_0+CAP+CCIE;
TA1CTL=TASSEL_1+MC_2+TACLR+TAIE;
//TA1CTL = TASSEL_1 + MC_2 +TACLR; // ACLK, up-down 模式
P2DIR = 0xff;//设置P2为输出状态
//P4DIR = 0xff; //设置P4口为输出状态;
P3DIR = 0xff; //设置P5口为输出状态;
lcd_init(); //初始化子程序;
_EINT();
while(1){
f=pulse*32768/time;
f=1000;
Display_F(f);
TA1CCTL1 |= CCIE;
TA1CTL |= TAIE;
}
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void timer1_A1 (void)
{
switch(TA1IV){
case 2:{
if(captar==0)
{
capfirst=TA1CCR0;
captar++;
}
else{
caplast=TA1CCR0;
captar++;
}
TA1CCTL1 &=~CCIFG;
break;
}
case 14:{
if(captar==0)
pulse=0;
else{
pulse=captar-1;
time=caplast-capfirst;
captar=0;
}
//f=pulse*32768/time;
//f=f%1000;
//Display_F(f);
TA1CCTL1&=~CCIE;
TA1CTL=~TAIE;
break;
}
default:break;
}
}
void lcd_init(void)
{
P2DIR = BIT4 + BIT2 + BIT3;//设置P2.4,2.2,2.3为输出状态
P3DIR = 0xff; //设置P3口为输出状态;
__delay_cycles(100);
WriteCommandLcd(0x38);//显示模式设置,设置为16X2显示,5X7点阵,8位数据接口
__delay_cycles(50);
WriteCommandLcd(0x01); //显示清屏
WriteCommandLcd(0x0c); //开显示,关闭光标,当然光标也就不能显示了;(1)
//WriteCommandLcd(0x0e); //开显示,显示光标,但是光标不闪烁;(2)
//WriteCommandLcd(0x0f); //开显示,显示光标,光标闪烁;(3)
//delay(10);
WriteCommandLcd(0x06); //读写操作时地址自动加1
}
void WriteCommandLcd(unsigned char wdata)//向1602液晶写入命令子程序;
{
P2OUT&=~BIT4;//RS清零,代表命令;
P2OUT&=~BIT2;//RW清零;
P2OUT&=~BIT3;//使能E清零;
__delay_cycles(100);//短暂延时,代替检测忙状态
P2OUT|= BIT3;//使能E置1;
__delay_cycles(1000); //短暂延时,代替检测忙状态
P3OUT=wdata;//送出命令或数据
__delay_cycles(1000);//短暂延时,代替检测忙状态
P2OUT&=~BIT3;//使能E清零,下降沿将命令或数据送入1602;
}
void WriteDataLcd(unsigned char wdata)//向1602液晶写入数据子程序;
{
P2OUT|= BIT4;//RS置1,代表数据;
P2OUT&=~BIT2;//RW清零;
P2OUT&=~BIT3;//使能E清零;
__delay_cycles(100); //短暂延时,代替检测忙状态
P2OUT|= BIT3;//使能E置1;
__delay_cycles(100);//短暂延时,代替检测忙状态
P3OUT=wdata;//送出命令或数据
__delay_cycles(100);//短暂延时,代替检测忙状态
P2OUT&=~BIT3;//使能E清零,下降沿将命令或数据送入1602;
}
void Display_F(uint F_DISP)//显示频率
{
WriteCommandLcd(0x80);//从第二行第一个位置开始显示数据,第一行第一个位置的地址是80H;
WriteDataLcd(0x30+F_DISP%10000/1000);//显示千位;
WriteDataLcd(0x30+F_DISP%1000/100);//显示百位;
WriteDataLcd(0x30+F_DISP%100/10);//显示十位;
WriteDataLcd(0x30+F_DISP%10);//显示个位;
WriteDataLcd(0x56);//显示字符V
__delay_cycles(1000);
__delay_cycles(1000);
}
新手不太懂。。帮一下各位大神 |