[PIC®/AVR®/dsPIC®产品] 请问诸位大神,为啥我这段程序急停无效啊??(完全自学,唉,没头绪!)

[复制链接]
1591|5
 楼主| wei565831866 发表于 2015-11-3 21:41 | 显示全部楼层 |阅读模式
  1. //采用芯片为:PIC16F877A
  2. //实现LED灯的顺启逆停与急停
  3. #include<pic.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define IN 4                //定义进去时间为4s
  7. #define OUT 3               //定义3s后出来
  8. #define DOWN 6              //定义下压时间为6s
  9. __CONFIG(0X3F32);
  10. uchar LEIJIA,SEC;               //声明变量;累加,秒

  11. void delay(uint x)
  12. {
  13.     uint i,j;
  14.     for(i=x;i>0;i--)
  15.         for(j=123;j>0;j--);
  16. }

  17. void init_IO()
  18. {
  19.     TRISB = 0xFF;               //按键为输入
  20.     TRISC = 0X00;               //RC口输出为LED
  21. //    TRISE = 0X00;
  22.    
  23.     RC1 = 0;
  24.     RC2 = 1;
  25. }

  26. void init_timer0()
  27. {
  28.     GIE = 1;
  29.     PEIE = 0;
  30.     T0IE = 0;
  31.     T0IF = 0;
  32.     T0CS = 0;
  33.     T0SE = 0;
  34.     PSA = 0;
  35.     PS2 = 1;PS1 = 1;PS0 = 1;
  36.     LEIJIA = 0;
  37. }

  38. void start_timer0()
  39. {
  40.     GIE = 1;
  41.     PEIE = 1;
  42.     T0IE = 1;
  43.     T0IF = 0;
  44. }

  45. void stop_timer0()
  46. {
  47.     T0IE = 0;
  48.     T0IF = 0;
  49.     TMR0 = 0X00;
  50.     LEIJIA = 0;
  51. }

  52. void interrupt ISR()
  53. {
  54.     TMR0 = 70;
  55.     if(T0IF == 1)
  56.         T0IF = 0;
  57.         LEIJIA ++;
  58.         
  59.     if(LEIJIA == 20)                //定时到1s
  60.         {
  61.         LEIJIA = 0;
  62.         SEC--;
  63.     }
  64. }

  65. void key_scan()
  66. {
  67.     if((RB0) == 0)              //按下按钮1(启动)
  68.     {
  69.         delay(2);
  70.         if((RB0) == 0)
  71.         {
  72.             while(!RB0);
  73.             RC1 = 0;            //LED1----亮

  74.             SEC = IN;           //亮4s
  75.             start_timer0();
  76.             while(!(SEC == 0));
  77.             stop_timer0();
  78.             RC2 = 0;            //LED2----亮

  79.             SEC = DOWN;         //亮6s
  80.             start_timer0();
  81.             while(!(SEC == 0));
  82.             stop_timer0();
  83.             RC1 = 1;            //LED1----灭

  84.             SEC = OUT;          //亮3s
  85.             start_timer0();
  86.             while(!(SEC == 0));
  87.             stop_timer0();
  88.             RC2 = 1;            //LED2----灭
  89.             
  90.             if(RB1 == 0)                    //按下按钮2(急停)
  91.             {
  92.                 delay(10);
  93.                 if(RB1 == 0)
  94.                 {
  95.                     while(!RB1);
  96.                     RC1 = 1;                //LED1----灭
  97.                     RC2 = 1;                //LED2----灭
  98.                 }
  99.             }
  100.         }
  101.     }
  102. }

  103. void main()
  104. {
  105.     init_IO();
  106.     init_timer0();
  107.     start_timer0();
  108.     stop_timer0();
  109.     while(1)
  110.     {
  111.         key_scan();
  112.     }
  113. }
NE5532 发表于 2015-11-4 08:35 | 显示全部楼层
我拿到楼主的程序也没头绪,急停无效是啥意思?
 楼主| wei565831866 发表于 2015-11-4 08:43 | 显示全部楼层
NE5532 发表于 2015-11-4 08:35
我拿到楼主的程序也没头绪,急停无效是啥意思?

就是在灯亮的过程中,按下急停,灯不会灭啊。
yklstudent 发表于 2015-11-4 11:07 | 显示全部楼层
流水线程序,一撸到底
mzb2012 发表于 2015-11-4 13:00 | 显示全部楼层
本帖最后由 mzb2012 于 2015-11-4 13:01 编辑
  1. if(RB1 == 0)                    //按下按钮2(急停)
  2.             {
  3.                 delay(10);
  4.                 if(RB1 == 0)
  5.                 {
  6.                     while(!RB1);
  7.                     RC1 = 1;                //LED1----灭
  8.                     RC2 = 1;                //LED2----灭
  9.                 }
  10.             }

  11. 不能放在  if((RB0) == 0)     的大括号里,这样的话就是按下RB0同时在按下RB1
JY-DX-JY 发表于 2015-11-5 09:09 | 显示全部楼层
灯亮灭的时间太长了,没时间响应按键。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部