希望在程序开始实现按键选择初始化模式,怎么也不成功...

2019-03-24 08:27发布

   有三个初始化函数,希望可以通过按键选择其一,而后进行后续测试,但发现按键貌似总是被跳过,后面的程序也断掉了,是CPU休眠和唤醒的问题吗???刚刚接触,好多不懂代码是根据例程拼接起来的

#include <msp430.h>
#include "LCD_128.h"
#include "HT1621.h"
#include "TCA6416A.h"

#define myMCLK                        16000000
unsigned char Key=0;
unsigned char flag=0;
unsigned char A;

long temp;
long IntDeg;
void ADC10_ISR(void);
void ADC10_init(void);
void LCD_Init1();
void LCD_Init2();
void LCD_Init3();
void LCD_Display1();
void LCD_Display2();
void LCD_Display3();
void LCD_Display_Pass();
void TCA6416A_LED(unsigned char num);                //LED灯柱显示函数
void I2C_IODect()        ;                                 //检测事件确实发生了

void main()
{
        //unsigned char i=0;
        WDTCTL=WDTPW+WDTHOLD;
        TCA6416A_Init();
    HT1621_init();
                LCD_Display_Pass();
                 __delay_cycles(2*myMCLK);                // 适当延时约为2s

//----小灯初始化----
    PinOUT(0,0);           // 指定0号管脚输出为1
    PinOUT(1,1);           // 指定1号管脚输出为0
    PinOUT(2,0);           // 指定0号管脚输出为1
    PinOUT(3,1);           // 指定1号管脚输出为0
    PinOUT(4,0);           // 指定0号管脚输出为1
    PinOUT(5,1);           // 指定1号管脚输出为0
    PinOUT(6,0);           // 指定0号管脚输出为1
    PinOUT(7,1);           // 指定1号管脚输出为0
       
                //----测试结束,显示PASS----
        I2C_IODect();   //主要是这句感觉老是被跳过
        HT1621_Reflash(LCD_Buffer);
        ADC10_init();

         while(1)
         {
                 ADC10CTL0 |= ENC + ADC10SC;            // Sampling and conversion start
  //    _bis_SR_register(CPUOFF + GIE);                // LPM0 with interrupts enabled
      __delay_cycles(1000);
      //-----ADC转换完成中断唤醒CPU后才执行以下代码-----
      temp = ADC10MEM;                                                        //读取AD采样值
      IntDeg= temp*A/1023;                //转换为摄氏度,并10倍处理
//     IntDeg=1234;                                                                        //由于难以获得负温,直接给负值以测试LCD显
          if(0<=temp<128)    Key=0;       // 指定0号管脚输出为1
          else if(temp<256)   Key=1;        // 指定1号管脚输出为1
          else if(temp<384)   Key=2;        // 指定0号管脚输出为1
          else if(temp<512)   Key=3;        // 指定1号管脚输出为1
          else if(temp<640)   Key=4;        // 指定0号管脚输出为1
          else if(temp<768)   Key=5;        // 指定1号管脚输出为1
          else if(temp<896)   Key=6;        // 指定0号管脚输出为1
          else  Key=7;   // 指定1号管脚输出为1
          TCA6416A_LED(Key);                         //LED灯柱显示
    switch(flag)
    {
    case 1:          LCD_Display1();                break;//调用LCD显示函数
    case 2:          LCD_Display2();                break;
    case 3:          LCD_Display3();                break;
    }
         }
}

/******************************************************************************************************
* 名       称:LCD_Init()
* 功       能:初始化LCD显示相关的硬件,并预设固定不变的显示内容
* 入口参数:无
* 出口参数:无
* 说       明:预设显示内容包括摄氏度oC,以及小数点。
* 范       例:无
******************************************************************************************************/
void LCD_Init1()
{
        //-----显示固定不变的LCD段-----
    //-----减法构造“C”-----光强符号
        LCD_DisplayDigit(8,5);
        LCD_ClearSeg(_LCD_5B);
        LCD_ClearSeg(_LCD_5C);
        LCD_ClearSeg(_LCD_5A);
        LCD_ClearSeg(_LCD_5F);
        //减法构造“d”
        LCD_DisplayDigit(8,6);
        LCD_ClearSeg(_LCD_6A);
        LCD_ClearSeg(_LCD_6F);
}
void LCD_Init2()
{
        //-----显示固定不变的LCD段-----
    //-----减法构造“R”-----湿度符号
        LCD_DisplayDigit(8,5);
        LCD_ClearSeg(_LCD_5D);
        //减法构造“H”
        LCD_DisplayDigit(8,6);
        LCD_ClearSeg(_LCD_6A);
        LCD_ClearSeg(_LCD_6D);
        LCD_DisplaySeg(68);
}
void LCD_Init3()
{
        //-----显示固定不变的LCD段-----
    //-----减法构造“P”-----PH符号
        LCD_DisplayDigit(8,1);
        LCD_ClearSeg(_LCD_1C);
        LCD_ClearSeg(_LCD_1D);
        //减法构造“H”
        LCD_DisplayDigit(8,2);
        LCD_ClearSeg(_LCD_2A);
        LCD_ClearSeg(_LCD_2D);
}
/******************************************************************************************************
* 名       称:LCD_Displaly()
* 功       能:将温度值显示出来
* 入口参数:无
* 出口参数:无
* 说       明:包括对负温度的处理、拆分数字等几部分
* 范       例:无
******************************************************************************************************/
void LCD_Display1()
{
/*         if( IntDeg>=0)          LCD_ClearSeg(_LCD_1G);                //正温度,则清除负号
              else
              {
                      IntDeg=-IntDeg;                                                //负温度,则做绝对值处理
                      LCD_DisplaySeg(_LCD_1G);                //负温度,添加负号
              }   */

              //-----清除4位显示数字-----
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,1);
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,2);
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,3);
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,4);
              //-----拆分4位并显示数字-----
              LCD_DisplayDigit(IntDeg/1000,1);
              LCD_DisplayDigit((IntDeg%1000)/100,2);
              LCD_DisplayDigit((IntDeg%100)/10,3);
              LCD_DisplayDigit(IntDeg%10,4);
              //-----更新缓存,真正显示-----
              HT1621_Reflash(LCD_Buffer);
}
void LCD_Display2()
{
/*         if( IntDeg>=0)          LCD_ClearSeg(_LCD_1G);                //正温度,则清除负号
              else
              {
                      IntDeg=-IntDeg;                                                //负温度,则做绝对值处理
                      LCD_DisplaySeg(_LCD_1G);                //负温度,添加负号
              }   */

              //-----清除2位显示数字-----
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,3);
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,4);
              //-----拆分2位并显示数字-----
              LCD_DisplayDigit(IntDeg/10,3);
              LCD_DisplayDigit(IntDeg%10,4);
              //-----更新缓存,真正显示-----
              HT1621_Reflash(LCD_Buffer);
}
void LCD_Display3()
{
/*         if( IntDeg>=0)          LCD_ClearSeg(_LCD_1G);                //正温度,则清除负号
              else
              {
                      IntDeg=-IntDeg;                                                //负温度,则做绝对值处理
                      LCD_DisplaySeg(_LCD_1G);                //负温度,添加负号
              }   */

              //-----清除1位显示数字-----
              LCD_DisplayDigit(LCD_DIGIT_CLEAR,6);
              //-----显示数字-----
              LCD_DisplayDigit(IntDeg,6);
              //-----更新缓存,真正显示-----
              HT1621_Reflash(LCD_Buffer);
}
/******************************************************************************************************
* 名       称:ADC10_init(void)
* 功       能:初始化ADC10采集内部温度传感器,单次手动采样
* 入口参数:无
* 出口参数:无
* 说       明:直接从CCS的Example中移植过来
* 范       例:无
******************************************************************************************************/
void ADC10_init(void)
{
        ADC10CTL0 &= ~ENC;
        ADC10CTL0 = ADC10IE + ADC10ON  + ADC10SHT_0 + REFON + SREF_1 ;
    ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_0;
      __delay_cycles(30000);
    ADC10CTL0 |= ENC;
}
/******************************************************************************************************
* 名       称:ADC10_ISR_HOOK
* 功       能:ADC转换完成后唤醒CPU
* 入口参数:无
* 出口参数:无
* 说       明:直接从CCS的Example中移植过来
* 范       例:无
******************************************************************************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR_HOOK(void)
{
        _bic_SR_register_on_exit(LPM4_bits);
}

void LCD_Display_Pass()
{
        LCD_DisplayNum(8855);
        LCD_ClearSeg(_LCD_3C);
        LCD_ClearSeg(_LCD_3D);
        LCD_ClearSeg(_LCD_4D);
        //----显示logo----
        LCD_DisplaySeg(_LCD_TI_logo);
        LCD_DisplaySeg(_LCD_QDU_logo);
        HT1621_Reflash(LCD_Buffer);
}

void TCA6416A_LED(unsigned char num)
{
        unsigned char i = 0;
        for(i=0;i<8;i++)
        {
                if(i<num)                                        // 判断当前需要点亮几盏灯
                        PinOUT(i,0);                        //根据LED接法,IO低电平为点亮LED
                else
                        PinOUT(i,1);                        //根据LED接法,IO高电平为熄灭LED
        }
}

void I2C_IODect()                                         //检测事件确实发生了
{
        static unsigned char KEY_Now=0;
        unsigned char KEY_Past;
        KEY_Past=KEY_Now;
        //----判断I2C_IO10所连的KEY1按键是否被按下------
        if((TCA6416A_InputBuffer&BIT8) == BIT8)
                KEY_Now |=BIT0;
        else
                KEY_Now &=~BIT0;
        if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0)
                {
                LCD_Init1();
                flag=1;
                A=2000;
                }
        //----判断I2C_IO11所连的KEY2按键是否被按下------
        if((TCA6416A_InputBuffer&BIT9)== BIT9)
                KEY_Now |=BIT1;
        else
                KEY_Now &=~BIT1;
        if(((KEY_Past&BIT1)==BIT1)&&(KEY_Now&BIT1)!=BIT1)
        {
        LCD_Init2();
        flag=2;
        A=10;
        }
        //----判断I2C_IO12所连的KEY3按键是否被按下------
        if((TCA6416A_InputBuffer&BITA) == BITA)
                KEY_Now |=BIT2;
        else
                KEY_Now &=~BIT2;
        if(((KEY_Past&BIT2)==BIT2)&&(KEY_Now&BIT2) ==0)
        {
                LCD_Init3();
                flag=3;
                A=1;
        }
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
ienglgge
1楼-- · 2019-03-24 15:49
 精彩回答 2  元偷偷看……
YQ玖佰
2楼-- · 2019-03-24 20:38
< :TI_MSP430_内容页_SA7 -->
ienglgge 发表于 2017-7-11 13:52
你先写个简单程序,看看按键检测功能是否正常。I2C_IODect();   //主要是这句感觉老是被跳过,前后语句要能 ...

函数是可以进去的,没有被跳过,但是按键的选择没有效果,按死也不动....这是什么情况???
ienglgge
3楼-- · 2019-03-25 01:00
YQ玖佰 发表于 2017-7-11 14:26
函数是可以进去的,没有被跳过,但是按键的选择没有效果,按死也不动....这是什么情况???

单独写一个程序,别的先不管,看看能不能读按键,你拼凑的东西,初始化都不见得对。

一周热门 更多>

相关问题

    相关文章