找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5021|回复: 9
打印 上一主题 下一主题
收起左侧

请教一个问题:51单片机用外部中断通过矩阵按键控制led的亮灭

[复制链接]
跳转到指定楼层
楼主
请教一个问题:51单片机用外部中断通过矩阵按键控制led的亮灭。想要达到目的:每一次按键被触发,LED的状态翻转一次。
单片机电路图如下:

我自己写的程序如下:下载后单片机的效果是按下按键led小灯点亮,一直保持着点亮的状态。请问怎样修改或者怎样优化程序?让它变成每按一次,led的状态翻转一次。

#include <reg52.h>
sbit LED = P0^0;
sbit wai = P3^2;
sbit key = P2^7;


void main(void)
{
        int i;
        P2 = 0XF7;        //矩阵按键变为独立按键
        P0 = 0x00;        //熄灭led
        IT0 = 1;                //下降沿触发
        EX0 = 1;                //开启INT0中断
        EA = 1;                        //开启总中断        
        if(key == 0)
        {
                for(i=0;i<1000;i++);      //按键消抖
                if(key==0)
                {
               
                        wai = 0;                //令P3^2引脚电平为0,下降沿出发外部中断
                        while(1);
                          
                }
          }
         
}


void int0_process() interrupt 0
{        
        unsigned int i;
        if(key == 0)
        {
        for(i=0;i<1000;i++);
        LED = ~LED;                        
        }
        key = 0;
}



%DMS%3`NF_JA[FLQ0JV(`OV.png (64.48 KB, 下载次数: 54)

%DMS%3`NF_JA[FLQ0JV(`OV.png

C5$EXTE~AEARDAK]4BN50PP.png (202.55 KB, 下载次数: 59)

C5$EXTE~AEARDAK]4BN50PP.png

BYN31J)G6$0KQ][RD(0V}4B.png (40.94 KB, 下载次数: 29)

BYN31J)G6$0KQ][RD(0V}4B.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2020-6-26 07:49 | 只看该作者
中断函数内多余代码去掉,保留LED取反试看,按键代码无限循环去掉。
回复

使用道具 举报

板凳
ID:332444 发表于 2020-6-26 07:55 | 只看该作者
按键代码要包含在无限循环中,不是无限循环被按键代码包含。
回复

使用道具 举报

地板
ID:332444 发表于 2020-6-26 09:12 | 只看该作者
  1. #include <reg52.h>
  2. sbit LED = P0^0;
  3. sbit wai = P3^2;
  4. sbit key = P1^7;
  5. void main()
  6. {
  7.         int i;
  8.         P1 = 0XF7;        //矩阵按键变为独立按键
  9.         P0 = 0x00;        //熄灭led
  10.         IT0 = 1;                //下降沿触发
  11.         EX0 = 1;                //开启INT0中断
  12.         EA = 1;                        //开启总中断  

  13.         while(1)
  14.         {
  15.         if(key == 0)
  16.         {
  17.                 for(i=0;i<1000;i++);      //按键消抖
  18.                 if(key==0)wai = 0;                //令P3^2引脚电平为0,下降沿出发外部中断
  19.                                 }
  20.         wai = 1;
  21.         }
  22. }
  23. void int0_process() interrupt 0
  24. {        
  25.         unsigned int i;
  26.         for(i=0;i<1000;i++);
  27.         LED = ~LED;                        
  28. }
复制代码
回复

使用道具 举报

5#
ID:332444 发表于 2020-6-26 09:16 | 只看该作者
代码按我的电路修改了,仅供参考。
回复

使用道具 举报

6#
ID:789846 发表于 2020-6-26 12:25 | 只看该作者
xianfajushi 发表于 2020-6-26 09:16
代码按我的电路修改了,仅供参考。

可以了,现在明白了,谢谢你
回复

使用道具 举报

7#
ID:789846 发表于 2020-6-26 12:34 | 只看该作者

感谢你了,我一直困在循环这里搞不明白,自己摸索了两天都搞不明白,现在懂了,看了代码后恍然大悟
回复

使用道具 举报

8#
ID:789846 发表于 2020-6-26 12:36 | 只看该作者
void int0_process() interrupt 0
{        
        unsigned int i;
        for(i=0;i<1000;i++);
        LED = ~LED;
                     
}
回复

使用道具 举报

9#
ID:1064915 发表于 2023-3-9 17:30 | 只看该作者
for(i=0;i<1000;i++);
延时时间怎么计算?
回复

使用道具 举报

10#
ID:332444 发表于 2023-3-9 21:10 | 只看该作者
15818463972 发表于 2020-6-26 12:34
感谢你了,我一直困在循环这里搞不明白,自己摸索了两天都搞不明白,现在懂了,看了代码后恍然大悟

不过不管如何都不建议在中断里面使用循环,为了说明问题,勉强修改,中断里面可以使用变量累加判断。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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