要求開始時i2c擴展板上6個led按照:
led1和6亮3s,led2和5亮3s,LED3和4亮3s,最后led2和5亮3s,并按這個順序回圈,并要求lcd顯示倒計時
按下擴展板上按鍵key1,led3和6亮3s,并要求lcd顯示倒計時,然后回傳之前的狀態
按下key2,led1亮3s,并要求lcd顯示倒計時,然后回傳
按下key3,led4亮3s,并要求lcd顯示倒計時,然后回傳
程式:
#include"MSP430G2553.h"
#include"TCA6416A.h"
void I2C_IODect() ; //檢測事件確實發生了
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //關狗
BCSCTL1 = CALBC1_16MHZ; /* Set DCO to 8MHz */
DCOCTL = CALDCO_16MHZ;
TCA6416A_Init(); // 初始化IO擴展口
int i;
//----提示初始化成功----
while(1)
{
PinOUT(0,0); // led1亮
PinOUT(1,1); // led2滅
PinOUT(2,1); // led3滅
PinOUT(3,1); // led4滅
PinOUT(4,1); // led5滅
PinOUT(5,0); // led6亮
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{
IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
PinOUT(0,1); // led1滅
PinOUT(1,0); // led2亮
PinOUT(2,1); // led3滅
PinOUT(3,1); // led4滅
PinOUT(4,0); // led5亮
PinOUT(5,1); // led6滅
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{
IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
PinOUT(0,1); // led1滅
PinOUT(1,1); // led2滅
PinOUT(2,0); // led3亮
PinOUT(3,0); // led4亮
PinOUT(4,1); // led5滅
PinOUT(5,1); // led6滅
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{
IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
PinOUT(0,1); // led1滅
PinOUT(1,0); // led2亮
PinOUT(2,1); // led3滅
PinOUT(3,1); // led4滅
PinOUT(4,0); // led5亮
PinOUT(5,1); // led6滅
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{
IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
PinIN();
I2C_IODect();
_bis_SR_register(LPM0_bits);
}
}
/***********WDT定時中斷函式*************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
// PinIN();
// I2C_IODect();
__bic_SR_register_on_exit(LPM0_bits );
}
/**********I2C擴展IO中斷事件處理函式***************/
void I2C_IO10_Onclick()
{
int i;
static unsigned char turn = 1;
turn ^= BIT0;
PinOUT(0,1); // led1滅
PinOUT(1,1); // led2滅
PinOUT(2,0); // led3亮
PinOUT(3,1); // led4滅
PinOUT(4,1); // led5滅
PinOUT(5,0); // led6亮
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
}
void I2C_IO11_Onclick()
{
int i;
static unsigned char turn = 1;
turn ^= BIT0;
PinOUT(0,0); // led1亮
PinOUT(1,1); // led2滅
PinOUT(2,1); // led3滅
PinOUT(3,1); // led4滅
PinOUT(4,1); // led5滅
PinOUT(5,1); // led6滅
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
}
void I2C_IO12_Onclick()
{
int i;
static unsigned char turn = 1;
turn ^= BIT0;
PinOUT(0,1); // led1滅
PinOUT(1,1); // led2滅
PinOUT(2,1); // led3滅
PinOUT(3,0); // led4亮
PinOUT(4,1); // led5滅
PinOUT(5,1); // led6滅
WDTCTL=WDT_ADLY_1000; //-----設定WDT為-----------
for(i=0;i<3;i++)
{IFG1&=~WDTIFG;
while(!(IFG1&WDTIFG));
IFG1&=~WDTIFG;
}
IE1 |= WDTIE; //-----WDT中斷使能----------------------
}
void I2C_IODect() //檢測事件確實發生了
{
static unsigned char KEY_Past=0,KEY_Now=0;
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)
I2C_IO10_Onclick();
//----判斷I2C_IO11所連的KEY2按鍵是否被按下------
if((TCA6416A_InputBuffer&BIT9)== BIT9)
KEY_Now |=BIT1;
else
KEY_Now &=~BIT1;
if(((KEY_Past&BIT1)==BIT1)&&(KEY_Now&BIT1)!=BIT1)
I2C_IO11_Onclick();
//----判斷I2C_IO12所連的KEY3按鍵是否被按下------
if((TCA6416A_InputBuffer&BITA) == BITA)
KEY_Now |=BIT2;
else
KEY_Now &=~BIT2;
if(((KEY_Past&BIT2)==BIT2)&&(KEY_Now&BIT2) ==0)
{
I2C_IO12_Onclick();
}
}
目前實作了主回圈,但是不知道如何實作按鍵控制中斷并回傳和lcd顯示,跪求大佬幫助一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128098.html
標籤:單片機/工控
上一篇:請求洗掉我的資源 https://download.csdn.net/download/fcc2008/10748717 ,謝謝了
下一篇:單片機基礎K4報錯 怎么回事
