51单片机如何使用独立按键第一次按的时候,程序执行,再次按的时候,

51单片机如何使用独立按键第一次按的时候,程序执行,再次按的时候,,第1张

while(1)

{

while(P1_0); // 等待按键按下。

while(!P1_0); // 等待按键松开。

while(P1_0)

{

// 如果没有按键按下,就执行程序。

}

while(!P1_0); // 等待按键松开。

}

51单片机接按键,按键一端接地,另一端与I/O引脚相连,按键按下为低电平,未按下为高电平。 思路正确,如果用P0口需要加上拉电阻(10k),其他端口可以 不加 上拉电阻, 现在的 STC 10、11、12、15系列单片机 都可以 不加 上拉电阻。 编程 时 只要用 检测 高低 电平 来判断是否 有 按键 按下 就可以了。

六个按键,你仅仅有六个返回值。

缺少一个“没有按键”的值。

----

//按键扫描函数返回键值

uchar keyscan()

{

if(P3!=0XFF) {

delay(10);

if(P3!=0XFF) {

switch(P3) {

case 0x7f:return 0;break;

case 0xbf:return 1;break;

case 0xdf:return 2;break;

case 0xef:return 3;break;

case 0xf7:return 4;break;

case 0xfb:return 5;break;

default: return 6;break; --在这里加上一个6,代表没有按键。

}

}

}

}

显示的时候,如果没有按键,就不要改变显示的状态,即可。

这是一个古老的问题,对于现在的单片机,其实不存在这个问题,但是讲解一下还是好的,只是希望兄弟能及时采纳,我做任务呢

这个要从微电子角度回答:

单片机的P2口是双向口,就是可以输入,输出,不需要先进行设置,而其他单片机则不然,比如AVR单片机,你想要输出数据,你先要把引脚设置成输出状态,再决定向输出寄存器写0还是1,从而达到输出低电平或者高电平,你想要读入数据,先要把引脚设置成输入状态,再让CPU读输入寄存器

而51单片机是双向口,所以只有一个P2寄存器,不存在P2的输出寄存器或者P2的输入寄存器,只有一个P2

那么,单片机复位的时候,P2的引脚是高电平,那么P2的寄存器是什么呢一定是0xFF吗

不一定,这里涉及两个概念,P2寄存器,P2引脚,所以,先要执行 P2 = 0xFF,这是把P2的寄存器设置成0xFF这时候,同时也是保证了P2寄存器与P2引脚的可靠联通,这样,再读取P2引脚的时候,P2寄存器就能保证与P2引脚一致了

如果没有这句,有可能P2的引脚虽然是高电平,但是没有与P2寄存器可靠联通,从而误判断,明明P2引脚全是高电平,P2的寄存器却有一个低电平在里面

当然,随着后续工艺的改进,这个问题在现在的51单片机上几乎不存在了

P1DIR &= ~BIT3 + BIT6; // 设置P13 为输入,P16为输出

改为:P1DIR &= ~BIT3;P1DIR |= BIT6;

中断:

#pragma vector=PORT1_VECTOR //中断服务程序:

__interrupt void p1int(void)

{

P1OUT ^=BIT6;

while(p1keyj());

delay_Nms(1);

P1IFG=0;

}

#include "reg51h"

//P0口外接6个LED,led1至led6

//sbit led1=P0^1;

//sbit led2=P0^2;

//sbit led3=P0^3;

//sbit led4=P0^4;

//sbit led5=P0^5;

//sbit led6=P0^6;

//定义7个按键key1至key7

sbit key1=P1^1;

sbit key2=P1^2;

sbit key3=P1^3;

sbit key4=P1^4;

sbit key5=P1^5;

sbit key6=P1^6;

sbit key7=P1^7;

unsigned char keyval; //全局变量,储存按键键值

void KeyScan(void);

void Timer0Init(void);

void delayms(unsigned char ms);

void delayms(unsigned int ms);

{

unsigned int i;

while(ms--)

for(i=0;i<600;i++);

}

void main(void)

while(1)

{

switch(keyval)

{

case 1: P0=0xfd; break; //led0亮

case 2: P0=0xfb; break;

case 3: P0=0xf7; break;

case 4: P0=0xfe; break;

case 5: P0=0xfd; break;

case 6: P0=0xfb; break; //led6亮

case 7: P0=0xff; break; //全部led熄灭

}

}

void Timer0Init(void) //每10ms进入中断一次

{

TMOD=0x01; //16位定时器模式

TH0=0xdb;

TL0=0xff;//定时10ms,赋初值

TR0=1; //启动定时器0

ET0=1; //开定时器0分支中断

EA=1; //开总中断

void Timer0ISR(void)interrupt 1 using 1 //定时中断,按键扫描获取键值

if((P1&0xfe)!=0xfe) //判断key1至key7是否有按键按下

{

delayms(20); //延时20ms,软件消抖

if(key1==0) keyval=1; //按键1按下

if(key2==0) keyval=2;

if(key3==0) keyval=3;

if(key4==0) keyval=4;

if(key5==0) keyval=5;

if(key6==0) keyval=6;

if(key7==0) keyval=7; //按键7按下

}

TH0=0xdb;

TL0=0xff;//定时10ms,重新赋值

}

以上就是关于51单片机如何使用独立按键第一次按的时候,程序执行,再次按的时候,全部的内容,包括:51单片机如何使用独立按键第一次按的时候,程序执行,再次按的时候,、单片机的独立按键、求助51单片机独立按键问题。写了个有关独立按键的程序,程序是为了实现数码管显示数字的,问题看补充。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10175438.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存