
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单片机独立按键问题。写了个有关独立按键的程序,程序是为了实现数码管显示数字的,问题看补充。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)