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)
2019-11-5 10:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|