查看: 1165|回复: 4
打印 上一主题 下一主题

运用延时的办法消除抖动,求大神指导不足

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-28 17:17:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jerryzhai 于 2014-7-29 11:37 编辑
  1. /*******************************************************
  2. *   程序功能:外部中断触发
  3. *   接线说明:核心板JP2 PA0-PA7连接到系统底板静态数码管显示电路JP71,PD2,PD3接到JP74上的DK0,DK1
  4. *   实验现象:按下DK0数码管加1,按下DK1数码管减1
  5. *        日    期 : 2014/7/28
  6. *        作    者 : 翟志刚
  7. *******************************************************/
  8. #include <iom16v.h>
  9. #include <macros.h>
  10. #define  uchar unsigned char
  11. #define  uint  unsigned int

  12. uchar led_7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//数码管从0显示到F

  13. uchar counter = 0;

  14. /*******************************************************
  15. //函数名称:delay_ms(uint k)
  16. //函数功能:延时子程序
  17. //入口参数:k,延时时间参数
  18. //返回参数:无
  19. ********************************************************/
  20. void delay_ms(int k)
  21. {
  22.     int i,j;
  23.     for(i=0;i<k;i++)
  24.     {
  25.        for(j=0;j<1000;j++)
  26.        ;
  27.     }
  28. }

  29. // INT0中断服务程序
  30. #pragma interrupt_handler int0:2
  31. void int0(void)
  32. {
  33.         if(PIND&0x40)
  34.                 ;
  35.         else
  36.         {
  37.         delay_ms(100);
  38.         counter++;
  39.         if(counter >= 16)
  40.         counter = 0;
  41.         }


  42. }

  43. // INT1中断服务程序
  44. #pragma interrupt_handler int1:3
  45. void int1(void)
  46. {
  47.         if(PIND&0x40)
  48.                 ;
  49.         else
  50.         {
  51.         delay_ms(100);
  52.         counter--;
  53.         if(counter <= 0)
  54.         counter = 15;
  55.         }

  56. }

  57. void main(void)
  58. {
  59.     PORTA = 0xFF;     //初始化
  60.     DDRA = 0xFF;
  61.     DDRD = 0x00;    //将D口初始化为输入

  62.     SREG=0x80;              // 全局中断允许
  63.     GICR|=0xC0;                  // 允许INT0、INT1中断
  64.     MCUCR=0x0A;                  // INT0、INT1下降沿触发
  65.     GIFR=0xC0;                  // 清除INT0、INT1中断标志位

  66.     while (1)
  67.     {
  68.         PORTA = led_7[counter];                // 显示计数单元
  69.     };
  70. }

复制代码


回复

使用道具 举报

板凳
 楼主| 发表于 2014-7-28 17:19:53 | 只看该作者
本帖最后由 jerryzhai 于 2014-7-29 11:37 编辑
  1. 错了一行,// INT1中断服务程序
  2. #pragma interrupt_handler int1:3
  3. void int1(void)
  4. {
  5.         if(PIND&0x40)
  6.                 ;
  7.         else
  8.         {
  9.         delay_ms(100);
  10.         counter--;
  11.         if(counter <= 0)
  12.         counter = 15;
  13.         }

  14. }中的if(PIND&0x04)改成if(PIND&0x08)
复制代码

回复 支持 反对

使用道具 举报

地板
发表于 2014-7-29 11:52:53 | 只看该作者
值得研究一下,,,
回复 支持 反对

使用道具 举报

5#
发表于 2014-7-29 15:18:49 | 只看该作者
跪求马老师出山。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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