单片机键盘扫描 这个东西怎么写 我这个为啥不行 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--);
} 展开
#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--);
} 展开
展开全部
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:;
}
}
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:;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询