作者selfhu (水管爆了)
看板ASM
标题Re: [问题] 关於pic887的一些问题
时间Sun Mar 18 02:47:48 2012
如果你的程式是要0~9重复跑的话,且这就是你的全部程式,那就往下看吧
如果不是,那我就不知道你要什麽了
※ 引述《vofeed (vofeed)》之铭言:
: 标题: [问题] 关於pic887的一些问题
: 时间: Sun Mar 11 17:16:37 2012
:
: 各位大大,我想请问一下,此程式中的subwf是如何跳到查表的
:
: 此程式的动作流程,可以替小弟说明一下吗?我一直想不通,
:
: 以下我解说一下我的想法:
: list p=16f887
: #include<p16f887.inc>
:
: D1 equ 0x20
: D2 equ 0x21
: D3 equ 0x22
: ONEIDX equ 0x23
: org 00h
: clrf D1
: clrf ONEIDX
: bsf STATUS,RP0
: bcf TRISB,3
: clrf TRISD
: bcf STATUS,RP0
: bcf PORTB,3
: start:
: movf ONEIDX,w //第1此跑时,ONEIDX为0=W
: call TABLE
: movwf PORTD
: call delay
: incf ONEIDX,f //第一次跑,因INCF故1
: movlw .10
: subwf ONEIDX,w //因10减W故为10
btfsc status,z
clrf oneidx
goto start
; btfss STATUS,Z ;原始
; goto start ;原始
: delay:
: movlw .8
: movwf D3
: DLY1:
: movlw .244
: movwf D2
: DLY2:
: decfsz D1,f
: goto DLY2
: decfsz D2,f
: goto DLY2
: decfsz D3,f
: goto DLY1
: return
: TABLE:
: addwf PCL,f
: retlw b'00111111' ;0
: retlw b'00000110' ;1
: retlw b'01011011' ;2
: retlw b'01001111' ;3
: retlw b'01100110' ;4
: retlw b'01101101' ;5
: retlw b'01111101' ;6
: retlw b'00000111' ;7
: retlw b'01111111' ;8
: retlw b'01101111' ;9
: end
:
: 但怎想都不能如愿从0跳至9
:
: 请各位大大帮个忙~
问题出在被标记在原始的两行上,当你的oneidx=10时
10-10=0,Z旗标会举起来,接下来的btfss会因为Z=1,跳到goto的下一行(delay)
此时,CPU仍然会正常的跑完delay
但当他跑完delay时,由於它是使用return返回
而你进来的时候,并不是以call的方式进来
这样会造成stack吐出未知的位址给PC
此时PC也是照单全收,从未知位址开始执行
直到执行到最後一个位址後,又回到0x00位址重复执行
(如果stack吐出来的是0,上面那一句直接看最後一半)
所以你的程式得修改成我後来加的那三行(另一半原因如下)
同样的第一行,如果你是要跑0~9
那你的原始程式应该修改一下,在oneidx=10时,需要将oneidx重新设为0
否则当你的oneidx=10时,PC会跑到你的9下面一行
那一行以後刚好都没有code,所以CPU又会很乖的执行到最後一个位置後
再回到0x00重头来
--
对不起,有好格式大脑才会跑debug模式,所以我排了一下版
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.204.132
1F:推 vofeed:感谢万分~我还不太熟习程式的想法~ 03/21 16:57