⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test44x_key_int_time.c

📁 AQ430 C Code,支持LSD-TEST430F44X
💻 C
字号:
#include  "msp430x44x.h " 

//---------------------------------------------------------
static  unsigned char sec;            //秒寄存器
static  unsigned char min;            //分寄存器
static  unsigned char hour;           //小时寄存器
static  unsigned char led_disp_bit=0x40;//LED显示位寄存器
static  unsigned char fun_buffer;     //功能键缓存
static  unsigned char key_flag;       //按键标志
        unsigned char key_temp;       //按键时间累加
//----------------------------------------------------------
#define key_inc    0x08               //INC键定义
#define key_dec    0x04               //DEC键定义
#define key_fun    0x02               //FUN键定义
const   unsigned char lcd_table[12]={ 
0x7b,       //*"0"*//
0x12,       //*"1"*//
0x4f,       //*"2"*//
0x1f,       //*"3"*//                 //LCD显示代码表
0x36,       //*"4"*//
0x3d,       //*"5"*//
0x7d,       //*"6"*//
0x13,       //*"7"*//
0x7f,       //*"8"*//
0x3f,       //*"9"*//
0x00,       //*"no"*//
0x00,       //*"no"*//
};
const   unsigned char led_table[12]={
0xd7,       //*"0"*//
0x14,       //*"1"*//
0xcd,       //*"2"*//
0x5d,       //*"3"*//                //LED显示代码
0x1e,       //*"4"*//
0x5b,       //*"5"*//
0xdb,       //*"6"*//
0x15,       //*"7"*//
0xdf,       //*"8"*//
0x5f,       //*"9"*//
0x00,       //*"no"*//
0x00,       //*"no"*//
};

void rtc(void);             
void display_rtc(void);
void display_dec(unsigned char  i,unsigned char  j);
void led_display(unsigned char i);
void inc(void);
void dec(void);
void fun(void);
//-------------------------------------------------------------
//---------------主程序----------------------------------------
//-------------------------------------------------------------
void main(void)
{  
    int i;
    WDTCTL = WDTPW + WDTHOLD;
    BTCTL=BTSSEL+BT_ADLY_500+BTFRFQ1;        //BT 0.5S中断
    IE2|=BTIE;
    P5SEL=0xfc;
    LCDCTL=LCDON+LCD4MUX+LCDP2;              //LCD模块初始化
    P1DIR&=~key_inc+key_dec+key_fun;         //端口1初始化
    P1IES=key_inc+key_dec+key_fun;
    P1IE=key_inc+key_dec+key_fun;
    P3DIR=0xff;                              //端口3初始化
    P4DIR=0x03;                              //端口4初始化
    P3OUT=0x00;                              //LED清屏
    P4OUT|=0x02;
    P4OUT&=~0x02;
    P3OUT=0xff;
    P4OUT|=0x01;
    P4OUT&=~0x01;
    TACTL=TASSEL0+TACLR;                     //Timer_a 3ms中断
    CCTL0=CCIE;
    CCR0=90;
    TACTL|=MC0;
    for (i=0; i<8; ++i)                      //LCD 清屏 
    LCDMEM[i] = 0x00;
    _EINT();                                 //允许中断
//*mainloop*//
    for(;;)
    {
       _BIS_SR(LPM3_bits);                   //进入低功耗模式3
       _NOP();
//key value//                                //按键处理程序
       _EINT();
    switch (P1IN&0x0e)
        {
        case 6:inc();break;
        case 10:dec();break;
        case 12:fun();
        }     
    }
}   
    
//------------------------------------------------------
// Basic Timer interrupt service routine
interrupt[BASICTIMER_VECTOR] void basic_timer(void)
{
    rtc();                                   //时钟处理
    display_rtc();                           //时钟LCD显示
} 
//------------------------------------------------------
//  Timer_A interrupt service routine
interrupt[TIMERA0_VECTOR] void Timer_A (void)
{
  if(key_flag)         
    {
    if (key_flag==8)
        {
        key_flag=0x00;
         if(0x0e!=(P1IN&0x0e))                  
           _BIC_SR_IRQ(LPM3_bits);      //延时,键盘去抖动,确认按键的有效性,有效,退出低功耗,按键处理
        }     
    else
    key_flag++;
    }     
  led_disp_bit=led_disp_bit>0x01?led_disp_bit>>1:0x40;   //LED显示处理
  switch(led_disp_bit)                 //选择led的刷新位//3ms刷新一位
    {
    case 1:if(sec&0x01&&fun_buffer==1)          //选择是否抖动,如果需要抖动,相应的LED位为0,
           led_display(0x00);                   //如果不需要抖动,则正常显示
           else
           led_display(led_table[hour/10]);break; 
    case 2:if(sec&0x01&&fun_buffer==1)
           led_display(0x00);
           else
           led_display(led_table[hour%10]+0x20);break;
    case 4:if(sec&0x01&&fun_buffer==2)
           led_display(0x00);
           else
           led_display(led_table[min/10]);break;
    case 8:if(sec&0x01&&fun_buffer==2)
           led_display(0x00);
           else
           led_display(led_table[min%10]+0x20);break;
    case 16:if(sec&0x01&&fun_buffer==3)
           led_display(0x00);
           else
           led_display(led_table[(sec>>1)/10]);break;
    case 32:if(sec&0x01&&fun_buffer==3)
           led_display(0x00);
           else
           led_display(led_table[(sec>>1)%10]);
    }    
}
//------------------------------------------------------
//PORT_1 interrupt service routine
interrupt[PORT1_VECTOR] void Port_1(void)        //如果有按键按下,设按键按下标志
{
key_flag|=0x01;
P1IFG=0x00;
}

//-------------------------------------------------------
//-------时钟处理程序------------------------------------
//-------------------------------------------------------
void  rtc (void)                                
{ 
  if (++sec < 120)
    return;
  sec = 0;
  if (++min < 60)
    return;
  min = 0;
  if (++hour < 24)
    return;
  hour = 0; 
} 
//--------------------------------------------------------
//--------时钟LCD显示程序---------------------------------
//--------------------------------------------------------
void display_rtc(void)
{ int i;
  i=sec;
  i=i>>1;
  display_dec(0,i);
  i=min;
  display_dec(2,i);
  i=hour;
  display_dec(4,i); 
  LCDMEM[6]=0x00;  
}
//--------------------------------------------------------
//--------LCD显示处理程序---------------------------------
//--------------------------------------------------------
void display_dec(unsigned char  i,unsigned char  j)
{
 LCDMEM[i]=lcd_table[j%10]+0x80;
 LCDMEM[i+1]=lcd_table[j/10];
}
//--------------------------------------------------------
//-------LED 1位显示程序----------------------------------
//-------I 为显示代码值-----------------------------------
void led_display(unsigned char i)
{
P3OUT=i;
P4OUT=0x02;
P4OUT&=~0x02;
P3OUT=~led_disp_bit;
P4OUT=0x01;
P4OUT&=~0x01;
P3OUT=0x00;
}
//--------------------------------------------------------
//-------INC 按键处理程序---------------------------------
//--------------------------------------------------------
void inc (void)
{
  switch (fun_buffer)
  {
  case 0:break;
  case 3:sec+=2;goto rtc_inc;
  case 2: min+=1;goto rtc_inc;
  case 1: hour+=1;
  rtc_inc:
  if (sec >119)
  sec = sec-120;
  if (min >59)
  min = min-60;
  if (hour > 23)
  hour = hour-24; 
  }
}

//---------------------------------------------------------
//--------DEC 按键处理程序---------------------------------
//---------------------------------------------------------
void dec(void)
{
  switch (fun_buffer)
  {
  case 0:break;
  case 3:sec-=2;goto rtc_dec;
  case 2:min-=1;goto rtc_dec;
  case 1:hour-=1;
  rtc_dec:
  if(sec>119)
     sec=256-137;
  if(min>59)
     min=256-197;
  if(hour>23)
     hour=256-233;
  }
}
//---------------------------------------------------------
//-------FUN 按键处理程序----------------------------------
//---------------------------------------------------------
void fun(void)
{
  if(fun_buffer<3)
  fun_buffer++;
  else
  fun_buffer=0x00;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -