标题:
MSP430F552x电子屏显示程序
[打印本页]
作者:
timoo
时间:
2019-11-5 10:10
标题:
MSP430F552x电子屏显示程序
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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1