找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机程序 按下按键触发变换模式问题

查看数: 2142 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-5-29 09:38

正文摘要:

如图,一个按键接P3.2中断口,一排LED接P1口 要求每一下按键,LED循环切换流水灯和全闪灯模式 问题来了,我用外部中断的模式,希望按下按键后,马上就切换模式 实际上,却总要执行完一个子程序才会改变,不知道代 ...

回复

ID:647261 发表于 2023-5-29 17:22
wulin 发表于 2023-5-29 13:58
把各种花样流水灯用数组排列好,按下按键立即切换。

谢谢,这个方法对流水灯来说还是挺实用的
ID:647261 发表于 2023-5-29 17:21

谢谢,学到了。
这个方法很巧妙
缩短子程序的执行时间
在主程序不停地检测count值,对按键反应很快
ID:647261 发表于 2023-5-29 17:16
leave323 发表于 2023-5-29 10:38
count放到两个函数体里面检测,不符合就退出。整体闪烁函数可以加一个循环。两个函数之间再重新给LED赋0, ...

谢谢!
这个实现起来比较简单,只要在每个子程序的循环中再加上count检测就行了,反应时间最长的只不过是延时那点时间。
ID:213173 发表于 2023-5-29 13:58
把各种花样流水灯用数组排列好,按下按键立即切换。
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit key = P3^2;

  6. unsigned char code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  7. unsigned char code table2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  8. unsigned char code table3[]={0x7e,0xbd,0xdb,0xe7,0x7e,0xbd,0xdb,0xe7};
  9. unsigned char code table4[]={0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa};
  10. uchar count = 0;
  11. uchar LED = 0xff;
  12. uchar i;

  13. void delay10ms(uint n)
  14. {
  15.    uchar i,j;
  16.    for(;n>0;n--)
  17.    {
  18.       for(i=0;i<18;i++)
  19.       {
  20.          for(j=0;j<184;j++){;}
  21.       }
  22.    }
  23. }


  24. void main(void)
  25. {
  26.    IT0 = 1;
  27.    EX0 = 1;
  28.    EA  = 1;
  29.    while(1)
  30.    {
  31.                 switch(count)
  32.                 {
  33.                         case 1: P1=table1[i]; break;
  34.                         case 2: P1=table2[i]; break;
  35.                         case 3: P1=table3[i]; break;
  36.                         case 4: P1=table4[i]; break;
  37.                         default:P1=0xff; break;
  38.                 }
  39.                 i=++i%8;
  40.                 delay10ms(50);
  41.    }
  42. }

  43. void key_check(void) interrupt 0
  44. {
  45.    if(key == 0)
  46.    {
  47.       delay10ms(1);
  48.       if(key == 0)
  49.       {
  50.          ++count;
  51.          if(count == 5)
  52.          count = 1;
  53.       }
  54.    }  
  55. }
复制代码
ID:161164 发表于 2023-5-29 11:55

ID:1077017 发表于 2023-5-29 10:38
count放到两个函数体里面检测,不符合就退出。整体闪烁函数可以加一个循环。两个函数之间再重新给LED赋0,防止从流水灯函数出来时LED不为0

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

Powered by 单片机教程网

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