找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6778|回复: 6
收起左侧

51单片机单中断多按键的应用源程序

[复制链接]
ID:256970 发表于 2019-7-25 12:31 | 显示全部楼层 |阅读模式
    在单片机的按键编程中,有时会遇到一个问题,用多个按键来控制多个死循环,而程序一旦进入循环就跳不出来,此时会想到用中断,而普通单片机一般只有2个外部中断,stc系列的查了一下最多也只有5个外部中断,那要是超过5个按键怎么办?能不能只用一个中断口来判断多个按键呢,这样就不用那么多中断口了,答案是肯定的。经过查阅单片机按键方面的资料,自己自创了如下程序,分享给大家,希望能帮到需要的人。
//51单片机单中断多按键的应用
//应用于STC15W204S,其他单片机修改引脚同样适用
//下附程序中断按键主要部分
...
sbit key0=P5^5;//定义按键引脚
sbit key1=P3^2;
sbit key2=P3^6;
sbit key3=P3^7;
sbit key4=P1^0;
sbit key5=P1^1;
sbit key6=P1^2;
sbit key7=P1^3;
sbit zhd=P3^3;//定义中断1
...
void main()
{
    key0=key1=key2=key3=key4=key5=key6=key7=0;
    zhd=1;//初始化中断口需为高电平,将中断设置为下降沿即可
...
    while(1)
    {
        while(KT==0){...}//多个程序自循环
        while(KT==1){...}
        while(KT==2){...}
        while(KT==3){...}
        while(KT==4){...}
        while(KT==5){...}
        while(KT==6){...}
        while(KT==7){...}
    }
}
void EXINT_1() interrupt 2
{
    delay(10);
    if((P3&0x01)!=0x01)   
    {
    key0=key1=key2=key3=key4=key5=key6=key7=1;zhd=0;
    if((P5&0x20)!=0x20)KT=0;
    if((P3&0x04)!=0x04){KT=1;LED=0;}
    if((P3&0x40)!=0x40)KT=2;
    if((P3&0x80)!=0x80)KT=3;
    if((P1&0x01)!=0x01)KT=4;
    if((P1&0x02)!=0x02)KT=5;
    if((P1&0x04)!=0x04)KT=6;
    if((P1&0x08)!=0x08)KT=7;
    }
    key0=key1=key2=key3=key4=key5=key6=key7=0;zhd=1;
    while((P3&0x01)!=0x01);//等待按键松开,松手后执行对应主程序
}

以上的Word格式文档51黑下载地址:
51单片机单中断多按键的应用.doc (29 KB, 下载次数: 44)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:383374 发表于 2019-8-15 01:55 来自手机 | 显示全部楼层
还要有触发信号,不然单代码没用
回复

使用道具 举报

ID:282095 发表于 2019-8-15 11:10 | 显示全部楼层
没有触发电源信号的话 程序调不通啊
回复

使用道具 举报

ID:256970 发表于 2019-8-15 23:30 | 显示全部楼层
梦园心田 发表于 2019-8-15 01:55
还要有触发信号,不然单代码没用

不明白你说的意思,这个程序是按键触发中断的,不需要其他触发信号了,如果还需要其他触发信号,这个程序就没有什么意义了。估计你还没有完全看懂这段代码,大概说一下,一般按键是一端接按键引脚,一端接公共地,而使用这段代码按键不用接公共地,直接将接公共地的一端都接到单个中断口就行了,初始化中断口需为高电平,将中断设置为下降沿,按键引脚均设置为低电平,如此只要按键按下便能进入中断了,在中断内判断键值,主序程中执行对应循环程序。此段代码意在解决让多个独立按键具有中断功能,亲测有效!
回复

使用道具 举报

ID:385637 发表于 2019-8-16 09:54 | 显示全部楼层
这是个好方法,一个中断可以同时用好多按键,但就是有时要用到组合键功能怎么处理?
回复

使用道具 举报

ID:256970 发表于 2019-8-17 00:03 | 显示全部楼层
本帖最后由 蓝色海阳 于 2019-8-17 23:00 编辑
shenyuqiu 发表于 2019-8-16 09:54
这是个好方法,一个中断可以同时用好多按键,但就是有时要用到组合键功能怎么处理?

这个组合按键也很容易呀,看下这个位置的代码:
if((P1&0x01)!=0x01)KT=4;
if((P1&0x02)!=0x02)KT=5;
if((P1&0x04)!=0x04)KT=6;
if((P1&0x08)!=0x08)KT=7;
这是判断4、5、6、7键的键值,同时4567键均在P1端口,以此端口举例,在上边代码后加如下代码(其他不变):
if((P1&0x03)!=0x03)KT=11;//4、5键同时按下(1+2=3)
if((P1&0x07)!=0x07)KT=111;//4、5、6键同时按下(1+2+4=7)
if((P1&0x0F)!=0x0F)KT=1111;//4、5、6、7键同时按下(1+2+4+8=15即0F)
主程序中判断KT的值,执行程序就好
回复

使用道具 举报

ID:282095 发表于 2019-8-17 00:36 | 显示全部楼层
组合按键 独立按键 触摸按键
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表