江湖救急!
在430F5529单片机上做一个外设矩阵键盘,搞了俩天了,希望有大神能帮我,下面时电路图和代码。代码:
#include <msp430.h>
#define key1 (P1IN&BIT5)
#define key2 (P1IN&BIT4)
#define key3 (P1IN&BIT3)
#define key4 (P1IN&BIT2)
int keyValue,column;
void twoKeyScan(void)
{
//扫描第一列
column = 1;
P4OUT &= ~BIT0;
P4OUT |= BIT3; //给第一列开关的一侧置高电平
_delay_cycles(20000);
//扫描第二列
column = 2;
P4OUT &= ~BIT3;
P4OUT |= BIT0;
_delay_cycles(20000);
}
void InitIO(void)
{
P1DIR |= BIT0; //Set P1.0 to output direction
P1OUT &= ~BIT0; //Set P1.0 low level
P1REN |= BIT2 + BIT3 + BIT4 + BIT5;
P1OUT &= ~(BIT2 + BIT3 + BIT4 + BIT5);
P4DIR |= BIT7 + BIT0 + BIT3; //Set P4.7 to output direction
P4OUT &= ~BIT7; //Set P4.7 low level
P1IES &= ~(BIT2 + BIT3 + BIT4 + BIT5);
P1IFG = 0;
P1IE |= BIT2 + BIT3 +BIT4 + BIT5;
P1IFG = 0;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer
InitIO();
while(1) //Waiting Interrupt response
{
twoKeyScan(); //Call function
}
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(column == 1)
{
if(key1)
{
_delay_cycles(20000);
if(key1)
{
keyValue = 1;
P1OUT |= BIT0;
}
}
else if(key2)
{
_delay_cycles(20000);
if(key2)
{
keyValue = 4;
P1OUT &= ~BIT0;
}
}
}
if(column == 2)
{
if(key1)
{
_delay_cycles(20000);
if(key1)
{
P4OUT |= BIT7;
keyValue = 2;
}
}
else if(key2)
{
_delay_cycles(20000);
if(key2)
{
P4OUT &= ~BIT7;
keyValue = 5;
}
}
}
P1IFG = 0;
}