LAB电子屏显示
单片机源程序如下:
- //******************************************************************************
- //SMCLK为20Mhz,否则屏幕会闪
- // MSP430F552x Demo - Timer0_A5, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK
- //
- // Description: Toggle P1.0 using software and TA_1 ISR. Timer1_A is
- // configured for up mode, thus the timer overflows when TAR counts
- // to CCR0. In this example, CCR0 is loaded with 50000.
- // ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~1.045MHz
- //
- // MSP430F552x
- // ---------------
- // /|\| |
- // | | |
- // --|RST |
- // | |
- // | P1.0|-->LED
- //
- // Bhargavi Nisarga
- // Texas Instruments Inc.
- // April 2009
- // Built with CCSv4 and IAR Embedded Workbench Version: 4.21
- //******************************************************************************
- //测周法----测频率,主频升到25Mhz,
- #include "msp430f5529.h"
- #include "Init_sys.h"
- #include "Paper_Display.h"
- ///////////////////
- #define xDot 128
- #define yDot 250
- //#define DELAYTIME 5
- volatile unsigned char DisBuffer[250*16];
- volatile unsigned int Cycle[10];
- unsigned int Last_capture,Over_flow_counter,Down_Last_capture;
- unsigned int One_second_flag=0;
- unsigned long capture_num=0,CapFlag=0,Average_period,High_width;
- unsigned char down_flag;
- float f, test_f1,test_f2,test_width;
- void init_TA1(void) //定时1s
- {
- TA1CCTL0=CCIE;
- TA1CCR0=32768; //1s
- TA1CTL=TASSEL_1+MC_1+TACLR;
- }
- void init_pwm(void) //p1.2(TA0.1)输出10KhzPWM信号
- {
- P1DIR|=BIT2;
- P1SEL|=BIT2;//输出PWM1波
- TA0CCR0=2000;//10khz
- TA0CTL=TASSEL_2+MC_1+TACLR;//时钟源为SMCLK=20MHZ,向上计数,TAR清堆零
- TA0CCTL1=OUTMOD_7;//初始化模式
- TA0CCR1=1000;
- P7DIR |=BIT4+BIT0;
- P7OUT |=BIT0;
- P7OUT &=~BIT4;
- }
- void init_TA2_CAP(void) //测频,p2.2为测频输入端
- {
- TA2CTL=TASSEL_2+MC_2+TACLR+TAIE;//SMCLK,连续计数,清TAR,TA定时使能
- P2DIR&=~BIT4; //设置为输入P2.4为TA2.1
- P2SEL|=BIT4;
- TA2CCTL1=CM_1+SCS+CAP+CCIE; //+CCIS_0;//cap1,上升沿捕获,同步,捕获,捕获使能,
- }
- ///////////////////
- int main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT
- int i=180;
- int m = 0xff;
- char disp[11]={'0','1','2','3','4','5','6','7','8','9','.'};
- float value = 0;
- volatile unsigned int a1 = 0;
- volatile unsigned int V2 = 0;
- unsigned char t1[5], t2[5], t3[5];
- init_clk(); //初始化时钟;
- init_TA1(); //定时1s
- init_pwm(); //PWM初始化
- init_TA2_CAP();
- P4DIR |= BIT7;
- P1DIR |= BIT0; // P1.0, P4.7 LED output,
- PaperIO_Int(); //电子纸IO口初始化
- EPD_init_Full(); //全屏刷新初始化
- __delay_cycles(500000);
- EPD_Dis_Full((unsigned char *)&m,0); //all white
- __delay_cycles(8000000);
- EPD_init_Part(); //电子纸局部刷新
- Init_buff(); //初始化屏幕显存
- DIS_IMG(0);
- __delay_cycles(800000);
- display(" ", 20, 4,0,1,0,0);
- DIS_IMG(5);
- __delay_cycles(500000);
- __bis_SR_register( GIE); // Enter LPM0, enable interrupts
- //
- //
- while(1)
- {
- test_f1=20000000/Average_period; //测周法
- test_f2=capture_num; //测频法
- test_width=1.0/20*High_width; //测高电平宽度
- V2=test_f1;
- t1[0]=disp[V2/10000]; //万位
- t1[1]=disp[V2/1000%10]; //千位
- t1[2]=disp[V2/100%10]; //百位
- t1[3]=disp[V2%100/10]; //十位
- t1[4]=disp[V2%10]; //个位/
- V2=test_f2;
- t2[0]=disp[V2/10000]; //万位
- t2[1]=disp[V2/1000%10]; //千位
- t2[2]=disp[V2/100%10]; //百位
- t2[3]=disp[V2%100/10]; //十位
- t2[4]=disp[V2%10]; //个位/
- V2=test_width;
- t3[0]=disp[V2/10000]; //万位
- t3[1]=disp[V2/1000%10]; //千位
- t3[2]=disp[V2/100%10]; //百位
- t3[3]=disp[V2%100/10]; //十位
- t3[4]=disp[V2%10]; //个位/
- display("f1: ", 0, 0,0,1,0,0); // 送到显存
- display(t1, 60, 0,0,1,0,0);
- display("Hz ", 140, 0,0,1,0,0);
- display("f2:", 0, 32,0,1,0,0); // 送到显存
- display(t2, 60, 32,0,1,0,0);
- display("Hz ", 140, 32,0,1,0,0);
- display("w:", 0, 80,0,1,0,0); // 送到显存
- display(t3, 60, 80,0,1,0,0);
- display("us", 140, 80,0,1,0,0);
- DIS_IMG(5); //局部刷新显示
- }
- }
- //TA1中断服务程序 Timer1 A0 interrupt service routine
- //每1s计算捕获脉冲个数
- #pragma vector=TIMER1_A0_VECTOR
- __interrupt void TIMER1_A0_ISR(void)
- {
- _EINT();
- P4OUT ^= BIT7;
- capture_num= CapFlag; //计算在1s间隔内捕获脉冲的次数
- CapFlag=0; //清除捕获计数值
- TA1CTL&=~TAIFG;
- }
- //TA2捕获中断服务程序
- #pragma vector=TIMER2_A1_VECTOR
- __interrupt void TIMER2_A1_ISR(void)
- {
- static unsigned int i=0;
- switch(__even_in_range(TA2IV,14))
- {
- case 0: break; // No interrupt
- case 2 : // CCR1 捕获中断
- if((TA2CCTL1&CM0)==CM0) // 若是上升沿捕获,测上升沿间隔脉冲数
- {
- CapFlag++; //捕获次数++
- Average_period=Over_flow_counter*65535-Last_capture+TA2CCR1;
- //测量两个上升沿的间隔的时钟个数
- Last_capture=TA2CCR1; //当前上升沿捕获值保存
- Over_flow_counter=0; //溢出清零
- TA2CCTL1 = CM1 + SCS + CAP + CCIE; //开启下降沿捕获
- }
- else // 若是下降沿捕获,则测高电平的宽度
- //if((TA2CCTL1&CM1)==CM1)
- {
- High_width=Over_flow_counter*65535-Last_capture+TA2CCR1; //测量本下降沿与之前上升沿之差值
- //此时TA2CCR1为下降沿捕获值
- Over_flow_counter=0; //溢出清零
- TA2CCTL1 = CM0 + SCS + CAP + CCIE;//开启上升沿捕获
- }
- TA2CCTL1&=~CCIFG; //清除中断
- break;
- case 4: break; // CCR2 not used
- case 6: break; // reserved
- case 8: break; // reserved
- case 10: break; // reserved
- case 12: break; // reserved
- case 14: // overflow TAFIG溢出中断
- Over_flow_counter++;
- TA2CTL&=~TAIFG;
- break;
- default: break;
- }
- }
复制代码
所有资料51hei提供下载:
LAB_test_f_show.zip
(216.21 KB, 下载次数: 3)
|