/****************************************************************************************
* @brief: LCD驱动,S1,S2,S3按键,滚轮操作
* @files: main.c
* @date: 2015-04-24
* @athour:zhouhai
* @pin:
* LCD:P3.2 <---> SCK
* P3.0 <---> SDA
* P2.6 <---> CS
* P3.7 <---> CD
* P8.2 <---> RES
* 按键:P1.6 <---> Button1
* P2.2 <---> Button2
* P2.3 <---> Button3
* 滚轮:P6.0 <---> ADC
****************************************************************************************/
#include <msp430f5529.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdint.h>
#include "sysclk.h"
#include "grlib.h"
#include "Template_Driver.h"
#include "wheel.h"
#include "graph_extend.h"
#include "button.h"
#include "math.h"
static char table[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
//static unsigned long V_table[]={ 110,109,108,107,106,105,104,103,102,101,100,
// 99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,
// 84,83,82,81,80,79,78,77,76,75,74,73,72,71};
static unsigned long V_table[]={56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,
40,39,38,37,36,35,34,33,32,31,30,29,28 };
#define LCDPIEXL 32 //单像素点对应的AD采样值 4096/128
unsigned long ADC_Signal;
//unsigned char i;
tContext g_sContext;
/*
* 数据类型转换,符点型转换为字符型
*/
void num2char(char *str, double number, uint8_t g, uint8_t l)
{
uint8_t i;
int temp = number/1;
double t2 = 0.0;
for (i = 1; i<=g; i++)
{
if (temp==0)
str[g-i] = table[0];
else
str[g-i] = table[temp%10];
temp = temp/10;
}
*(str+g) = '.';
temp = 0;
t2 = number;
for(i=1; i<=l; i++)
{
temp = t2*10;
str[g+i] = table[temp%10];
t2 = t2*10;
}
*(str+g+l+1) = '\0';
}
/*
* 主函数
*/
int main(void)
{
float C_Voltage = 0; //当前电压
float B_Voltage = 0; //靠近峰的上一次电压
float L_Voltage = 3.3; //靠近谷的上一次电压
float Vmax = 0;
float Vmin = 0;
float Vpp ;
char str1[15];
char str2[15];
char str3[15];
// int count=0,n,j; //n用于定位坐标Y轴,count用于计数实现一定时间对电压的刷新
// int nn[240]={0},tt[150]={0};
// int count_n=0,count_draw=0,VV_table; //count_n对存入nn值的位置进行修改,count_draw对画图的X,Y的点进行修改
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
SysClk_Init(); //设置时钟为25Mhz
LCD_WheelInit(); //滚轮初始化
LCD_ButtonInit(); //按键初始化
/*
* AD转换设置
*/
P6SEL=BIT0; //P6.0采集信号
ADC12CTL0=ADC12SHT02+ADC12ON;//采样保持时间控制位所需ADC12CLK个数16, 内部参考电压打开
ADC12CTL1=ADC12SHP; //+ADC12CONSEQ_1;//SHI信号上升沿触发采样定时器,采样模式选择序列通道单次转换模式
ADC12CTL0|=ADC12ENC; //使能AD转换
TA0CCTL0=CCIE;//中断使能
TA0CCR0=1000; //1000大约为0.94ms (100时为2.038V,1000时为)
TA0CTL=TASSEL_2+MC_1+TACLR; //SMCLK,定时器清楚控制位,定时器中断使能
//-----显示库函数初始化-----
Template_DriverInit();
GrContextInit(&g_sContext, &g_sTemplate_Driver); //
GrContextForegroundSet(&g_sContext, ClrWhite); //ClrAliceBlue颜色库中调用
GrContextBackgroundSet(&g_sContext, ClrBlack); //
GrContextFontSet(&g_sContext, &g_sFontFixed6x8); //g_sFontFixed6x8字体定义
GrClearDisplay(&g_sContext);
// GrStringDraw(&g_sContext,"PhaseLockedAmplifier",AUTO_STRING_LENGTH,0,0,OPAQUE_TEXT); //LCD上绘制字符串
GrStringDraw(&g_sContext,"VMax(V):",AUTO_STRING_LENGTH,0,0,OPAQUE_TEXT);
GrStringDraw(&g_sContext,"VMin(V):",AUTO_STRING_LENGTH,0,9,OPAQUE_TEXT);
GrStringDraw(&g_sContext,"VPP(V):",AUTO_STRING_LENGTH,0,20,OPAQUE_TEXT);
//每8个像素为一行
GrFlush(&g_sContext); //刷新LCD
_enable_interrupt(); //使能中断
while(1)
{
ADC12CTL0 |=ADC12SC;
C_Voltage = (3.3/4096)*ADC_Signal; //采样得到的电压值,(字符型)
tt[count_n]=count_n; //X轴的位置
n=1+(log(C_Voltage)/log(2)); //换算得到Y对应位置
VV_table =V_table[n];
nn[count_n] = VV_table; //修改数组的位置
count_n++;
if(B_Voltage<C_Voltage) //B_Voltage上一次的电压值
{
B_Voltage=C_Voltage;
}
else
{
Vmax=B_Voltage;
}
if(L_Voltage>C_Voltage)
{
L_Voltage=C_Voltage;
}
else
{
Vmin = L_Voltage;
}
Vpp=Vmax-Vmin;
num2char(str1, Vmax, 3,3); //浮点型转换为字符型
GrStringDraw(&g_sContext,str1,AUTO_STRING_LENGTH,64,0,OPAQUE_TEXT);
//__delay_cycles(750); //延时75us使参考电压稳定
num2char(str2, Vmin, 3,3); //浮点型转换为字符型
GrStringDraw(&g_sContext,str2,AUTO_STRING_LENGTH,64,9,OPAQUE_TEXT);
num2char(str3, Vpp, 3,3); //浮点型转换为字符型
GrStringDraw(&g_sContext,str3,AUTO_STRING_LENGTH,64,18,OPAQUE_TEXT);
GrFlush(&g_sContext);
/* count++; //计数实现一定时间对电压的刷新
if(count>150)
{
L_Voltage = 3.3;
B_Voltage = 0;
count=0;
}
if(count_n>10)
{
GrStringDraw(&g_sContext,".",AUTO_STRING_LENGTH,tt[count_draw],nn[count_draw],OPAQUE_TEXT);//绘图
count_draw++;
GrFlush(&g_sContext);
}
/* if(count_draw>123)
{
for(j=0;j<count_draw;j++)
{
tt[j]=0;
nn[j]=0;
count_draw=0;
count_n=0;
}
}*/
}
}
/*
* 中断程序
*/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
while (ADC12CTL1 & ADC12BUSY); //判断是否在进行采样转换
ADC_Signal=ADC12MEM0; //保存AD转换后的值,自动清除中断标志位
}
|