找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多个按键控制流水灯切换程序

[复制链接]
跳转到指定楼层
楼主
ID:262 发表于 2016-3-11 23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 heicad 于 2016-3-11 23:25 编辑

有四种流水模式,想通过四个按钮分别控制,并使用外部打断来立即切换程序,怎么都写不了,每次都是要通过按复位再安按钮来切换程序,用了switch语句还是不行,求大神解答,电路图的按键位置错了,本来想法是用外部打断k1切换程序,按一下是流水灯加数码管闪动,再按一次立即切换呼吸灯,在按一下立即切换拖尾灯,现在就想换个立即切换的,分别定义k1,k2,k3按一下就立即切换,我写的程序不能立即切换,求大神解答一下,谢谢啦



  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define led P1

  6. uchar abit=16;
  7. uchar atimer0_n;
  8. uchar code abit8[9]={1,2,4,8,16,32,64,128,0};
  9. unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
  10. uchar nn;
  11. char a,b,c,d,e,f,g,h;  


  12. sbit k1=P2^3;
  13. sbit k2=P2^2;
  14. sbit k3=P2^1;

  15. void led1();        
  16. void led2();
  17. void led3();
  18. void Delay10ms(unsigned int);
  19. void delay(int x)  
  20. {  int i;
  21.          for(i=x;i>0;i--);
  22.         }
  23.         
  24. void Delay10ms(unsigned int c)   //误差 0us
  25. {
  26.     unsigned char a,b;
  27.     for(;c>0;c--)
  28.         for(b=38;b>0;b--)
  29.             for(a=130;a>0;a--);
  30. }

  31. void main()
  32. {while(1)
  33.         {        
  34.         if(k1==0)led1();
  35.         if(k2==0)led2();
  36.         if(k3==0)led3();
  37.         }
  38. }
  39. void led1()                  
  40. {
  41.         unsigned int i;
  42.         led=0xfe;
  43.         P0=table[i];
  44.         Delay10ms(50);
  45.         while(1)
  46.         {
  47.                 for(i=0;i<7;i++)                                                
  48.                 {
  49.                         led=_crol_(led,1);
  50.                         P0=table[i+1];
  51.                         Delay10ms(50);                                                         
  52.                 }
  53.                 for(i=7;i>0;i--)                                                        
  54.                 {
  55.                         led=_cror_(led,1);
  56.                         P0=table[i-1];
  57.                         Delay10ms(50);                                                        
  58.                 }                  
  59.         }        
  60. }
  61. void led2()
  62. {        
  63.         int x,cycle=370;
  64.         while(1)
  65.         {
  66.           for(x=0x00;x<cycle;x++)
  67.           {
  68.                   P1=0;
  69.                 delay(x-50);        
  70.                 P1=0xff;
  71.                 delay(cycle-x);        
  72.           }

  73.           for(x=cycle;x>0;x--)
  74.           {
  75.                   P1=0;
  76.                 delay(x-50);  
  77.                 P1=0xff;
  78.                 delay(cycle-x);
  79.           }

  80.         }        
  81. }

  82. void led3()
  83. {        TMOD = 0x11;        
  84.         TL0 = 0x00;                //2.5ms
  85.         TH0 = 0xF7;        
  86.         TF0 = 0;               
  87.         TR0 = 1;        
  88.         EA=1;ET0=1;
  89.         while(1)
  90.         {
  91.          a=abit;
  92.          if(a>7||a<0)
  93.                 a=8;
  94.          b=abit-1;
  95.          if(b>7||b<0)
  96.                  b=8;
  97.          c=abit-2;
  98.          if(c>7||c<0)
  99.                  c=8;
  100.                  d=abit-3;
  101.          if(d>7||d<0)
  102.                  d=8;
  103.                          e=abit-4;
  104.          if(e>7||e<0)
  105.                  e=8;
  106.                          f=abit-5;
  107.          if(f>7||f<0)
  108.                  f=8;
  109.                          g=abit-6;
  110.          if(g>7||g<0)
  111.                  g=8;
  112.                          h=abit-7;
  113.          if(h>7||h<0)
  114.                  h=8;
  115.         
  116.                
  117.         atimer0_n++;
  118.         if(atimer0_n==520)
  119.         atimer0_n=0;
  120.         if(atimer0_n<5)
  121.                 P1=0xff-abit8[a];
  122.         if(atimer0_n<40)
  123.                 P1=0xff-abit8[b];
  124.         if(atimer0_n<150)
  125.                 P1=0xff-abit8[c];        
  126.         if(atimer0_n<255)
  127.                 P1=0xff-abit8[d];
  128.         if(atimer0_n<300)
  129.                 P1=0xff-abit8[e];
  130.         if(atimer0_n<380)
  131.                 P1=0xff-abit8[f];
  132.         if(atimer0_n<460)
  133.                 P1=0xff-abit8[g];
  134.         if(atimer0_n<520)
  135.                 P1=0xff-abit8[h];
  136.                
  137.         }
  138. }

  139. atimer0 () interrupt 1
  140. {        
  141.         TL0 = 0x00;                //50ms
  142.         TH0 = 0x4C;
  143.         nn++;
  144.         if(nn==1)
  145.         {
  146.                 nn=0;abit--;
  147.                  if(abit==0)
  148.                  abit=32;
  149.         }

  150.                
  151. }   
复制代码


就是这几个程序,现在先把第一个流水灯的延时换成定时器延时,怎么改想立即切换

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2016-3-11 23:22 | 只看该作者
子函数void led1();        
void led2();
void led3();里有while(1)语句出不来---死循环。
要想用中断的话只有两个外部中断,不用中断也可以实现的。设置四个标记变量代表四个按键的情况,再扫描显示OK!!
回复

使用道具 举报

板凳
ID:262 发表于 2016-3-11 23:22 | 只看该作者
楼上教你了,每一个子程序的while(1)出不来,你的主函数只执行了void led1();。后面的都执行不到
回复

使用道具 举报

地板
ID:262 发表于 2016-3-11 23:23 | 只看该作者

在循环体里加如按键条件   先back  在执行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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