帮忙看下这个矩阵键盘程序错在那里!
#ifndef HL_KEY#define HL_KEY
#include "msp430f5525.h"
#define uchar unsigned char
uchar key_vol;
uchar key_map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uchar check_KEY() //检查是否有键按下
{
P1DIR=0Xf0; //定义PI.0~3为输入,P1.4~7为输出模式
uchar row,col,temp1,temp2;
temp1=0x80;
for(row=0;row<4;row++)
{
P1OUT-=0x0f;
P1OUT-=temp1;
temp1>>=1;
if(P1IN&0X0f<0X0f)
{
temp2=0x08;
for(col=0;col<4;col++)
{
if((P1IN&temp2)==0x00)
{
key_vol=key_map;
}
temp2>>=1;
}
}
else
key_vol=key_map;
}
return(key_vol);
}
void DelayMs(uchar a) //1ms延时函数
{
int i;
for(i = a;i>0;i--)
__delay_cycles(1000);
}
#endif 看你程序是线翻转法检测按键,但是你这样貌似仅能得到按键所在的列并不能得到按键所在的行。不过你程序中还有两句没看懂,我再推敲一下啊 longwu537 发表于 2013-3-29 23:23 static/image/common/back.gif
看你程序是线翻转法检测按键,但是你这样貌似仅能得到按键所在的列并不能得到按键所在的行。不过你程序中还 ...
我写的是能检测出每个按键的 那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
P1OUT-=temp1;这两句也没看到消抖 longwu537 发表于 2013-3-29 23:48 static/image/common/back.gif
那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
P1OUT-=temp1;这两句也没看到消抖 ...
这里写错了,现在改成这样了,但还是有问题#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"
#define uchar unsigned char
uchar key_vol;
uchar key_map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uchar check_KEY() //检查是否有键按下
{
P1DIR=0Xf0; //定义PI.0~3为输入,P1.4~7为输出模式
//P1OUT=0X00;
uchar row,col,temp1,temp2;
P1OUT-=0x0f;
if(P1OUT||0X00)
{
temp1=0x80;
for(row=0;row<4;row++)
{
// P1OUT-=0x0f;
if(P1OUT&temp1!=0)
{
// P1OUT&=temp1;
// temp1>>=1;
if(P1IN&0X0f<0X0f)
temp2=0x08;
for(col=0;col<4;col++)
{
if((P1IN&temp2)==0x00)
{
key_vol=key_map;
}
temp2>>=1;
}
}
temp1>>=1;
}
// else
// key_vol=key_map;
}
else
key_vol=key_map;
return(key_vol);
}
void DelayMs(uchar a) //1ms延时函数
{
int i;
for(i = a;i>0;i--)
__delay_cycles(1000);
}
#endif longwu537 发表于 2013-3-29 23:48 static/image/common/back.gif
那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
P1OUT-=temp1;这两句也没看到消抖 ...
你再看看这这个程序#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"
#define uchar unsigned char
uchar key_vol;
uchar key_map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
void DelayMs(uchar a) //1ms延时函数
{
int i;
for(i = a;i>0;i--)
__delay_cycles(1000);
}
uchar check_KEY() //检查是否有键按下
{
P1DIR=0Xf0; //定义PI.0~3为输入,P1.4~7为输出模式
//P1OUT=0X00;
uchar row,col,temp1,temp2;
P1OUT-=0x0f;
if(P1OUT||0X00)
{
DelayMs(20);
if(P1OUT||0X00)
{
temp1=0x80;
for(row=0;row<4;row++)
{
// P1OUT-=0x0f;
if(P1OUT&temp1!=0)
{
// P1OUT&=temp1;
// temp1>>=1;
if(P1IN&0X0f<0X0f)
{
temp2=0x08;
for(col=0;col<4;col++)
{
if((P1IN&temp2)==0x00)
{
key_vol=key_map;
}
temp2>>=1;
}
}
}
temp1>>=1;
}
// else
// key_vol=key_map;
}
}
else
key_vol=key_map;
return(key_vol);
}
#endif 慢慢懂 发表于 2013-3-30 00:46
你再看看这这个程序#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"
感觉程序写的离谱了。完全不知道你想表达什么意思了,你说有错是什么形式的错误?具体表现是什么?你描述清楚了,才更方便找到问题。 按键没反应 线翻转法是先高四位输出低四位输入,扫描一遍后交换,再扫描一次,然后综合两次结果得出按键号。你只做了一半,看你的程序你按第四行第四列的按键可能会有反应 那我还是分两步来写按键吧
页:
[1]