📄 149_5.c
字号:
//*************************************
//* 149_5.C for LED Key_scan,process *
//* LPM3 LDT 2006/11/30 *
//*************************************
#include"msp430x14x.h"
const unsigned char NUM_LED[12]=
{0XDB,0X88,0X97,0X9D,0XCC,0X5D,0X5F,0X98,0XDF,0XDD,0X04,0X00};
// 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , - ,Dark //
const unsigned int Limit[10]=
{50,12,31,24,60,999,999,999,800,50};
unsigned int TaskData[10]={7,5,1,12,30,15,4,800,200,30};
unsigned char LED_BUF[3];
unsigned char LED_CTRL;
unsigned int RTC =0;
unsigned char wait_time=0;
unsigned char KEY_VALUE=0;
unsigned char KEY1_FLAG=0;
unsigned char KEY2_FLAG=0;
unsigned char KEY3_FLAG=0;
unsigned char LPM_FLAG=0;
unsigned char KeyValue;
unsigned char Tast=0;
unsigned char X=0;
unsigned char DelayCnt=0;
void Init_CLK(void)
{
unsigned char i;
BCSCTL1 = 0X00; //将寄存器的内容清零
//XT2振荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) ==0); // 如果OSCFault =1
BCSCTL1 &= ~(XT2OFF + XTS);//open XT2, LFTX2 select low frequency
BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCO Rsel=7(Freq=3200k/25摄氏度)
BCSCTL1 |= 0x07;
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
}
void Init_TimerB(void)
{
TBCTL = TBSSEL0 + TBCLR; // 选择ACLK,清除TAR
TBCCTL0 = CCIE; // TBCCR0 中断允许
TBCCR0 = 32768; // 时间间隔为 1 s
TBCTL |= MC0; // 增记数模式
}
void Init_WDT(void)
{
WDTCTL=WDT_ADLY_1000;
IE1=WDTIE;
}
void Init_InputPort(void)
{
P1DIR=0; //P1输入
P1SEL=0;
P1IE=0X00; //P1不允许中断
P1IES=0X00; // 上升沿触发
P1IFG=0;
}
void Init_DispPort(void)
{
P4DIR=0;
P4SEL=0;
P5DIR=0;
P5SEL=0;
P4DIR=0xff;
P5DIR=0xff;
char i;
LED_CTRL=0;
for(i=0;i<3;i++)
{
LED_BUF[i]=0;
}
}
void delay(unsigned int i)
{
while(i!=0)
i--;
}
void KeyProcess(void)
{
char i;
KeyValue=P1IN&0XE0;
delay(100);
if(KeyValue!=(P1IN&0XE0))
{
KeyValue=0XE0;
}
switch (KeyValue)
{
case 0XE0: //No key press
DelayCnt=0;
break;
case 0X60: // bit7 press;Function Select
wait_time=0;
KEY2_FLAG=0;
KEY3_FLAG=0;
if ((KEY1_FLAG==1)&(DelayCnt==0))
{
Tast++;
if(Tast>9) Tast=0;
}
DelayCnt++;
KEY1_FLAG=1;
LED_BUF[0]=10;
LED_BUF[2]=10;
LED_BUF[1]=Tast;
break;
case 0XA0: // bit6 press;INC
wait_time=0;
KEY1_FLAG=0;
KEY3_FLAG=0;
if ((KEY2_FLAG==1)&(DelayCnt==0))
{
TaskData[Tast]++;
DelayCnt=0;
if (TaskData[Tast]>Limit[Tast])
TaskData[Tast]=0;
}
DelayCnt++;
X=TaskData[Tast];
KEY2_FLAG=1;
for (i=0;i<3;i++)
{
LED_BUF[i]=X%10;
X/=10;
}
break;
case 0XC0: // bit5 press;DEC
wait_time=0;
KEY2_FLAG=0;
KEY1_FLAG=0;
if ((KEY3_FLAG==1)&(DelayCnt==0))
{
TaskData[Tast]--;
if (TaskData[Tast]==0)
TaskData[Tast]=Limit[Tast];
}
DelayCnt++;
X=TaskData[Tast];
KEY3_FLAG=1;
for (i=0;i<3;i++)
{
LED_BUF[i]=X%10;
X/=10;
}
}
}
void LED_DISPLAY()
{
unsigned tmp;
tmp=0x01;
P4OUT=0;
P5OUT=NUM_LED[LED_BUF[LED_CTRL]];
P4OUT=tmp<<LED_CTRL;
LED_CTRL=(LED_CTRL+1)%3;
}
void DISP_OFF()
{
P4OUT=0;
P5OUT=0;
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
_DINT();
Init_InputPort();
Init_DispPort();
Init_CLK();
Init_WDT();
Init_TimerB();
_EINT();
for(;;)
{
KeyProcess();
LED_DISPLAY();
delay(800);
}
}
// TimerB interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void timerB_ISR(void)
{
RTC++;
}
// PORT1 interrupt service routine//
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
P1IE=0X00; //P1不允许中断
P1IFG=0;
Init_WDT();
LPM_FLAG=0;
wait_time=0;
_BIC_SR_IRQ(LPM3_bits); //退出LPM3_model
}
// WDT interrupt service routine//
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
wait_time++;
if(wait_time>=10)
{
wait_time=0;
DISP_OFF();
LPM_FLAG=1;
WDTCTL=WDTPW+WDTHOLD; //WDT 关闭
P1IE=0XE0; //P1允许中断
_BIS_SR(LPM3_bits+GIE); //Enter the LPM3 model interrupt_EN
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -