通过软件内部上拉电阻,
P3.0--P3.3为输出口,P3.4--P3.7为输入口上拉电阻
#include <msp430f5529.h>
unsigned int Keyscan(); //申明按键检测函数
unsigned int key; //设置的返回变量
unsigned int Keyscan() //按键检测函数
{
unsigned char key_ch;
unsigned char count, j;
P1OUT |= 0x00;
if((P3IN & 0xF0) == 0)
{
__delay_cycles(10000); //延时10ms
if((P3IN & 0xF0) == 0)
{
count = 0xFE;
while((count & 0xF0) != 0xF0);//等待按键抬起
{
P3OUT = count & 0x0F;
if((P3IN & 0xF0) == 0)
{
j = (P3IN & 0xF0)|0x0F;
key_ch = (j & count);
return key_ch;
}
else
{
count = (count << 1)|0x01;
}
}
}
return 0xFF;
}
return 0xFF;
}
char Getkey_num(char k)
{
char num;
switch(k)
{
case 0x77:
num = 0;
break;
case 0x7B:
num = 1;
break;
case 0x7D:
num = 2;
break;
case 0x7E:
num = 3;
break;
case 0xB7:
num = 4;
break;
case 0xBB:
num = 5;
break;
case 0xBD:
num = 6;
break;
case 0xBE:
num = 7;
break;
case 0xD7:
num = 8;
break;
case 0xDB:
num = 9;
break;
case 0xDD:
num = 10;
break;
case 0xDE:
num = 11;
break;
case 0xE7:
num = 12;
break;
case 0xEB:
num = 13;
break;
case 0xED:
num = 14;
break;
case 0xEE:
num = 15;
break;
default:
num = 122;
break;
}
return num;
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗
P1DIR |= BIT0; //配置P1.0为输出功能
P4DIR |= BIT7; //接LED1
P1OUT &= ~BIT0; //配置P4.7为输出功能
P4OUT &= ~BIT7; //接LED2
/*按键初始化*/
P3DIR &= ~(BIT4 + BIT5 + BIT6 + BIT7);
P3OUT |= (BIT4 + BIT5 + BIT6 + BIT7);
P3REN |= (BIT4 + BIT5 + BIT6 + BIT7); //设置为内部上拉
while(1)
{
key = Getkey_num(Keyscan()); //按键检测
if(key != 122)
{
P1OUT ^= BIT0;
__delay_cycles(1000000);
}
else
{
P4OUT ^= BIT7;
__delay_cycles(1000000);
}
}
}
代码如上,建立编译没问题,但是通过点击4X4按键,LED1(P1.0)没有点亮。
如有错误,请大佬们指出。
(是不是一定需要外部上拉电阻。)
望各位大佬指导一下,感激不尽
可以的话,能给出关键代码量。