打印

PIC汇编程序解惑!

[复制链接]
1949|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tsense|  楼主 | 2010-3-31 23:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手求教一个程序问题:
1、下段程序HEX转BCD有啥问题,为何不工作:
BCD_T ;HEX转BCD(压缩),范围0~256  
    MOVF COUNT ;源数据存在COUNT中
HEX2BCD_LED2
    SUBLW D'100'        ;判断百位
    SKPC  
    GOTO HEX2BCD_LED1
    INCF LED2
    GOTO HEX2BCD_LED2
HEX2BCD_LED1
    SUBLW D'10'       ;判断十位
    SKPC  
    MOVWF  LED0     ;个位直接写入LED0
    INCF LED1
    GOTO HEX2BCD_LED1
RETURN
沙发
tsense|  楼主 | 2010-3-31 23:38 | 只看该作者
还有一段中断子程序是实现0-9999计数的,可是总是到999就清零了,调试了几天也没搞明白:
TMR0SER      ;中断服务程序
  MOVWF W_TEMP   ;将W内容备份
  SWAPF STATUS,W
  CLRF STATUS
  MOVWF S_TEMP   ;将STATUS备份
  MOVFW        PCLATH
  MOVWF        P_TEMP
  MOVFW        FSR
  MOVWF        F_TEMP
  CLRF        PCLATH
DIGIT0
  MOVF LED0,W
  SUBLW D'9'
  BTFSC STATUS,Z
  GOTO DIGIT1
  INCF LED0,F   
  GOTO TEMP_RE   
DIGIT1
  CLRF LED0
  MOVF LED1,W
  SUBLW D'9'
  BTFSC STATUS,Z  
  GOTO DIGIT2
  INCF LED1,F
  GOTO TEMP_RE
DIGIT2
  CLRF LED0
  CLRF LED1
  MOVF LED2,W
  SUBLW D'9'  
  BTFSC STATUS,Z  
  GOTO DIGIT3
  INCF LED2,F
  GOTO TEMP_RE
DIGIT3
  CLRF LED0
  CLRF LED1
  CLRF LED2
  MOVF LED3,W
  SUBLW  D'9'  
BTFSC STATUS,Z
INCF LED3,F
TEMP_RE
  BCF PIR1,TMR1IF  ;清除TMR1中断溢出标志
  CLRF  STATUS
  MOVFW        P_TEMP
  MOVWF        PCLATH
  MOVFW        S_TEMP
  MOVWF        STATUS
  SWAPF        W_TEMP,F
  SWAPF        W_TEMP,W
RETFIE       

好像程序根本就不进DIGIT3的地方,奇怪的要死

使用特权

评论回复
板凳
stonejust| | 2010-4-1 11:54 | 只看该作者
本帖最后由 stonejust 于 2010-4-1 11:56 编辑

本人水平一般,班门弄斧一下。首先,楼主对命令很不熟悉。养成习惯,首句应该写成MOVF COUNT,W 易懂。其次,HEX2BCD应该用COUNT减100、10计数,楼主使用SUBLW是立即数减w。时间不多先解决一个,下面的程序你参考下。
BCD_T
MOVLW D'100'
SUBWF COUNT_GEWEI,W
BTFSS STATUS,C
GOTO SWJY
MOVWF COUNT_GEWEI
INCF COUNT_BAIWEI,F
GOTO BCD_T
SWJY
MOVLW D'10'
SUBWF COUNT_GEWEI,W
BTFSS STATUS,C
RETURN
MOVWF COUNT_GEWEI
INCF COUNT_SHIWEI,F
GOTO SWJY

使用特权

评论回复
地板
兰天白云| | 2010-4-1 12:25 | 只看该作者
??本句有误,本句的意思是100-W,应该改成W-100,详见以下解释


1、下段程序HEX转BCD有啥问题,为何不工作:
BCD_T ;HEX转BCD(压缩),范围0~256  
    MOVF COUNT ;源数据存在COUNT中
HEX2BCD_LED2
    SUBLW D'100'        ;判断百位     ??本句有误,本句的意思是100-W,应该改成W-100
    SKPC  
    GOTO HEX2BCD_LED1
    INCF LED2
    GOTO HEX2BCD_LED2
HEX2BCD_LED1
    SUBLW D'10'       ;判断十位
    SKPC  
    MOVWF  LED0     ;个位直接写入LED0
    INCF LED1
    GOTO HEX2BCD_LED1
RETURN

使用特权

评论回复
5
tsense|  楼主 | 2010-4-1 14:28 | 只看该作者
来鞠个躬!感谢感谢!
谁能帮看看第二个程序为何不转到千位计数呢?到百位到9就结束了!

使用特权

评论回复
6
兰天白云| | 2010-4-1 14:46 | 只看该作者
你自己也要仔细分析吧

使用特权

评论回复
7
tsense|  楼主 | 2010-4-2 09:58 | 只看该作者
好像还是不行,有个问题,状态字什么时候会变化,248减去200不会变化,减去300一定会变化,那么
如果是248这个数减去50那么状态字Z会变化吗?没有溢出应该不会变化。

使用特权

评论回复
8
tsense|  楼主 | 2010-4-2 10:02 | 只看该作者
本人水平一般,班门弄斧一下。首先,楼主对命令很不熟悉。养成习惯,首句应该写成MOVF COUNT,W 易懂。其次,HEX2BCD应该用COUNT减100、10计数,楼主使用SUBLW是立即数减w。时间不多先解决一个,下面的程序你参考下。 ...
stonejust 发表于 2010-4-1 11:54


分析这个程序觉得奇怪,为什么减去100后的数据要放在W中呢
这样后面有来一句MOVWF COUNT_GEWEI
我减完结果直接存在COUNT_GEWEI中不是省去后面一句了吗?
还是其中有什么奥妙?

使用特权

评论回复
9
stonejust| | 2010-4-2 16:38 | 只看该作者
保护COUNT_GEWEI,如果减过了,数值就不对了,还怎么计算下面的。

使用特权

评论回复
10
兰天白云| | 2010-4-3 14:21 | 只看该作者
状态字有C、Z等,C表示进位或借位,Z表示0或非0
有些指令影响C,Z  有些指令只影响C,仔细看指令

使用特权

评论回复
11
tsense|  楼主 | 2010-4-4 22:32 | 只看该作者
原来是减过了,多谢九楼现在搞定了,不过是两位的(BCD),三位搞不出来
不能显示千位的也解决了,将DIGIT3循环的BTFSC STATUS,Z
改成BTFSS就可以了,有点昏头

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

9

帖子

1

粉丝