?? test44x_key_int_time.c
字號:
#include "msp430x44x.h "
//-------------------------------------------------------------
//
//MSP-Test44x Demo lcd ,led dishplay the timer
//
// MSP430F449
// -----------------
// /|\| XIN|-
// | | | 74HC373(1)&(2)
// LCD --|RST XOUT|- -------------
// ---------- | | | |
// | COM0|<---|COM0 P3.1|------>|D0 |
// | . | . | . . | . | |
// | COM3|<---|COM3 P3.7|------>|D7 |
// | S0 |<---|S0 P4.0|------>| |
// | . | . | P4.1|------>| |
// | S14|<---|S14 P1.3|------>|INC |
// P1.2|------>|DEC |
// P1.1|------>|FUN |
// zhangchong
// Lierda, Inc
// February 2006.03
// Built with IAR Embedded Workbench Version: 3.40a
// ID: MSP430-TEST44X
// DATA:2005-7-12
// REV: 2.0A
// 程序功能:該程序是用F449的I/O(P1.1、P1.2、P1.3)中斷功能, 實現時鐘顯示(LED和LCD顯示)
// 和鍵盤(P1.1=FUN; P1.2=DEC; P1.3=INC)功能,鍵盤是采用I/O口中斷的方式。
// 硬件連接:在必須連接所有短接器,
// A、顯示部分,LCD顯示不受撥動開關的影響;LED顯示必須將撥動開關P1的第P3和P4腳撥到ON的位置。
// B、鍵盤部分,必須將撥動開關P_KEY的第P3、P4、P5腳撥到ON的位置。
//
//---------------------------------------------------------
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)
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer(void)
{
rtc(); //時鐘處理
display_rtc(); //時鐘LCD顯示
}
//------------------------------------------------------
// Timer_A interrupt service routine
//interrupt[TIMERA0_VECTOR] void Timer_A (void)
#pragma vector=TIMERA0_VECTOR
__interrupt 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) //如果有按鍵按下,設按鍵按下標志
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_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 + -