小弟自学了几天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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>