/****************************************************************************************
* @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轉換后的值,自動清除中斷標志位
}
|