找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3210|回复: 4
收起左侧

求思路 利用单片机中断控制,根据按键次数,实现4个LED灯显示按键次数的二进制数

[复制链接]
ID:872767 发表于 2021-9-7 16:01 | 显示全部楼层 |阅读模式
利用中断控制,根据按键次数,实现4个LED灯显示按键次数的二进制数,选择任意连续的四个led灯进行显示(按下一次,4个led的状态为0001,即最后一个灯亮,按下二次,四个led灯状态0010,即倒数第二个灯亮。……按下第16次重复按下第1次的显示状态,依次类推。
回复

使用道具 举报

ID:624769 发表于 2021-9-11 17:27 | 显示全部楼层
4个灯,P10~P13的话, 变量temp 记录 按键次数, 然后,直接  P1 = temp; 不就好了? 没看看出有啥难的地方啊……
回复

使用道具 举报

ID:875095 发表于 2021-9-12 12:44 | 显示全部楼层
定义一个全局变量,比如说x,按一次按键进一次中断,x++;比如用的是51的P1.0~P1.3, 先清一下零,然后再把x赋给P1.
回复

使用道具 举报

ID:875095 发表于 2021-9-12 13:34 | 显示全部楼层
51试一下:
#include "reg52.h"
unsigned char x=1;
unsigned char i,j;
sbit NT0 = P3^2;
void delay_ms(unsigned char nms)
{
        for(i = nms;i>0;i--)
        {
                for(j = 110;j>0;j--);
        }
}
void main()
{
        EA = 1;
        EX0 = 1;
        P1 = 0xff;       
        while(1);
}

void ex0_interrupt() interrupt 0
{
                if(x<16)
        {
                P1 &= 0xF0;
                P1 |= ~x;
                if(NT0 == 0)
                {
                        delay_ms(10);
                        if(NT0 == 0)
                        {
                                x= x << 1;
                                while(NT0 == 0);
                        }
                }               
        }
        else x = 1;
}
回复

使用道具 举报

ID:161164 发表于 2021-9-12 16:13 | 显示全部楼层
  1. #include "reg51.h"

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535

  4. sbit P32 = P3^2;
  5. bit INT0_Flag;
  6. u8 delay_INT0;
  7. u8 LED;
  8. //External interrupt0 service routine
  9. void exint0() interrupt 0           //(location at 0003H)
  10. {
  11.         INT0_Flag = 1;
  12. }

  13. void main()
  14. {
  15.     IT0 = 1;                        //set INT0 int type (1:Falling 0:Low level)
  16.     EX0 = 1;                        //enable INT0 interrupt
  17.     EA = 1;                         //open global interrupt switch
  18.     while (1)
  19.                 {
  20.                         if(INT0_Flag)
  21.                         {
  22.                                 if(!P32)
  23.                                 {
  24.                                         if(delay_INT0<0xFF)delay_INT0++;
  25.                                         if(delay_INT0==250)
  26.                                         {
  27.                                                 LED++;
  28.                                         }
  29.                                 }else{
  30.                                                 delay_INT0 = 0;
  31.                                                 INT0_Flag = 0;
  32.                                 }
  33.                         }
  34.                         P1 = ~(LED & 0x0F);
  35.                 }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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