📄 test44x_key_int_time.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 + -