打印

菜鸟求助PIC16F72的I/O口奇怪问题!

[复制链接]
1905|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
loyou1993|  楼主 | 2012-11-15 17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前在论坛搜索了PIC16F72的I/O问题,初始化我已经关闭了模拟功能,可是RA0,RA3,RA4还是不能进行位操作,也是用送数据得到PORTA就行?求助各位高手!
沙发
与时俱进| | 2012-11-15 22:34 | 只看该作者
“也是用送数据得到PORTA就行?”-------什么意思?

使用特权

评论回复
板凳
yewuyi| | 2012-11-16 09:04 | 只看该作者
送数据怎么能得到IO值?

在PIC16老型号上,因为没有输出缓冲寄存器,所以要注意读-修改-写现象,针对这些,最好的办法就是自己用变量模拟一个IO输出缓冲继电器,例如:
unsigned char PortCBuf;
想位操作PORTC时,先操作PortCBuf中对应的位,然后执行PORTC=PortCBuf;

使用特权

评论回复
地板
loyou1993|  楼主 | 2012-11-16 09:11 | 只看该作者
“也是用送数据得到PORTA就行?”-------什么意思?
与时俱进 发表于 2012-11-15 22:34
就是说直接送数据就能行,位操作不行!

使用特权

评论回复
5
yewuyi| | 2012-11-16 10:25 | 只看该作者
就是说直接送数据就能行,位操作不行!
loyou1993 发表于 2012-11-16 09:11



位操作不是不行,但需要注意外部电路设计不当造成的读-修改-写现象,根据编写代码的通用原则,要尽量降低软件和硬件的耦合度,尽量降低彼此之间的互相作用,根据这个原则,那么最好的方式显然就是使用这个IO输出缓冲寄存器比较好勒。

使用特权

评论回复
6
loyou1993|  楼主 | 2012-11-16 13:07 | 只看该作者
本帖最后由 loyou1993 于 2012-11-16 13:23 编辑
位操作不是不行,但需要注意外部电路设计不当造成的读-修改-写现象,根据编写代码的通用原则,要尽量降低软件和硬件的耦合度,尽量降低彼此之间的互相作用,根据这个原则,那么最好的方式显然就是使用这个IO输出 ...
yewuyi 发表于 2012-11-16 10:25
多谢版主,试过了,可惜还是不行!贴下代码!SEGDATA    EQU     20H
SEGWELA    EQU     21H
N0               EQU    23H
N1                EQU   24H
COUNT          EQU   25H
SEG_COUNT  EQU   26H
TMP595        EQU    27H
;※※※※※※※※程序开始※※※※※※※※

ORG  00H
GOTO STATR
;※※※※※※※※段选表※※※※※※※※※
TABLE1
ADDWF PCL,1
RETLW  3FH
RETLW  06H
RETLW   5BH
RETLW   4FH
RETLW   66H
RETLW   6DH
RETLW   7DH
;※※※※※※※※位选表※※※※※※※※※
TABLE2
ADDWF PCL,1
RETLW 7FH
RETLW 0BFH
RETLW 0DFH
RETLW  0EFH
RETLW  0F7H
RETLW 0FBH
;※※※※※※※※程序初始化※※※※※※※
STATR
BSF  STATUS,RP0
BCF  STATUS,RP1
CLRF   OPTION_REG
MOVLW   06H
MOVWF  ADCON1
CLRF   TRISA
BCF   STATUS,RP0BCF   STATUS,RP1MOVLW 00H
MOVWF  PORTA
MOVLW   0FH
MOVWF SEGDATA
CLRF    SEGWELA
CLRF   SEG_COUNT
;※※※※※※※※主程序※※※※※※※※※
MAIN
CALL   TIME2
CALL   SEG_display
INCF   SEG_COUNT
MOVF   SEG_COUNT,W
SUBLW   06H
BTFSS  STATUS,Z
CLRF   SEG_COUNT
GOTO  MAIN
;※※※※※※数码管显示程序※※※※※※※  SEG_display

MOVLW  SEG_COUNT
CALL TABLE1
MOVWF  SEGDATA
CALL  SEG_d595
MOVLW SEG_COUNT
CALL  TABLE2
MOVWF  SEGWELA
CALL  SEG_w595
RETURN
;※※※※※※段选595送数据※※※※※※※SEG_d595

MOVLW 8
MOVWF COUNT
BCF  STATUS,C   LOOP
BCF TMP595,2
MOVLW TMP595
MOVWF PORTA
NOP
RLF SEGDATA,F
BTFSS STATUS,C
CALL TMP595_0
BTFSC STATUS,C
CALL TMP595_1
BSF TMP595,2
MOVLW TMP595
MOVWF PORTA
DECFSZ COUNT,F
GOTO LOOP
BCF TMP595,1
MOVLW TMP595
MOVWF  PORTA
BSF   TMP595,1
MOVLW  TMP595
MOVWF  PORTA
RETURN  
TMP595_0

BCF  TMP595,0
MOVLW   TMP595
MOVWF   PORTA
RETURN TMP595_1


BSF    TMP595,0
MOVLW  TMP595
MOVWF  PORTA
RETURN
;※※※※※※位选595送数据※※※※※※※SEG_w595

MOVLW 8
MOVWF COUNT
BCF  STATUS,C  
LOOP1
BCF  TMP595,5
MOVLW  TMP595
MOVWF  PORTA
NOP
RLF  SEGDATA,F
BTFSS  STATUS,C
CALL   TMP595_00
BTFSC  STATUS,C
CALL  TMP595_11
BSF  TMP595,5
MOVLW   TMP595
MOVWF  PORTA
DECFSZ  COUNT,F
GOTO   LOOP1
BCF   TMP595,4
MOVLW   TMP595
MOVWF  PORTA
BSF  TMP595,4
MOVLW  TMP595
MOVWF  PORTA
RETURN
TMP595_00
BCF TMP595,3
MOVLW  TMP595
MOVWF  PORTA
RETURN
TMP595_11
BSF TMP595,3
MOVLW TMP595
MOVWF PORTA
RETURN
;※※※※※※※※延时2ms※※※※※※※※
TIME2
MOVLW  0XFC
MOVWF N1
MOVLW 0X5B
MOVWF N0
INCFSZ N0
GOTO  $-1
INCFSZ  N1
GOTO  $-5
RETURN
;※※※※※※※※程序结束※※※※※※※※

END

使用特权

评论回复
7
yewuyi| | 2012-11-16 17:23 | 只看该作者
已经多年不看ASM代码,生疏了,这些代码你还自己一条条调吧。。。

使用特权

评论回复
8
dcfj2012| | 2012-11-23 21:40 | 只看该作者
I/O位操作应该用Lata0,直接用RA0不行,要latch一把

使用特权

评论回复
9
dcfj2012| | 2012-11-23 21:40 | 只看该作者
I/O位操作应该用Lata0,直接用RA0不行,要latch一把

使用特权

评论回复
10
dcfj2012| | 2012-11-23 21:40 | 只看该作者
I/O位操作应该用Lata0,直接用RA0不行,要latch一把

使用特权

评论回复
11
micropower| | 2012-11-25 23:03 | 只看该作者
9# dcfj2012 三楼不都说了么,没有输出缓冲寄存器。PIC16F72这种老片子上哪找LAT寄存器???

使用特权

评论回复
12
兰天白云| | 2012-11-26 18:03 | 只看该作者
如果位操作不行,那硬件一定有缺陷,楼主可以在A楼接一个10K电阻到地,看看你操作输出是否正常

使用特权

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

本版积分规则

个人签名:默默的学习……慢慢的成长!

23

主题

333

帖子

3

粉丝