※ 引述《wasidada (dada)》之铭言:
: ※ 引述《kikiqqp (喵食罐头)》之铭言:
: : 提示:1. CPFSGT f, a 若f大于W,则跳过下一个指令。
: : 2. 14h ?
: : 3. 19h ??
: : 4. Action_1和2 CALL后要return到哪呢?
: : 5. 程式何时停止呢?
: : 6. 堆栈可以只出不进吗?
: list p= 18f67j50
: #include "p18F67J50.inc"
先假设你用的是这个
;=====================================================================
; MPASM PIC18F67J50 processor include
;
; (c) Copyright 1999-2007 Microchip Technology, All rights reserved
;=====================================================================
: VAL_US equ .147
: VAL_MS equ .100
: COUNT equ 0x20
: COUNT_ms equ 0x21
: VAL_US equ .147
缩排,排版烂的工程师肯定不会写出好程式
: MAIN_PROG CODE
: Initial
: CLRF PORTD
: CLRF LATD
: CLRF TRISD
: MOVLW 0x05
: MOVWF C
C是什么?
INC中是C EQU H'0000'呦
: MOVLW 0x0A
: MOVWF D
D是什么?
INC中是D EQU H'0005'呦
: start
: Call Action
: GOTO start
这边是一个LOOP
: Action:
: MOVLW 0x07
: CPFSGT C
你在使用CPFSGT有没有注意到手册上 f和 a各代表什么意思呢?
还有C是REG吗?
: call Action_1
: call Action_2
你知道执行Action_1后会接着执行Action_2吗?
: MOVLW 0x0B
: CPFSGT D //后来我发现 给一个变量就可以正常运作了
CPFSGT是W和F(REG)比较,你改变了W当然结果会变动呀
至于是不是你要的结果根本不知道
: call Action_3
: call Action_4
你知道执行Action_3后会接着执行Action_4吗?
你知道执行Action_4后会接着执行Action_1吗?之后回到GOTO start
: Action_1:
: BSF LATD,5
: return //return 是跳出这个函式 执行完Action_1吧
: Action_2:
: BSF LATD,6
: return
: Action_3:
: BCF LATD,5
: return
: Action_4:
: BCF LATD,6
: return
以下DELAY略过
: DELAY_100ms:
: MOVLW VAL_MS
: MOVWF COUNT_ms
: LOOP_ms:
: CALL DELAY_1ms
: DECFSZ COUNT_ms,f
: GOTO LOOP_ms
: RETURN
: DELAY_1ms:
: MOVLW VAL_US
: MOVWF COUNT
: DEC_LOOP
: CALL D_SHORT
: DECFSZ COUNT,f
: GOTO DEC_LOOP
: RETURN
: D_SHORT
: CALL D_RET
: CALL D_RET
: nop
: nop
: D_RET
: RETURN
: END
: 我比较担心的问题是,我的观念是错的结果程式跑起来是正确的
: 结果没发现 orz
除非有特殊必要性,不然我会建议PIC18F先用C来实作想要的部份
并利用编译器来看组语