#include<reg52.h>
#include<absacc.h>
void my_delay10nms(unsigned int n)
{
unsigned i,j;
while(n --)
{
for(i = 128;i > 0;i --)
for(j = 10;j > 0;j --);
}
}
void main(void)
{
unsigned char key_h,key_v,key_tmp,key_val,last_key_val;
while(1)
{
key_val = 0;
for(key_h = 4;key_h < 8;key_h ++)
{
P0 = (1 << key_h);//对应行拉高
P0 |= 0xf0;
key_tmp = P0 & 0xf0;
if(key_tmp)//有按键按下
{
for(key_v = 4;key_v < 8;key_v ++)
{
if(key_tmp & (1 << key_v))//第key_v位为1
{
key_val = (key_h - 4) * 4 + (key_v - 4) + 1;
break;
}
}
}
if(key_val) break;
}
if(last_key_val != key_val)
{
last_key_val = key_val;
}
else
{
if(last_key_val)//有按键被可靠按下
{
P0 = key_val;
}
}
my_delay10nms(1);
}
}
这个是接了下拉电阻的!矩阵按键是能够实现的!
#include<reg52.h>
#include<absacc.h>
void my_delay10nms(unsigned int n)
{
unsigned i,j;
while(n --)
{
for(i = 128;i > 0;i --)
for(j = 10;j > 0;j --);
}
}
void main(void)
{
unsigned char key_h,key_v,key_tmp,key_val,last_key_val;
while(1)
{
key_val = 0;
for(key_h = 0;key_h < 4;key_h ++)
{
P1 &= ~(key_h<<1);//对应行拉低
P1 |= 0xf0;
key_tmp = P1 & 0xf0;
if(key_tmp)//有按键按下
{
for(key_v = 4;key_v < 8;key_v ++)
{
if(key_tmp & (~(1<<key_v)))//第key_v位为1
{
key_val = (key_h - 4) * 4 + (key_v - 4) + 1;
break;
}
}
}
if(key_val) break;
}
if(last_key_val != key_val)
{
last_key_val = key_val;
}
else
{
if(last_key_val)//有按键被可靠按下
{
P0 = key_val;
}
}
my_delay10nms(1);
}
}
这个是没有接下拉电阻的,那么这个程序为什么不行呢!
由于没接电阻,但是51单片机就有上拉的作用,所以处在空闲的时候为1的,那么我用P1 &= ~(key_h<<1);//对应行拉低,但是我感觉下面的程序应该是对的,为什么不对呢?请大虾指点啊 |