大家来看看这个简单的汇编程序,分析下原因

2020-02-10 08:51发布

;********************************************************************               
LIST P=16F737     
#include <P16F737.inc>

L1       EQU  31H    ;廷时变量
L2       EQU  32H
L3       EQU  33H
LED_TEMP EQU  30H

;-------------------------


         ORG 0000H              ; 程序从零地址开始
         GOTO star
         ORG 0005H
star:
         CLRF PORTB           ;初始化I/O口
         CLRF PORTA
         BCF STATUS,RP1
         BSF STATUS,RP0       ;设置数据寄存器体1
             MOVLW H'00'  
         MOVWF TRISB          ; 设置PORTB 全部IO为输出
         MOVLW H'FF'
         MOVWF TRISA          ;全部为输入设置PORTA
         BCF STATUS,RP0       ;恢复数据寄存器体0
     
         MOVLW 00H
         MOVWF LED_TEMP       ;PORTB的临时变量初始化为0
         
LOOP:
         BTFSS PORTA,4        ;判断A4口是否有键按下
         GOTO  ST_1
         GOTO  LOOP (按键没按下时,为什么这里老是不能调到LOOP,而是往下执行,往下执行时,调试看到W寄存器的值出错了)
ST_1:
         MOVLW 0FFH             ;送ffH到W
         XORWF LED_TEMP,1       ;取反PORTB临时变量
         MOVF  LED_TEMP,0       ;送临时变量到W
         MOVWF PORTB            ;临时变量送到PORTB
        
         GOTO LOOP
         END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
lvshaohui
1楼-- · 2020-02-11 07:53
6楼你的做法我也做了,现在出现新问题了:最后的GOTO loop有问题,它不会跳到LOOP那里的,调试器看出它老跑到0076H那里。现在把这两条指令去掉:XORWF LED_TEMP,1       ;取反PORTB临时变量
                MOVF  LED_TEMP,0       ;送临时变量到W
正常了!

所以现在怀疑是因为对LED_TEMP(30H)进行操作,改到了什么东西了。我中断也没开的,怎么它就老跳到76H那去了,真是郁闷,刚学这个东西就碰到这些怪怪的问题。我现在的程序改成:LIST P=16F737     
#include <P16F737.inc>
__CONFIG    _CONFIG1,  _CP_OFF & _CCP2_RC1 & _DEBUG_OFF & _VBOR_2_0 & _BOREN_0 & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
__CONFIG    _CONFIG2,  _BORSEN_0 & _IESO_OFF & _FCMEN_OFF


L1       EQU  31H    ;廷时变量
L2       EQU  23H
L3       EQU  33H
LED_TEMP EQU  30H

;-------------------------


         ORG 0000H              ; 程序从零地址开始
         GOTO star
;         ORG 0005H
star
         BCF STATUS,RP1
         BSF STATUS,RP0       ;设置数据寄存器体1
         MOVLW 0FH
         MOVWF ADCON1
             MOVLW 00H  
         MOVWF TRISB          ; 设置PORTB 全部IO为输出
         MOVLW 0FFH
         MOVWF TRISA          ;全部为输入设置PORTA
         BCF STATUS,RP0       ;恢复数据寄存器体0
        ; CLRF PORTB           ;初始化I/O口
        ; CLRF PORTA
         MOVLW 00H
         MOVWF LED_TEMP       ;PORTB的临时变量初始化为0      
loop
         BTFSS PORTA,4        ;判断A4口是否有键按下
         GOTO  ST
         GOTO  loop
ST
        MOVLW 0FFH             ;送ffH到W
         ;XORWF LED_TEMP,1       ;取反PORTB临时变量(已删除)
         ;MOVF  LED_TEMP,0       ;送临时变量到W(已删除)
         MOVWF L1
         MOVWF PORTB            ;临时变量送到PORTB
         GOTO  loop(这里老跳不到loop,而是跳到76H)
         END
lvshaohui
2楼-- · 2020-02-11 10:52
好像,是好像。ST下面的语句不能超过3句,超过据不正常,不超过就正常
lvshaohui
3楼-- · 2020-02-11 13:59
问题解决了!

问题出在ICD 2的编程范围设置,默认的设置是19个单位,所以ST下面多于3句就超出范围了。把它改大点,一切正常!大意了
kerncln
4楼-- · 2020-02-11 15:24
 精彩回答 2  元偷偷看……
leofoolish
5楼-- · 2020-02-11 16:45
问下:默认是19个单位?在哪里可以看到?在哪里可以更改?
kaiwenavr
6楼-- · 2020-02-11 21:58
默认是19个单位,是什么意思?请解释一下。

一周热门 更多>