|
求助,我写的一个MSP430的键盘程序,但是总是显示很诡异的东西
[复制链接]
本帖最后由 paulhyde 于 2014-9-15 08:58 编辑
/*源代码如下*/
#include
#include "Keypad.h"
#include "cry1602.h"
typedef unsigned char uchar;
typedef unsigned int uint;
uchar LCDX; //1602的列坐标
uchar LCDY; //1602的行坐标
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
InitKeypad();
InitLCD();
LCDX=0;
LCDY=0;
_EINT();
while(1)
{
;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Keypad(void)
{
uchar key;
key=CheckKey(); //检测按键值
switch(key)
{
case 0:
key='0';
break;
case 1:
key='1';
break;
case 2:
key='2';
break;
case 3:
key='3';
break;
case 5:
key='5';
break;
default:
key='4';
break;
}
Disp1Char(LCDX,LCDY,key);
LCDX++; //显示不覆盖
P1IFG=0X00;
}
/********************************************************************
问题的现象是:
我按了一个0键 有些时候1602既显示了0 又显示了5(即:显示完0后,default语句也执行了),按键1 2 3也一样
我感觉是按键消抖动时的延时问题,但是我不知道到底是延时多少合适,因为1602里面也有延时。
*/
unsigned char CheckKey(void) //检测按键程序
{
unsigned char temp=BIT0,i;
Delay15ms();
if((P1IN&0x0f)==0x0f)
return 5;
for(i=0;i<4;i++)
{
if((P1IN&temp)!=temp)
break;
temp<<=1;
}
return i;
}
void Delay15ms()
{
for(long i=0;i<12000;i++) /./消除抖动
{
;
}
}
|
|