找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2025|回复: 0
打印 上一主题 下一主题
收起左侧

MSP430f5529LCD显示

[复制链接]
跳转到指定楼层
楼主
ID:597174 发表于 2019-8-7 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/****************************************************************************************
*  @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转换后的值,自动清除中断标志位

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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