5263|5

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

IO口的两种对外输出高电平的方式有何不同? [复制链接]

IO口输出一的方式有:
1、方向寄存器设置为输出,输出寄存器设置1
2、方向寄存器设置为输入,输出寄存器设置0,利用上拉产生1

请问:
那种方式比较好

方式2是我从别人的程序中看到的 他是模拟产生IIC的程序

最新回复

我从这里看到的 说明:BBUFF 为收发字节缓冲器; ICOUNT 为接收发送使用的计数器 SDA              EQU              080H                      ; 定义P6.7 为 SDA SDA              EQU              040H                      ; 定义P6.6 为 SCL BIC.B    #SCL+SDA,&P6OUT           ; 将SCL和SDA输出状态初始化为0 ;------------------------------------------------------------------------------- Read_I2C ;读取AT2402中指定地址单元数据的程序(实现图4的时序) ;------------------------------------------------------------------------------- MOV.B    # 0A0H,BBUFF     ; 将器件地址及控制代码放入收发缓冲器(设为写状态) CALL     #I2C_Start                ; 调用子程序完成启动、BBUFF发送、回应信号处理 MOV.B    #10H,BBUFF                ; 将指定单元地址放入收发缓冲器(指定地址为10H) CALL     #I2C_TX          ; 调用子程序完成BBUFF发送、回应信号处理                           ; 至此,AT2402准备好向MSP430提供指定单元数据 MOV.B    # 0A1h,BBUFF     ; 将器件地址控制代码放入收发缓冲器(设为读状态) CALL     #I2C_Start                ; 调用子程序完成启动、BBUFF发送、回应信号处理 CALL     #I2C_Read                 ; 调用子程序完成数据读取、回应信号处理 CALL     #I2C_Stop                 ; 调用子程序完成停止I2C总线命令时序 RET                                                 ; 返回 ;------------------------------------------------------------------------------- I2C_Start        ; 产生I2C总线启动时序子程序 BIC.B    #SCL+SDA,&P6DIR           ; SCL,SDA设为输入,由上拉电阻发送'1' BIS.B    #SDA,&P6DIR               ; SDA设为输出, SDA = 0 BIS.B    #SCL,&P6DIR               ; SCL设为输出, SCL = 0 ;------------------------------------------------------------------------------- I2C_TX   ; 发送一个字节子程序          MOV.B    #08,ICOUNT                         ; 计数器初始化为8 I2C_Send RLA.B    BBUFF                     ; 待发送的数据位移入进位位          JC       Send1                     ; 该位为1,跳转发送1 Send0    BIS.B    #SDA,&P6DIR               ; 该位为0,设SDA输出,SDA=0          JMP      Send_Bit                  ; 完成发送时序 Send1    BIC.B    #SDA,&P6DIR               ; SDA设为输入,SDA = 1 (上拉产生) Send_Bit BIC.B    #SCL,&P6DIR               ; SCL设为输入,SCL = 1 (上拉产生)          NOP                                ; 延时          BIS.B    #SCL,&P6DIR               ; SCL设为输出,SCL = 0          NOP                                ; 延时          DEC.B    ICOUNT                    ; 计数器减一          JNZ      I2C_Send                  ; 判断是否发送完毕,没有则继续发送下一位          BIC.B    #SDA,&P6DIR               ; 发送完毕,将SDA设为空闲状态,SDA = 1 (上拉产生) ;------------------------------------------------------------------------------- I2C_Ackn ; 从属器件发送的回应信号处理子程序          BIC.B    #SCL,&P6DIR               ; 设为输入,SCL = 1 (上拉产生) Ack_wait BIT.B    #SDA,&P6IN                         ; 检测是否有反馈信号          JNZ      Ack_wait                  ; 没有则继续检测          BIS.B    #SCL,&P6DIR               ; 接收到回应信号,SCL设为输出,SCL = 0          RET                                ; 返回 ;------------------------------------------------------------------------------- I2C_Read ; 读取一个字节子程序          MOV.B    #08,ICOUNT                         ; 初始化计数器为8 I2C_RX   BIC.B    #SCL,&P6DIR               ; 设为输入,SCL = 1 (上拉产生)            BIT.B    #SDA,&P6IN                         ; 检测接收位状态,结果保存在进位位中          RLC.B    BBUFF                     ; 将接收到的位保存在收发缓冲器中          BIS.B    #SCL,&P6DIR               ; 设为输出,SCL = 0          DEC.B    ICOUNT                    ; 计数器减一          JNZ      I2C_RX                    ; 判断所有位读取完毕,没有则继续          JMP      I2C_Ackn                  ; 读取完毕,跳转去处理回应信号 ;------------------------------------------------------------------------------- I2C_Stop ; 产生I2C停止时序子程序 BIS.B    #SDA,&P6DIR                        ; 设为输出,SDA = 0 BIC.B    #SCL,&P6DIR                        ; 设为输入,SCL = 1 (上拉产生) BIC.B    #SDA,&P6DIR                        ; 设为输入,SDA = 1 (上拉产生) I2C_End  RET  详情 回复 发表于 2007-1-18 14:06
 
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
2、方向寄存器设置为输入,这是输入方式了!!!
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
同意2楼说法!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
都一样
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

5
 
第二种方法驱动能力更强一点.
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
我从这里看到的

说明:BBUFF 为收发字节缓冲器; ICOUNT 为接收发送使用的计数器

SDA EQU 080H ; 定义P6.7 为 SDA
SDA EQU 040H ; 定义P6.6 为 SCL
BIC.B #SCL+SDA,&P6OUT ; 将SCL和SDA输出状态初始化为0
;-------------------------------------------------------------------------------
Read_I2C ;读取AT2402中指定地址单元数据的程序(实现图4的时序)
;-------------------------------------------------------------------------------
MOV.B # 0A0H,BBUFF ; 将器件地址及控制代码放入收发缓冲器(设为写状态)
CALL #I2C_Start ; 调用子程序完成启动、BBUFF发送、回应信号处理
MOV.B #10H,BBUFF ; 将指定单元地址放入收发缓冲器(指定地址为10H)
CALL #I2C_TX ; 调用子程序完成BBUFF发送、回应信号处理
; 至此,AT2402准备好向MSP430提供指定单元数据
MOV.B # 0A1h,BBUFF ; 将器件地址控制代码放入收发缓冲器(设为读状态)
CALL #I2C_Start ; 调用子程序完成启动、BBUFF发送、回应信号处理
CALL #I2C_Read ; 调用子程序完成数据读取、回应信号处理
CALL #I2C_Stop ; 调用子程序完成停止I2C总线命令时序
RET ; 返回
;-------------------------------------------------------------------------------
I2C_Start ; 产生I2C总线启动时序子程序
BIC.B #SCL+SDA,&P6DIR ; SCL,SDA设为输入,由上拉电阻发送'1'
BIS.B #SDA,&P6DIR ; SDA设为输出, SDA = 0
BIS.B #SCL,&P6DIR ; SCL设为输出, SCL = 0
;-------------------------------------------------------------------------------
I2C_TX ; 发送一个字节子程序
MOV.B #08,ICOUNT ; 计数器初始化为8
I2C_Send RLA.B BBUFF ; 待发送的数据位移入进位位
JC Send1 ; 该位为1,跳转发送1
Send0 BIS.B #SDA,&P6DIR ; 该位为0,设SDA输出,SDA=0
JMP Send_Bit ; 完成发送时序
Send1 BIC.B #SDA,&P6DIR ; SDA设为输入,SDA = 1 (上拉产生)
Send_Bit BIC.B #SCL,&P6DIR ; SCL设为输入,SCL = 1 (上拉产生)
NOP ; 延时
BIS.B #SCL,&P6DIR ; SCL设为输出,SCL = 0
NOP ; 延时
DEC.B ICOUNT ; 计数器减一
JNZ I2C_Send ; 判断是否发送完毕,没有则继续发送下一位
BIC.B #SDA,&P6DIR ; 发送完毕,将SDA设为空闲状态,SDA = 1 (上拉产生)
;-------------------------------------------------------------------------------
I2C_Ackn ; 从属器件发送的回应信号处理子程序
BIC.B #SCL,&P6DIR ; 设为输入,SCL = 1 (上拉产生)
Ack_wait BIT.B #SDA,&P6IN ; 检测是否有反馈信号
JNZ Ack_wait ; 没有则继续检测
BIS.B #SCL,&P6DIR ; 接收到回应信号,SCL设为输出,SCL = 0
RET ; 返回
;-------------------------------------------------------------------------------
I2C_Read ; 读取一个字节子程序
MOV.B #08,ICOUNT ; 初始化计数器为8
I2C_RX BIC.B #SCL,&P6DIR ; 设为输入,SCL = 1 (上拉产生)
BIT.B #SDA,&P6IN ; 检测接收位状态,结果保存在进位位中
RLC.B BBUFF ; 将接收到的位保存在收发缓冲器中
BIS.B #SCL,&P6DIR ; 设为输出,SCL = 0
DEC.B ICOUNT ; 计数器减一
JNZ I2C_RX ; 判断所有位读取完毕,没有则继续
JMP I2C_Ackn ; 读取完毕,跳转去处理回应信号
;-------------------------------------------------------------------------------
I2C_Stop ; 产生I2C停止时序子程序
BIS.B #SDA,&P6DIR ; 设为输出,SDA = 0
BIC.B #SCL,&P6DIR ; 设为输入,SCL = 1 (上拉产生)
BIC.B #SDA,&P6DIR ; 设为输入,SDA = 1 (上拉产生)
I2C_End RET
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表