搜索
bottom↓
回复: 13

大家来看看这个简单的汇编程序,分析下原因

[复制链接]

出0入0汤圆

发表于 2008-5-24 16:05:26 | 显示全部楼层 |阅读模式
;********************************************************************               
LIST P=16F737     
#include <P16F737.inc>

L1       EQU  31H    ;廷时变量
L2       EQU  32H
L3       EQU  33H
LED_TEMP EQU  30H

;-------------------------


         ORG 0000H              ; 程序从零地址开始
         GOTO star
         ORG 0005H
star:
         CLRF PORTB           ;初始化I/O口
         CLRF PORTA
         BCF STATUS,RP1
         BSF STATUS,RP0       ;设置数据寄存器体1
             MOVLW H'00'  
         MOVWF TRISB          ; 设置PORTB 全部IO为输出
         MOVLW H'FF'
         MOVWF TRISA          ;全部为输入设置PORTA
         BCF STATUS,RP0       ;恢复数据寄存器体0
     
         MOVLW 00H
         MOVWF LED_TEMP       ;PORTB的临时变量初始化为0
         
LOOP:
         BTFSS PORTA,4        ;判断A4口是否有键按下
         GOTO  ST_1
         GOTO  LOOP (按键没按下时,为什么这里老是不能调到LOOP,而是往下执行,往下执行时,调试看到W寄存器的值出错了)
ST_1:
         MOVLW 0FFH             ;送ffH到W
         XORWF LED_TEMP,1       ;取反PORTB临时变量
         MOVF  LED_TEMP,0       ;送临时变量到W
         MOVWF PORTB            ;临时变量送到PORTB
        
         GOTO LOOP
         END

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2008-5-24 16:06:05 | 显示全部楼层
我刚用汇编的,以前都用C.

出0入0汤圆

 楼主| 发表于 2008-5-24 16:20:03 | 显示全部楼层
怎么没人回答呀??刚刚学PIC就碰到这种问题了,以前用AVR的

出0入0汤圆

发表于 2008-5-24 17:12:15 | 显示全部楼层
PORTA,4是开漏结构, 需要注意.

出0入0汤圆

 楼主| 发表于 2008-5-24 17:31:00 | 显示全部楼层
已经接上拉电阻的了。现在的问题是;GOTO LOOP,不能正确跳到LOOP,不知道是否还需设置什么,我用MPLAV IDE 2仿真,它老跳到下一句即:MOVLW 0FFH ,此时,W寄存器的值不是FFH,之后就一直错下去了。

出0入0汤圆

 楼主| 发表于 2008-5-24 17:37:16 | 显示全部楼层
刚才用MPLAB SIM 调试,就能正确。不知道是不是配置寄存器配置不好呢?目标板的晶振是4M的,我把他配置为HS了

出0入0汤圆

发表于 2008-5-24 18:52:21 | 显示全部楼层
BANKSEL  TRISA          ;选择体1
   MOVLW    06H
   MOVWF    ADCON1         ;定义A口为IO口
   MOVLW    00H
   MOVWF    TRISA          ;PORTA设置为输出
   MOVWF    TRISC          ;PORTC设置为输出
   MOVLW    0C0H


A口初始化不对  看看我的A口初始化

出0入0汤圆

 楼主| 发表于 2008-5-26 11:17:48 | 显示全部楼层
6楼你的做法我也做了,现在出现新问题了:最后的GOTO loop有问题,它不会跳到LOOP那里的,调试器看出它老跑到0076H那里。现在把这两条指令去掉:XORWF LED_TEMP,1       ;取反PORTB临时变量
                MOVF  LED_TEMP,0       ;送临时变量到W
正常了!

所以现在怀疑是因为对LED_TEMP(30H)进行操作,改到了什么东西了。我中断也没开的,怎么它就老跳到76H那去了,真是郁闷,刚学这个东西就碰到这些怪怪的问题。我现在的程序改成:LIST P=16F737     
#include <P16F737.inc>
__CONFIG    _CONFIG1,  _CP_OFF & _CCP2_RC1 & _DEBUG_OFF & _VBOR_2_0 & _BOREN_0 & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
__CONFIG    _CONFIG2,  _BORSEN_0 & _IESO_OFF & _FCMEN_OFF


L1       EQU  31H    ;廷时变量
L2       EQU  23H
L3       EQU  33H
LED_TEMP EQU  30H

;-------------------------


         ORG 0000H              ; 程序从零地址开始
         GOTO star
;         ORG 0005H
star
         BCF STATUS,RP1
         BSF STATUS,RP0       ;设置数据寄存器体1
         MOVLW 0FH
         MOVWF ADCON1
             MOVLW 00H  
         MOVWF TRISB          ; 设置PORTB 全部IO为输出
         MOVLW 0FFH
         MOVWF TRISA          ;全部为输入设置PORTA
         BCF STATUS,RP0       ;恢复数据寄存器体0
        ; CLRF PORTB           ;初始化I/O口
        ; CLRF PORTA
         MOVLW 00H
         MOVWF LED_TEMP       ;PORTB的临时变量初始化为0      
loop
         BTFSS PORTA,4        ;判断A4口是否有键按下
         GOTO  ST
         GOTO  loop
ST
        MOVLW 0FFH             ;送ffH到W
         ;XORWF LED_TEMP,1       ;取反PORTB临时变量(已删除)
         ;MOVF  LED_TEMP,0       ;送临时变量到W(已删除)
         MOVWF L1
         MOVWF PORTB            ;临时变量送到PORTB
         GOTO  loop(这里老跳不到loop,而是跳到76H)
         END

出0入0汤圆

 楼主| 发表于 2008-5-26 14:21:19 | 显示全部楼层
好像,是好像。ST下面的语句不能超过3句,超过据不正常,不超过就正常

出0入0汤圆

 楼主| 发表于 2008-5-26 15:27:11 | 显示全部楼层
问题解决了!

问题出在ICD 2的编程范围设置,默认的设置是19个单位,所以ST下面多于3句就超出范围了。把它改大点,一切正常!大意了

出0入0汤圆

发表于 2008-6-4 15:42:06 | 显示全部楼层
;XORWF LED_TEMP,1       ;取反PORTB临时变量(已删除)
         ;MOVF  LED_TEMP,0       ;送临时变量到W(已删除)
其实这个用
         ;XORWF LED_TEMP,f       ;取反PORTB临时变量(已删除)
         ;MOVF  LED_TEMP,w       ;送临时变量到W(已删除)
看了会更明了点的,
我问个问题哦:
#include <P16F737.inc>
__CONFIG    _CONFIG1,  _CP_OFF & _CCP2_RC1 & _DEBUG_OFF & _VBOR_2_0 & _BOREN_0 & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
__CONFIG    _CONFIG2,  _BORSEN_0 & _IESO_OFF & _FCMEN_OFF
这个在哪儿可以看,我才用了16f87X 16f7x系列 对初试设置不了解,希望谁能讲的详细点,当然要留点探索的余地,谢谢!

出0入0汤圆

发表于 2008-6-4 20:28:57 | 显示全部楼层
问下:默认是19个单位?在哪里可以看到?在哪里可以更改?

出0入0汤圆

发表于 2008-6-4 23:44:05 | 显示全部楼层
默认是19个单位,是什么意思?请解释一下。

出0入0汤圆

发表于 2008-6-4 23:44:12 | 显示全部楼层
默认是19个单位,是什么意思?请解释一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 20:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表