51单片机高低电平问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 20:28:08
程序中令P3.4为0,为什么我按下0键后P3.4变成高电平,而不是P3.0变成低电平呢,我像弄个4*4键盘,用的是扫描法,也就是说先令P3.4为低,加入0键按下后,那P3.0也就低了,然后通过判断P3的值来判断按键值,怎么回事呢,请达人指点
keysaomiao(void)
{
unsigned char k,j,v;
P3 = 0x0f;
// delay();
k = P3;
if(k!=0x0f)
{
delay();
j = P3;
if(k == j)
{
v = 0xef;
do
{
P3 = v;
if(v!=P3)
{
switch(P3)
{
case 0xee:{return 0;break;}
case 0xed:{return 4;break;}
case 0xeb:{return 8;break;}
case 0xe7:{return 12;break;}
case 0xde:{return 1;break;}
case 0xdd:{return 5;break;}
case 0xdb:{return 9;break;}
case 0xd7:{return 13;break;}
case 0xbe:{return 2;break;}
case 0xbd:{return 6;break;}
case 0xbb:{return 10;break;}
case 0xb7:{return 14;break;}
case 0x7e:{return 3;break;}
case 0x7d:{return 7;break;}
case 0x7b:{return 11;break;

给你个建议,把下拉电阻换成10K以下的,你现在的是47K吧!!

我这里有一个 是已经用PROTUES7.1 测试OK的
#include<reg51.h>
unsigned char code tab[4][4]={{'1','4','7','#'},
{'2','5','8','0'},
{'3','6','9','*'},
{'A','B','C','D'}}; //0到F的16个键植

void delay(unsigned char a)
{
unsigned char i;
while(a--)
for(i=100;i>0;i--)
;
}

char kbscan() //键盘扫描
{
unsigned char hang,lie;
if(P3!=0x0f)
delay(5);
if(P3!=0x0f)
{
switch(P3&0xf0)
{
case 0x10:hang=0;break;
case 0x20:hang=1;break;
case 0x40:hang=2;break;
case 0x80:hang=3;break;
}
P3=0xf0;
P3=0xf0;
switch(P3&0x0f)
{
case 1:lie=0;break;
case 2:l