BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #1495同步于 2008/10/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

单片机汇编程序的小问题,不知道发这里合不合适

cg0630
2008/10/4镜像同步8 回复
我在做一个秒表的程序,没有用时钟芯片,现在调试过程中发现有一点问题(绿色部分),想来请教一下。下面是部分程序,定义部分和一些子程序省略了。完整程序在附件里。 我是单独把这一段拿出来作为一个程序调试的,运行过程中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
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
cg0630机器人#1 · 2008/10/4
刚才忘了发完整程序的附件了 附件(6.4KB)
sweetfly机器人#2 · 2008/10/5
首先我觉得你没有时钟,仅仅是用延迟程序来判定时间,对于一个程序实现来说,有问题; 第二看你的问题大概就是说没有能够计数,你本来是想有一个“1”输出的,结果一直都没有实现,对吧?也就是说没有实现计数功能; 如果实在不行,你也可以用判断语句,是否是到了59啊?然后调用延迟语言就行啦。
sweetfly机器人#3 · 2008/10/5
汇编语言我很久都没有用了,忘记了不少,所以看的只是大概的,赫赫,千万别误人子弟就是了~~
ericyosho机器人#4 · 2008/10/5
啊,诡异的汇编…… 你可以看看T0IF的溢出位是怎么操作的,要看芯片资料。 有可能溢出以后,硬件不会帮你回0,所以以后检查的时候,溢出位永远都是满足条件的。 你可能需要手动复位。
cg0630机器人#5 · 2008/10/5
我写了BCF INTCON,T0IF 应该已经手动复位了啊 【 在 ericyosho 的大作中提到: 】 : 啊,诡异的汇编…… : 你可以看看T0IF的溢出位是怎么操作的,要看芯片资料。 : 有可能溢出以后,硬件不会帮你回0,所以以后检查的时候,溢出位永远都是满足条件的。 : ...................
cg0630机器人#6 · 2008/10/5
你说软件延迟么?我是用硬件时钟TMR0 【 在 sweetfly 的大作中提到: 】 : 首先我觉得你没有时钟,仅仅是用延迟程序来判定时间,对于一个程序实现来说,有问题; : 第二看你的问题大概就是说没有能够计数,你本来是想有一个“1”输出的,结果一直都没有实现,对吧?也就是说没有实现计数功能; : 如果实在不行,你也可以用判断语句,是否是到了59啊?然后调用延迟语言就行啦。
ericyosho机器人#7 · 2008/10/5
不同芯片,不同cpu的汇编都不一样,所以基本上看不懂你的汇编语言。 只是不太明白,你的程序流程是怎么样的,首先执行MAIN,然后执行LOOP0,然后是LOOP1,最后一张在TEST里面循环? 也就是说,进入了TEST以后,设计意图上就是不允许再回到LOOP0和LOOP1的吧。 还是说你的LOOP0、LOOP1都是中断服务程序?
cg0630机器人#8 · 2008/10/5
没有用中断,是顺序执行的,不再返回。我现在改了option_reg的设置,已经解决了,谢谢楼上两位热情解答~~谢谢啦~~^O^ 【 在 ericyosho 的大作中提到: 】 : 不同芯片,不同cpu的汇编都不一样,所以基本上看不懂你的汇编语言。 : 只是不太明白,你的程序流程是怎么样的,首先执行MAIN,然后执行LOOP0,然后是LOOP1,最后一张在TEST里面循环? : 也就是说,进入了TEST以后,设计意图上就是不允许再回到LOOP0和LOOP1的吧。 : ...................