This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AD转换1602显示的问题

Other Parts Discussed in Thread: MSP430G2553

#include "msp430g2553.h"

#include "1602.h"

#define uchar unsigned char

#define uint unsigned int

#define   Num_of_Results   32

static uint results[Num_of_Results];    //保存ADC转换结果的数组                                                     // is not used for anything.

void Trans_val(uint Hex_Val);

/***************************************

   1602显示字符 和算法滤波的定义

*************************************/

uchar shuzi[] = {"0123456789."};

uchar tishi[] = {"The volt is:"};

/**************************************

             主函数

***************************************/

int main(void)

{

 WDTCTL = WDTPW + WDTHOLD;  // Stop WDT

 LCD_init();                              //复位1602液晶

 LCD_write_string(2,0,tishi);                  //显示提示信息

 LCD_write_char(11,1,'V');

 ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled

 ADC10CTL1 = INCH_1;                       // input A1

 ADC10AE0 |= 0x02;                     // PA.1 ADC option select

 ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start

 _EINT();

   __bis_SR_register(CPUOFF + GIE);        // Clear CPUOFF bit from 0(SR)

}    

/*******************************************

函数名称:ADC12ISR

功    能:ADC中断服务函数,在这里用多次平均的

         计算P6.0口的模拟电压数值

参    数:无      

返回值  :无

********************************************/

#pragma vector=ADC10_VECTOR

__interrupt void ADC10ISR (void)

{

 static uint index = 0;

 results[index++] = ADC10MEM;               // Move results

 if(index == Num_of_Results)

 {

       uchar i;

       unsigned long sum = 0;

       index = 0;

       for(i = 0; i < Num_of_Results; i++)

       {

           sum += results[i];

       }

       sum >>= 5;                            //除以32   2的5次方=32

       Trans_val(sum);

 }

  __bic_SR_register_on_exit(CPUOFF);

}

/*******************************************

函数名称:Trans_val

功    能:将16进制ADC转换数据变换成三位10进制

         真实的模拟电压数据,并在液晶上显示

参    数:Hex_Val--16进制数据

         n--变换时的分母等于2的n次方      

返回值  :无

********************************************/

void Trans_val(uint Hex_Val)

{

   unsigned long caltmp;

   uint Curr_Volt;

   uchar t1,i;

   uchar ptr[4];

   caltmp = Hex_Val;

   caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33

   caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10

   Curr_Volt = caltmp >> 12;                   //Curr_Volt = caltmp / 2^n

   ptr[0] = Curr_Volt / 100;                   //Hex->Dec变换

   t1 = Curr_Volt - (ptr[0] * 100);

   ptr[2] = t1 / 10;

   ptr[3] = t1 - (ptr[2] * 10);

   ptr[1] = 10;                                //shuzi表中第10位对应符号"."

   //在液晶上显示变换后的结果

   for(i = 0;i < 4;i++)

     LCD_write_char((6 + i),1,shuzi[ptr[i]]);

}

程序如上但是显示频没有显示 转换的数值

  • 说实话我真不知道该怎么给您建议!

    希望您下次发帖的时候不要仅仅贴大段的程序上去,没有板子没法去评估您的程序是否正确,会让我会有千百种假设和猜测,这是没有意义的事情。

    希望您能够简单的描述下实验现象,比如,整个系统供电如何?MSP430和1602之间的接口电路有没有问题,截个图贴到论坛上。控制1602的引脚上有没有信号?1602的控制方式如何?AD采样转换结果是否正确?

    我相信您在总结这些现象的时候,自己都有可能把这个问题解决掉了。

  • 这个情况多了:

    1.系统电源是否正常工作

    2.MCU和LCD是否正常工作

    3.MCU与LCD的连接是否正确

    4.检查MCU对ADC的操作的程序是否正确

    5.检查MCU对LCD的操作程序是否正确

    6.把LCD与ADC两部分结合起来调试