关于mspg2553的一个温度采样led显示问题

2019-03-24 09:42发布

我有个问题麻烦各位大神就是我的关于引脚 我Vss和K接单片机上的GND,VDD和A接单片机的VCC,1602的RS接P2.0,RW接P2.1,E接P2.27~14的8个引脚接MSP430的P1.0~P1.7。V0刚接了地。输出的数据一直在跳,我换了个位置输出程序却不跳了,刚开始我由于马虎把地线和那个Vcc接错了,希望大家能帮我解决这个疑问。
#include<msp430g2553.h>
#define uchar unsigned char
#define uint unsigned int
#define P20 0
#define P21 1
#define P22 2

#define RS_CLR        P2OUT &= ~(1 << P20)        //RS置低
#define RS_SET        P2OUT |= (1 << P20)         //RS置高

#define RW_CLR        P2OUT &= ~(1 << P21)        //RW置低
#define RW_SET        P2OUT |= (1 << P21)         //RW置高

#define EN_CLR        P2OUT &= ~(1 << P22)        //E置低
#define EN_SET        P2OUT |= (1 << P22)         //E置高
uchar num;
int ADC_CHO;

int c;
int data;
unsigned  char x;
unsigned  char y;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)   //输入数据
{
        RS_CLR;     //RS置低 输入指令
        P1OUT=com;
        delay(5);
        EN_SET;
        delay(5);
        EN_CLR;    //E置低  1->0 执行指令
}

void write_data(uchar data)  //输出数据
{
        RS_SET;      //RS置高  RS=1输出数据
        P1OUT=data;
        delay(5);
        EN_SET;
        delay(5);
        EN_CLR;     //E置低  1->0 执行指令
}
void init()   //1602初始化,请参考1602的资料
{

        EN_CLR;
        write_com(0x38);     //设置16*2显示,5*7点阵,8位数据接口
        write_com(0x0e);     //光标不显示
        write_com(0x06);     //写入新数据后光标右移,显示频不移动
        write_com(0x01);    //0000000001 清屏
        write_com(0x80);    //修改指针的位置
}
/**************************************************
** 函数名称: display_xy
** 入口参数:x(unsigned  char型),y(unsigned  char型)
** 出口参数:无
** 功能描述: 设置光标位置, x是行号,y是列号
****************************************************/
void display_xy(unsigned char x,unsigned char y)
{
        if(y==0x01)
        {
                x=x+0x40+x+0x80;
        }
        else
        {
                x=x+0x80;//数据指针设置80H+地址码
        }
        write_com(x);
}
/*********************************************************************
** 函数名称: display_string
** 入口参数:x(unsigned  char型),y(unsigned  char型),s(指针型)
** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
void  display_string(unsigned  char x,unsigned  char y,unsigned  char *s)
{
  display_xy(x,y);
  while(*s)
  {
   WriteDataLcd(*s);
   s++;
  }
}
/***************************************
函数名称:Disp1Char
功    能:在某个位置显示一个字符
参    数:X-----位置的列坐标
          Y-----位置的行坐标
          data--显示的字符数据
返回值  :无
***************************************/
void Disp1Char(uchar x,uchar y,uchar data)
{
        display_xy(x,y);
        write_data(data);//输出数据
}
/***********************************在1602LCD上显示****************
                            ***********浮点数*********************/
void Disp_float(float f_data)
{
        unsigned char lcd_table[3];
        int aa;
        aa=f_data;
        lcd_table[0]= aa/1000 ;
        lcd_table[1]=aa%100/10;
        lcd_table[2]=aa%10;
        Disp1Char(0,0,(lcd_table[0]+0x30));//显示整数部分十位数
        Disp1Char(1,0,(lcd_table[1]+0x30));//显示小数部分的个位
        Disp1Char(2,0,(0x2e));//显示小数点
        Disp1Char(3,0,(lcd_table[2]+0x30));//显示小数部分十分位
        //加上0x30以便得到直接的ASCLL码显示
}
void main()
{
        WDTCTL = WDTPW | WDTHOLD;
        P2DIR=0XFF;
        P1DIR=0XFF;
        P1OUT=0;
        RW_CLR;//写数据指令
        init();
        ADC10CTL1|=CONSEQ_2;//单通道多次转换模式
        ADC10CTL0 |= SREF_1+REFON;//选择内部参考源1.5V,打开基准源
        ADC10CTL0 |= ADC10SHT_3+MSC; //过采样率设置为64个采样周期,打开AD转换
        ADC10CTL1|= ADC10SSEL_3+SHS_0; //ACLK2分频为采样时钟,用ADC10SC触发采集
        ADC10CTL1 |=INCH_1; //选择通道A1
        ADC10CTL0 |= ADC10ON; //开启ADC10
        while (1)
        {
                //delay(1000);
                ADC10CTL0 |=ENC+ADC10SC; //开始转换
                while((ADC10CTL0 &ADC10IFG)==0); //等待ADC10IFG标志变高(转换完成)
                ADC_CHO=ADC10MEM; //读取采样结果
                data= (ADC_CHO-746)/(0.000355*678)+286;
                c=data;
                if(c>150)
                {
                        P2DIR|=BIT3;
                        P2OUT=0X00;
                        delay(2000);
                }
                Disp_float(c);//显示结果
                delay(2000);
        }
}


#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
   __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
   TACTL = 0;
   LPM0_EXIT;                                // Exit LPM0 on return
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
jqh_111
1楼-- · 2019-03-24 16:01
< 建议,问题简洁点,这篇帖子让人看着很累。

一周热门 更多>

相关问题

    相关文章