找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1152|回复: 0
收起左侧

MSP430F552x电子屏显示程序

[复制链接]
ID:635821 发表于 2019-11-5 10:10 | 显示全部楼层 |阅读模式
LAB电子屏显示

单片机源程序如下:

  1. //******************************************************************************
  2. //SMCLK为20Mhz,否则屏幕会闪
  3. //  MSP430F552x Demo - Timer0_A5, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK
  4. //
  5. //  Description: Toggle P1.0 using software and TA_1 ISR. Timer1_A is
  6. //  configured for up mode, thus the timer overflows when TAR counts
  7. //  to CCR0. In this example, CCR0 is loaded with 50000.
  8. //  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~1.045MHz
  9. //
  10. //           MSP430F552x
  11. //         ---------------
  12. //     /|\|               |
  13. //      | |               |
  14. //      --|RST            |
  15. //        |               |
  16. //        |           P1.0|-->LED
  17. //
  18. //   Bhargavi Nisarga
  19. //   Texas Instruments Inc.
  20. //   April 2009
  21. //   Built with CCSv4 and IAR Embedded Workbench Version: 4.21
  22. //******************************************************************************
  23. //测周法----测频率,主频升到25Mhz,
  24. #include "msp430f5529.h"
  25. #include "Init_sys.h"
  26. #include "Paper_Display.h"
  27. ///////////////////
  28. #define xDot 128
  29. #define yDot 250
  30. //#define DELAYTIME 5
  31. volatile unsigned char DisBuffer[250*16];


  32. volatile unsigned int Cycle[10];
  33. unsigned int Last_capture,Over_flow_counter,Down_Last_capture;

  34. unsigned int One_second_flag=0;
  35. unsigned long capture_num=0,CapFlag=0,Average_period,High_width;
  36. unsigned char down_flag;
  37. float f, test_f1,test_f2,test_width;


  38. void init_TA1(void)  //定时1s
  39. {

  40.       TA1CCTL0=CCIE;
  41.       TA1CCR0=32768;   //1s
  42.       TA1CTL=TASSEL_1+MC_1+TACLR;
  43. }

  44. void init_pwm(void)  //p1.2(TA0.1)输出10KhzPWM信号
  45. {
  46.         P1DIR|=BIT2;
  47.         P1SEL|=BIT2;//输出PWM1波

  48.         TA0CCR0=2000;//10khz
  49.         TA0CTL=TASSEL_2+MC_1+TACLR;//时钟源为SMCLK=20MHZ,向上计数,TAR清堆零
  50.         TA0CCTL1=OUTMOD_7;//初始化模式
  51.         TA0CCR1=1000;

  52.         P7DIR |=BIT4+BIT0;
  53.         P7OUT |=BIT0;
  54.         P7OUT &=~BIT4;

  55. }

  56. void init_TA2_CAP(void) //测频,p2.2为测频输入端
  57. {
  58.     TA2CTL=TASSEL_2+MC_2+TACLR+TAIE;//SMCLK,连续计数,清TAR,TA定时使能
  59.     P2DIR&=~BIT4;   //设置为输入P2.4为TA2.1
  60.     P2SEL|=BIT4;
  61.     TA2CCTL1=CM_1+SCS+CAP+CCIE; //+CCIS_0;//cap1,上升沿捕获,同步,捕获,捕获使能,
  62. }


  63. ///////////////////
  64. int main(void)
  65. {
  66.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  67.   int i=180;
  68.   int m = 0xff;
  69.   char disp[11]={'0','1','2','3','4','5','6','7','8','9','.'};
  70.   float value = 0;
  71.   volatile   unsigned int a1 = 0;
  72.   volatile  unsigned int  V2 = 0;
  73.   unsigned char t1[5], t2[5], t3[5];


  74.   init_clk();    //初始化时钟;
  75.   init_TA1();    //定时1s
  76.   init_pwm();    //PWM初始化
  77.   init_TA2_CAP();

  78.   P4DIR |= BIT7;
  79.   P1DIR |= BIT0;          // P1.0, P4.7 LED output,

  80.           PaperIO_Int();    //电子纸IO口初始化
  81.           EPD_init_Full();  //全屏刷新初始化
  82.           __delay_cycles(500000);
  83.           EPD_Dis_Full((unsigned char *)&m,0);  //all white
  84.            __delay_cycles(8000000);

  85.            EPD_init_Part(); //电子纸局部刷新
  86.            Init_buff();    //初始化屏幕显存
  87.            DIS_IMG(0);
  88.            __delay_cycles(800000);
  89.            display("             ", 20, 4,0,1,0,0);
  90.            DIS_IMG(5);
  91.            __delay_cycles(500000);


  92.   __bis_SR_register( GIE);          // Enter LPM0, enable interrupts
  93. //
  94. //
  95.   while(1)

  96.      {
  97.       test_f1=20000000/Average_period;  //测周法
  98.       test_f2=capture_num;              //测频法
  99.       test_width=1.0/20*High_width;     //测高电平宽度


  100.       V2=test_f1;
  101.       t1[0]=disp[V2/10000];            //万位
  102.       t1[1]=disp[V2/1000%10];          //千位
  103.       t1[2]=disp[V2/100%10];             //百位
  104.       t1[3]=disp[V2%100/10];            //十位
  105.       t1[4]=disp[V2%10];                //个位/


  106.       V2=test_f2;
  107.       t2[0]=disp[V2/10000];            //万位
  108.       t2[1]=disp[V2/1000%10];          //千位
  109.       t2[2]=disp[V2/100%10];             //百位
  110.       t2[3]=disp[V2%100/10];            //十位
  111.       t2[4]=disp[V2%10];                //个位/

  112.       V2=test_width;
  113.       t3[0]=disp[V2/10000];            //万位
  114.       t3[1]=disp[V2/1000%10];          //千位
  115.       t3[2]=disp[V2/100%10];             //百位
  116.       t3[3]=disp[V2%100/10];            //十位
  117.       t3[4]=disp[V2%10];                //个位/


  118.       display("f1: ", 0, 0,0,1,0,0);  // 送到显存
  119.       display(t1, 60, 0,0,1,0,0);
  120.       display("Hz ", 140, 0,0,1,0,0);

  121.       display("f2:", 0, 32,0,1,0,0);  // 送到显存
  122.       display(t2, 60, 32,0,1,0,0);
  123.       display("Hz ", 140, 32,0,1,0,0);

  124.       display("w:", 0, 80,0,1,0,0);  // 送到显存
  125.       display(t3, 60, 80,0,1,0,0);
  126.       display("us", 140, 80,0,1,0,0);

  127.       DIS_IMG(5);                 //局部刷新显示
  128.      }

  129. }


  130. //TA1中断服务程序 Timer1 A0 interrupt service routine
  131. //每1s计算捕获脉冲个数
  132. #pragma vector=TIMER1_A0_VECTOR
  133. __interrupt void TIMER1_A0_ISR(void)

  134. {
  135.     _EINT();
  136.     P4OUT ^= BIT7;
  137.     capture_num= CapFlag; //计算在1s间隔内捕获脉冲的次数
  138.     CapFlag=0;   //清除捕获计数值
  139.     TA1CTL&=~TAIFG;
  140. }

  141. //TA2捕获中断服务程序
  142. #pragma vector=TIMER2_A1_VECTOR
  143. __interrupt void TIMER2_A1_ISR(void)
  144. {
  145.         static unsigned int i=0;
  146.         switch(__even_in_range(TA2IV,14))
  147.          {
  148.          case  0: break;                   // No interrupt
  149.          case  2 :                         // CCR1 捕获中断
  150.             if((TA2CCTL1&CM0)==CM0)       // 若是上升沿捕获,测上升沿间隔脉冲数
  151.             {
  152.                CapFlag++;   //捕获次数++
  153.                Average_period=Over_flow_counter*65535-Last_capture+TA2CCR1;
  154.                                                      //测量两个上升沿的间隔的时钟个数
  155.                Last_capture=TA2CCR1;         //当前上升沿捕获值保存
  156.                Over_flow_counter=0;          //溢出清零
  157.                TA2CCTL1 = CM1 + SCS + CAP + CCIE; //开启下降沿捕获
  158.             }
  159.             else          // 若是下降沿捕获,则测高电平的宽度
  160.             //if((TA2CCTL1&CM1)==CM1)
  161.             {
  162.                High_width=Over_flow_counter*65535-Last_capture+TA2CCR1;  //测量本下降沿与之前上升沿之差值
  163.                                                                          //此时TA2CCR1为下降沿捕获值
  164.                Over_flow_counter=0;              //溢出清零
  165.                TA2CCTL1 = CM0 + SCS + CAP + CCIE;//开启上升沿捕获
  166.             }
  167.                TA2CCTL1&=~CCIFG;             //清除中断
  168.                   break;
  169.          case  4: break;                          // CCR2 not used
  170.          case  6: break;                          // reserved
  171.          case  8: break;                          // reserved
  172.          case 10: break;                          // reserved
  173.          case 12: break;                          // reserved
  174.          case 14:                                 // overflow TAFIG溢出中断
  175.                  Over_flow_counter++;
  176.                  TA2CTL&=~TAIFG;
  177.                   break;
  178.          default: break;
  179.     }
  180. }

复制代码

所有资料51hei提供下载:
LAB_test_f_show.zip (216.21 KB, 下载次数: 3)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表