找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 5081|回复: 9
收起左侧

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

[复制链接]
ID:789846 发表于 2020-6-25 23:03 | 显示全部楼层 |阅读模式
请教一个问题: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
C5$EXTE~AEARDAK]4BN50PP.png
BYN31J)G6$0KQ][RD(0V}4B.png
回复

举报

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. }
复制代码
回复

举报

ID:332444 发表于 2020-6-26 09:16 | 显示全部楼层
代码按我的电路修改了,仅供参考。
回复

举报

ID:789846 发表于 2020-6-26 12:25 | 显示全部楼层
xianfajushi 发表于 2020-6-26 09:16
代码按我的电路修改了,仅供参考。

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

举报

ID:789846 发表于 2020-6-26 12:34 | 显示全部楼层

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

举报

ID:789846 发表于 2020-6-26 12:36 | 显示全部楼层
void int0_process() interrupt 0
{        
        unsigned int i;
        for(i=0;i<1000;i++);
        LED = ~LED;
                     
}
回复

举报

ID:1064915 发表于 2023-3-9 17:30 | 显示全部楼层
for(i=0;i<1000;i++);
延时时间怎么计算?
回复

举报

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

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

举报

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

本版积分规则

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

Powered by 单片机教程网

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