返回信息流我在做一个秒表的程序,没有用时钟芯片,现在调试过程中发现有一点问题(绿色部分),想来请教一下。下面是部分程序,定义部分和一些子程序省略了。完整程序在附件里。
我是单独把这一段拿出来作为一个程序调试的,运行过程中TMR0一直不变。这两天一直卡在这里,怎么也进行不下去了,所以想请大家帮我看看可能是哪里出了问题,先谢谢大家啦^_^
LIST P=16F877
INCLUDE "P16F877.INC"
TMR0B EQU 6
;==================MAIN======================
ORG 000H
MAIN
NOP
BSF STATUS,RP0
MOVLW 00H
MOVWF TRISD ;D输出
MOVLW 0FFH
MOVWF TRISB ;B输入
MOVLW 04H ;分频比1:32 32*(256-6)=8ms
MOVWF OPTION_REG
BCF STATUS,RP0
CLRF PORTD
CALL SCRINIT ;屏幕初始化
LOOP0
BTFSS INTCON,INTF ;INT是否按下
GOTO LOOP0
BCF INTCON,INTF ;INT清零
MOVLW 30H ;是!在LCD上显示00’00(硬件调试成功)
CALL DISPLAY ;LCD显示
CALL DISPLAY
MOVLW 27H
CALL DISPLAY
MOVLW 30H
CALL DISPLAY
CALL DISPLAY
LOOP1
BTFSS INTCON,INTF ;是否有按键输入?
GOTO LOOP1
BCF INTCON,INTF ;是
BCF INTCON,T0IF
MOVLW TMR0B
MOVWF TMR0
TEST
BTFSS INTCON,T0IF ;是否溢出?
GOTO TEST
;经过调试,发现程序到这里以后就一直循环这两句,也就是不会溢出
MOVLW 31H
CALL DISPLAY
END
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #1495同步于 2008/10/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
单片机汇编程序的小问题,不知道发这里合不合适
cg0630
2008/10/4镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
首先我觉得你没有时钟,仅仅是用延迟程序来判定时间,对于一个程序实现来说,有问题;
第二看你的问题大概就是说没有能够计数,你本来是想有一个“1”输出的,结果一直都没有实现,对吧?也就是说没有实现计数功能;
如果实在不行,你也可以用判断语句,是否是到了59啊?然后调用延迟语言就行啦。
啊,诡异的汇编……
你可以看看T0IF的溢出位是怎么操作的,要看芯片资料。
有可能溢出以后,硬件不会帮你回0,所以以后检查的时候,溢出位永远都是满足条件的。
你可能需要手动复位。
我写了BCF INTCON,T0IF
应该已经手动复位了啊
【 在 ericyosho 的大作中提到: 】
: 啊,诡异的汇编……
: 你可以看看T0IF的溢出位是怎么操作的,要看芯片资料。
: 有可能溢出以后,硬件不会帮你回0,所以以后检查的时候,溢出位永远都是满足条件的。
: ...................
你说软件延迟么?我是用硬件时钟TMR0
【 在 sweetfly 的大作中提到: 】
: 首先我觉得你没有时钟,仅仅是用延迟程序来判定时间,对于一个程序实现来说,有问题;
: 第二看你的问题大概就是说没有能够计数,你本来是想有一个“1”输出的,结果一直都没有实现,对吧?也就是说没有实现计数功能;
: 如果实在不行,你也可以用判断语句,是否是到了59啊?然后调用延迟语言就行啦。
不同芯片,不同cpu的汇编都不一样,所以基本上看不懂你的汇编语言。
只是不太明白,你的程序流程是怎么样的,首先执行MAIN,然后执行LOOP0,然后是LOOP1,最后一张在TEST里面循环?
也就是说,进入了TEST以后,设计意图上就是不允许再回到LOOP0和LOOP1的吧。
还是说你的LOOP0、LOOP1都是中断服务程序?
没有用中断,是顺序执行的,不再返回。我现在改了option_reg的设置,已经解决了,谢谢楼上两位热情解答~~谢谢啦~~^O^
【 在 ericyosho 的大作中提到: 】
: 不同芯片,不同cpu的汇编都不一样,所以基本上看不懂你的汇编语言。
: 只是不太明白,你的程序流程是怎么样的,首先执行MAIN,然后执行LOOP0,然后是LOOP1,最后一张在TEST里面循环?
: 也就是说,进入了TEST以后,设计意图上就是不允许再回到LOOP0和LOOP1的吧。
: ...................