搜索
bottom↓
回复: 3

自学了6天,写了个小程序,中断跳不出

[复制链接]

出0入0汤圆

发表于 2009-7-20 19:57:15 | 显示全部楼层 |阅读模式
小弟自学了几天PIC,现在开始写小程序,6个数码管同时循环显示0到9,逢10循环再显示,要用按键扫描或中断,就是一按RB4按键,就显示5,然后跳回去,中午搞了几个小时,中断那里就是跳不出来,请高手指正,谢谢。。
下面是我写的程序:

;************************************************
TMR0          EQU         01H
PCL       EQU    02H ;定义程序计数器低字节寄存器地址
STATUS    EQU    03H ;定义状态寄存器地址
PORTA     EQU    05H ;定义RA口数据寄存器地址
PORTB          EQU         06H
PORTC     EQU    07H ;定义RC口数据寄存器地址

TRISA     EQU    85H ;定义RA口方向控制寄存器
TRISB          EQU         86H
TRISC     EQU    87H ;定义RC口方向控制寄存器
ADCON1    EQU    9FH  ;定义ADC模块控制寄存器1的地址
;-----------------------STATUS
C         EQU    0   ;定义进位标志位位地址
Z         EQU    2   ;定义0标志位位地址
W                  EQU         0
F                  EQU         1
RP0       EQU    5   ;定义页选位RP0位地址
;-----------------------
COUNTER   EQU    20H  ;定义计数器寄存器
COUNT0    EQU    21H  ;定义廷时变量计数器
COUNT1    EQU    22H  ;定义廷时变量计数器
COUNT2    EQU    24H  ;定义廷时变量计数器
PORTA_B   EQU    25H  ;定义数码管位选寄存器;
PORTB_B          EQU         26H
COUNT3          EQU         27H
COUNT4          EQU         28H
W_TEMP          EQU         0FFH

INTCON                EQU        0BH
T0IF                EQU        2
T0IE                EQU        5
INTE                EQU        4
INTF                EQU        1
RBIE                EQU        3
RBIF                EQU        0
OPTION_REG        EQU        81H
OPTION_TEMP        EQU        0A6H
STATUS_TEMP        EQU        23H

;--------------------
          ORG 0000H   
          NOP         ;放置一条ICD必需的空操作指令
          GOTO MAIN   
          ORG 0004H
                  GOTO SERV   
;******************************************************
CONVERT1                ;取数码管位码
           ADDWF PCL,1  ;地址偏移量加当前PC值
TABLE1
           RETLW 0FDH   ;第一位数码管
           RETLW 0FEH   ;第二位数码管
           RETLW 0F7H   ;第三位数码管
           RETLW 0FBH   ;第四位数码管
           RETLW 0DFH   ;第五位数码管
           RETLW 0EFH   ;第六位数码管
;-------------------- ----------------------------------
CONVERT                              ;取数码管段码
            ADDWF PCL,1              ;地址偏移量加当前PC值
TABLE                                                           
            RETLW 0C0H                            ;0
            RETLW 0F9H                            ;1                                
            RETLW 0A4H                            ;2
            RETLW 0B0H                            ;3
            RETLW 99H                            ;4
            RETLW 92H                            ;5
            RETLW 82H                            ;6
            RETLW 0F8H                            ;7
            RETLW 80H                            ;8
            RETLW 98H                            ;9
        RETLW 7FH                   ;.
;*******************************************************
MAIN
            CLRF PORTA              ;初始化IO口
            CLRF PORTC              ;
                        CLRF PORTB
     
            BSF STATUS,RP0         
            MOVLW 07H
            MOVWF ADCON1            ;设置RA口全部为普通数字IO口
            MOVLW 00H
            MOVWF TRISA             ;设置RA,RC口全部为输出
            MOVWF TRISC
                        MOVLW 0F8H
                        MOVWF TRISB                                ;RB1输入,中断
                        MOVLW 02H
                        MOVWF OPTION_REG

            BCF STATUS,RP0
                        MOVLW 88H
                        MOVWF INTCON
                        MOVF  PORTB,F
                        BCF          INTCON,RBIF

                        MOVLW 00H
            MOVWF PORTA_B          ;全部数码管都为输出
                        CLRF COUNTER                        ;中间计数器清零
                        MOVFW COUNTER
;----------------------
LOOPA        
                        CALL CONVERT           ;取段码
            MOVWF PORTC            ;段码送RC口显示
            CALL DELAY                          ;延时大约1秒                         CALL DELAY
                        CALL DELAY
                        CALL DELAY            ;
            INCF COUNTER,1         ;段码加1直到第10位即“。”
            MOVLW .11              ;
            XORWF COUNTER,0        ;
            BZ LOOPA               ;
            MOVFW COUNTER          ;
                        GOTO LOOPA
               
  ;;;;中断服务子程序;;;;;;;;;;;;
SERV
;;;;;;;;;;;;;;;;;;;;;保护现场;;;;;;;;
                        MOVWF        W_TEMP
                        SWAPF        STATUS,W
                        CLRF        STATUS
                        MOVWF        STATUS_TEMP

;;;;;;;;;;;;;;;调查中断源 ;;;;;;         
                        BTFSC        INTCON,RBIF
                        GOTO        RBSERV
                        GOTO        RETFIE0

;;;;;;;RB中断处理;;;;;;;;;
RBSERV
                        CALL        DELAY1
                        COMF        PORTB_B
                        MOVWF        PORTB_B
YEH                        MOVLW        05H
                        CALL        CONVERT
                        MOVWF        PORTC
                        CALL        DELAY
                        CALL        DELAY
                        CALL        DELAY
                        CALL        DELAY
                        GOTO        RBLOOP
               
;                        GOTO        YEH
RBLOOP                COMF        PORTB,W
                        BCF                INTCON,RBIF
                        ANDLW        0F0H
                        BTFSC        STATUS,Z
                        GOTO        RETFIE0
                        GOTO        RBLOOP

;;;;;;;恢复现场;;;;;
RETFIE0       
                        SWAPF        STATUS_TEMP,W
                        MOVWF        STATUS
                        SWAPF        W_TEMP
                        SWAPF        W_TEMP,W

                        RETFIE                                                       
                               
;---------------------------------廷时子程序------
DELAY          
        MOVLW  .2              ;设置延时常数
                MOVWF  COUNT0
L1                         
               MOVLW  .255            ;
                   MOVWF  COUNT1
L2                 
        MOVLW  .255            ;
                MOVWF  COUNT2
L3                         
        DECFSZ COUNT2,1        ;递减循环
            GOTO L3                ;
            DECFSZ COUNT1,1        ;
            GOTO L2                ;
            DECFSZ COUNT0,1        ;
            GOTO L1                ;
            RETLW  0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1          
        MOVLW  .2              ;设置延时常数
                MOVWF  COUNT0
L4                         
        MOVLW  .50           ;
        MOVWF  COUNT1
L5                 
        MOVLW  .50           ;
                MOVWF  COUNT2
L6                         
        DECFSZ COUNT2,1        ;递减循环
            GOTO L6                ;
            DECFSZ COUNT1,1        ;
            GOTO L5                ;
            DECFSZ COUNT0,1        ;
            GOTO L4                ;
            RETLW  0

;----- -----------------------------------------------
            END

出0入0汤圆

发表于 2009-7-28 16:10:03 | 显示全部楼层
pic12c508没中断吧!
QQ交流:270334231

出0入0汤圆

 楼主| 发表于 2009-7-28 21:20:07 | 显示全部楼层
呵呵,这个我不用中断搞定了,而且更加简单

但是问题还是存在,仿真时我把RBIF直接置1,中断可以跳回来,烧进芯片时却不行,见鬼了。

出0入0汤圆

发表于 2009-8-3 11:05:10 | 显示全部楼层
检查GIE位 PEIE位 和 INTIE位
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 22:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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