大家一起来猜猜程序有问题吗?

2019-03-25 19:17发布

  1. list p = 16f876a
  2. #include
  3. __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_ON

  4. CBLOCK 0X20
  5. W_TEMP ;定义保护W寄存器的备份寄存器位于bank0地址0x20处,注意bank1的0xa0,bank2的0x120,bank3的0x1a0都必须留给w_temp
  6. STATUS_TEMP ;定义保护STATUS寄存器的备份单元
  7. PCH_TEMP ;定义保护PCLATH寄存器的备份单元
  8. FSR_TEMP ;定义保护FSR寄存器的备份单元
  9. COUNT1
  10. COUNT2
  11. COUNT3
  12. ENDC

  13. ORG 0X0000
  14. NOP
  15. GOTO main

  16. ORG 0X0004
  17. CALL INT_PROTECT
  18. CLRF PCLATH ;跳转前设定正确的PCLATH
  19. GOTO INT_TABLE ;跳转到中断查询表






  20. main:
  21. CALL RB0_INT_INIT
  22. ;中断产生后进入中断服务程序,查询INTF中断标志位。
  23. ;若INTF = 1,则处理RB0/INT中断,处理完毕后(或处理前)软件必须清除INTF中断标志位
  24. banksel TRISA
  25. BCF TRISA,2
  26. banksel PORTA
  27. BSF PORTA,2 ;LED_OUTSIDE ON

  28. loop:
  29. GOTO loop

  30. ;************************中断初始化*************************
  31. RB0_INT_INIT:

  32. BANKSEL TRISB ;片选bank1
  33. BSF TRISB,0 ;RB0为输入模式
  34. ;BCF OPTION_REG,7 ;使能弱上拉
  35. BCF OPTION_REG,INTEDG ;下降沿中断
  36. BANKSEL PORTB ;返回到bank0
  37. BCF INTCON,INTF ;确保有效中断发生前中断标志为0
  38. BSF INTCON,INTE ;允许RB0/INT中断响应
  39. BSF INTCON,GIE ;打开总中断允许使能位
  40. RETURN

  41. ;************************中断保护******************************
  42. INT_PROTECT:
  43. ;保护中断现场
  44. MOVWF W_TEMP ;立即把W寄存器复制到备份寄存器中
  45. MOVF STATUS,W ;把STATUS放置到W寄存器中暂存,虽然movf指令执行结果会改变STATUS,但在发生变化之前原内容以送进W
  46. ;此指令也可以用“swapf status,w”,在最后恢复时需用swapf指令配对
  47. CLRF STATUS ;此时可以改变STATUS,设定RP1:RP0 = 00,指向bank0
  48. MOVWF STATUS_TEMP ;把存在W的原STATUS的值复制到其备份单元
  49. MOVF PCLATH,W ;把原PCLATH的值复制到W
  50. MOVWF PCH_TEMP ;把存在W的原PCLATH的值复制到其备份单元
  51. MOVF FSR,W ;把原FSR的值复制到W
  52. MOVWF FSR_TEMP ;把存在W的原FSR的值复制到其备份单元
  53. ;...................;保护其他需要备份的寄存器

  54. ;到此,全部寄存器已经妥善保护,可以执行中断服务代码了
  55. RETURN

  56. ;*************************中断恢复**********************************
  57. INT_EXIT:
  58. ;中断服务程序出口
  59. CLRF STATUS ;设定RP1:RP0 = 00,指向bank0
  60. ;............. ;恢复其他要恢复的寄存器
  61. MOVF FSR_TEMP,W ;取FSR保护的内容
  62. MOVWF FSR ;恢复FSR
  63. MOVF PCH_TEMP,W ;取PCLATH保护的内容
  64. MOVWF PCLATH ;恢复PCLATH
  65. MOVF STATUS_TEMP,W ;取STATUS保护的内容
  66. MOVWF STATUS ;恢复STATUS
  67. ;到此,除W寄存器外所有其他保护寄存器已经全部恢复
  68. ;在接下来的恢复W寄存器过程中千万不能破坏他们的内容
  69. SWAPF W_TEMP,F ;先把W_TEMP的内容高低半字节交换一次
  70. SWAPF W_TEMP,W ;再把W_TEMP的内容高低半字节交换一次,但结果放在W内 ;用法说明详见P58页
  71. RETFIE ;中断返回,GIE被自动置1,可以响应其他中断

  72. ;************************中断源查询程序******************************************
  73. INT_TABLE:
  74. BTFSS INTCON, T0IE ;TIMER0中断使能标志位T0IE是否为1,为1跳
  75. GOTO RB0_INT_ASK
  76. BTFSC INTCON, T0IF ;TIMER0是否发生中断,为0跳
  77. GOTO TMR0_INT_START ;是,跳到TMR0_INT_START中断程序
  78. RB0_INT_ASK:
  79. BTFSC INTCON, INTF
  80. GOTO INT_RB4_LED_ON_OR_OFF

  81. ;**************************中断服务程序**********************************************
  82. INT_RB4_LED_ON_OR_OFF:
  83. CALL INT_PROTECT
  84. BCF INTCON,INTF ;先将中断标志位清0,保证下次中断发生
  85. BTFSC PORTB,4 ;为1(即灭)则点亮,为0(即亮)则跳点灭
  86. GOTO AAA
  87. CALL LED_GREEN_OFF
  88. CALL INT_EXIT
  89. AAA:
  90. CALL LED_GREEN_ON
  91. CALL INT_EXIT
  92. ;******************************LED_GREEN_ON***************************************
  93. LED_GREEN_ON:
  94. BANKSEL TRISB
  95. BCF TRISB,4 ;RB4为输出状态
  96. BANKSEL PORTB
  97. BCF PORTB,4 ;RB4为低电平,点亮
  98. RETURN

  99. ;*******************************LED_GREEN_OFF*************************************
  100. LED_GREEN_OFF:
  101. BANKSEL TRISB
  102. BCF TRISB,4 ;RB4为输出状态
  103. BANKSEL PORTB
  104. BSF PORTB,4 ;RB4为高电平,点灭
  105. RETURN

  106. ;**********************************TMR0中断服务程序*******************************
  107. TMR0_INT_START:
  108. NOP
  109. ;*****************************延时程序********************************************
  110. DELAY_1s:
  111. MOVLW 0X06 ;1秒延迟
  112. MOVWF COUNT1

  113. delay1:
  114. MOVLW 0X0EB
  115. MOVWF COUNT2

  116. delay2:
  117. MOVLW 0X0EC
  118. MOVWF COUNT3

  119. delay3:
  120. DECFSZ COUNT3,F
  121. GOTO delay3
  122. DECFSZ COUNT2,F
  123. GOTO delay2
  124. DECFSZ COUNT1,F
  125. GOTO delay1
  126. RETURN

  127. end
复制代码背景:小菜我刚接触PIC单片机没多久,写了一个验证RB0/INT下降沿触发中断的程序,遇到了小麻烦,只能下降沿触发一次,后面出现下降沿触发点灯就没反应,不知为何,我用ISIS做了仿真不行。请诸位帮我分析分析,看看什么原因一起研究研究~附上仿真图 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
24432972
2019-03-27 05:00
今天空的时候看了下程序,找到了一个问题,在进入中断入口之后第一件事一定是中断保护,大家切记~把100行多余的CALL INT_PROTECT挪到19行OGR 0x0004下面
可能程序还有问题,明天再看看~

一周热门 更多>