有三个初始化函数,希望可以通过按键选择其一,而后进行后续测试,但发现按键貌似总是被跳过,后面的程序也断掉了,是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;
}
}
此帖出自
小平头技术问答
函数是可以进去的,没有被跳过,但是按键的选择没有效果,按死也不动....这是什么情况???
单独写一个程序,别的先不管,看看能不能读按键,你拼凑的东西,初始化都不见得对。
一周热门 更多>