说明上说CH376占用两个地址位,一个命令端口,一个数据端口,可是它只有一个并口,参考程序中设置了两个地址位, CH376_CMD_PORT EQU 0BDF1H ; CH376命令端口的I/O地址 CH376_DAT_PORT EQU 0BCF0H ; CH376数据端口的I/O地址 这是什么意思呢? 用单片机并口与CH376通信,是应该用MOV指令,还是MOVX指令?我用MOV指令给单片机并口指令代码,为什么CH376没有接收到命令呢?而提供的程序中,都是用MOVX指令,例如 ; 向CH376写命令 ; 输入: A 命令 ; 使用: A, DPTR xWriteCH376Cmd: MOV DPTR,#CH376_CMD_PORT ;命令端口 MOVX @DPTR,A NOP ;延时确保读写周期大于1.5uS RET 难道是把CH376认为是外部存储器吗? 刚买的CH376,好多问题不明白,还请高手们指点迷津哈!
这是给376分配的2个总线地址,访问总线,当然用MOVX指令了,就是把376当成一个占2地址的外部RAM
我现在是直接用单片机的并口通信,没有用总线,应该是IO口模拟,不需要定义地址总线吧!现在的问题是我无法实现检测联机。硬件应该没问题的。 帮忙看看我的程序,谢谢哈! $include (c8051f020.inc) RD BIT P2.3 WR BIT P2.2 AO BIT P2.1 PCS BIT P2.0 LED BIT P1.6 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV WDTCN,#0DEH MOV WDTCN,#0ADH;关闭看门狗 MOV OSCICN,#97H;设置内部振荡器为系统时钟,16MHZ系统时钟 LCALL CS_F020 LCALL CS_CH376 SJMP $
;C8051F020初始化 CS_F020: MOV XBR0,#00H MOV XBR1,#00H MOV XBR2,#40H;启动交叉开关 MOV P3MDOUT,#0FFH;设置P3口输出方式为推挽 MOV P2MDOUT,#0FH;设置P2口低四位输出方式为推挽 MOV P1MDOUT,#40H ;MOV P1,#00H MOV P2,#01H;不选中CH376 ;MOV P3,#00H RET
;CH376初始化 CS_CH376: ;MOV P3,#05H ;MOV P2,#0A0H;选中CH376,CH376芯片读选通,向CH376芯片写命令 ACALL YS1 LJ_CH376: MOV P3,#06H;检测联机命令 MOV P2,#0AH;选中CH376,CH376芯片读选通,向CH376芯片写命令 ACALL YS MOV P2,#0CH;选中CH376,但不进行任何操作 ACALL YS MOV P3,#0AAH;向P3端口写数据 MOV P2,#08H;向CH376芯片写数据 ACALL YS MOV P2,#0CH ACALL YS MOV P3MDOUT,#00H MOV P3,#0FFH;设定P3为输入模式 MOV P2,#04H;从CH376的数据端口读出数据 ACALL YS MOV A,P3;读出CH376返回数据 CJNE A,#55H,LJ_CH376;相等则说明联机成功,不相等则重新检测 CLR P1.6;点亮绿灯
X1:RET
;延时10微妙 YS:MOV R1,#10 DJNZ R1,$ RET
;延时50毫秒 YS1:MOV R0,#255 YS2:MOV R2,#255 DJNZ R2,$ DJNZ R0,YS2 RET END
你的程序很怪,怎么没有看到WR的操作?而且写命令时A0=1,写数据的时候A0=0,这些变化都没有看到啊!怎么写进去数据?
我定义的WR是P2.2,AO是片P2.1,直接对P2口赋值,不就是对WR河AO的操作吗?