单片机键盘扫描 这个东西怎么写 我这个为啥不行 P3=0xfd; temp=P3;temp=temp&0xf0;不大明白

P3这个怎么用按下键后P3的值就变化?望高手讲下原理听了半天课没明白#include<reg52.h>#defineuintunsignedint#defineuchar... P3这个怎么用 按下键后P3的值就变化?望高手讲下原理 听了半天课没明白

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0xff};
uchar temp;
uint num;

void delay(uint);
void main()
{
dula=1;
P0=0;
dula=0;

wela=1;
P0=0xfe;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
}
dula=1;
P0=table[num];
dula=0;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0xcd:num=8;break;
}
dula=1;
P0=table[num];
dula=0;
}
}
P3=0xf9;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;break;
case 0xdb:num=10;break;
case 0xbb:num=11;break;
case 0xcb:num=12;break;
}
dula=1;
P0=table[num];
dula=0;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;break;
case 0xd7:num=14;break;
case 0xb7:num=15;break;
case 0xc7:num=16;break;
}
dula=1;
P0=table[num];
dula=0;
}
}
}
}
void delay(uint z)
{
uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;y--);
}
展开
 我来答
610615623
推荐于2017-11-24 · TA获得超过709个赞
知道小有建树答主
回答量:210
采纳率:0%
帮助的人:256万
展开全部
P3口是IO口,假设先让P3=0xff,然后你通过某种方式让单片机的P3的其中一个IO接地,然后再移开地,那么那个刚开始的低电平不会变为高电平,还是为低电频,原理就是这样。例如P1.1=1,P1.2=0,这时你把P1.1和P1.2连一起,P1.1就变成0了,移开P1.2也不会是高电平,除非软件从新置一。你的三个语句问题temp=P3,假设P3=0xf2,那么temp就=0xf2;
temp=temp&0xf0;意思是两个相与,例如temp=0x0f,temp=temp&0xf0之后temp=0x00;例如temp=0xee,temp=temp&0xf0之后temp=0xe0;而对于P3=fd,因为P3有八个IO输出1和0,你把2进制换成16进制就是P3=0x多少。例如:P3=0xfe,则P3.7输出为0,其他为1.
另外给你一个我编的简单程序,有些别人编写的程序有些过于冗长与繁琐,不方便学习。自己编写能比较懂。
程序功能,你最多能按下11个数,这些数被存入数组,当你按下确定按钮时,这些数就被P0口以8个灯泡连续显示。按下删除键,则可从新输入上一个数。输入时,每按下一个键,P1.7的灯泡会量一次,告诉你输入成功了。如果你的开发板P3是键盘,P1有灯,那么你可以复制粘贴试试我的程序。具体哪个是确定,哪个是取消,你试试就知道。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delayms(uint s);
void cc();
uint tel_while,tel_switch;
uint num=0;
uchar Tel[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

main()
{
tel_while=1;

while(tel_while)
{ P3=0xFE;tel_switch=P3;cc();
P3=0xFD;tel_switch=P3;cc();
P3=0xFB;tel_switch=P3;cc();
P3=0xF7;tel_switch=P3;cc();

}
for(num=0;num<11;num++)
{
P0=Tel[num];
delayms(300);
}

}
void delayms(uint s)
{ uint a,b;
for(a=s;a>0;a--){for(b=1200;b>0;b--);}
}

void cc()
{

switch(tel_switch)
{

case 0xEE:Tel[num]=0x31;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0xED:Tel[num]=0x32;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0xEB:Tel[num]=0x33;P1=0xFE;num++;delayms(200);P1=0xff;break;

case 0xDE:Tel[num]=0x34;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0xDD:Tel[num]=0x35;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0xDB:Tel[num]=0x36;P1=0xFE;num++;delayms(200);P1=0xff;break;

case 0xBE:Tel[num]=0x37;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0xBD:Tel[num]=0x38;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0xBB:Tel[num]=0x39;P1=0xFE;num++;delayms(200);P1=0xff;break;

case 0x7E:tel_while=0;delayms(200);break;
case 0x7D:Tel[num]=0x30;P1=0xFE;num++;delayms(200);P1=0xff;break;
case 0x7B:num--;P1=0xFE;delayms(200);P1=0x00;break;
default:;
}

}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式