请教高手pic与7290的通信问题,系统程序如下。当不加7290的初始化程序时,可以正常显示,加上后 数码管直接没反应。。。实在想不出来为什么。。。望高手能指教一二。<br /><br />LIST P=16F877A<br />INCLUDE P16F877A.INC<br /><br />ORG 00H<br />NOP<br />GOTO MAIN<br /><br />;*******************************主程序********************************<br />MAIN<br />;=====================I/O端口方向寄存器初始化=========================<br /> BSF STATUS,5<br /> MOVLW 00H<br /> MOVWF TRISA<br /> MOVLW 01H<br /> MOVWF TRISB<br /> MOVLW 18H<br /> MOVWF TRISC<br /> CLRF TRISD<br /><br /> BCF STATUS,5<br />CALL INIT_IIC ;IIC初始化程序 <br />CALL INIT_7290<br />MOVLW 70H ;第一个数码管显示8<br />MOVWF SLAVE_ADDR<br />MOVLW 10H<br />MOVWF DATA_ADDR<br />MOVLW 0FFH<br />MOVWF DATA_WRITE<br />CALL IIC_WRITE<br /><br />GOTO $<br /><br /> <br /><br />;******************************IIC初始化程序*******************************<br />INIT_IIC <br /> BSF STATUS,5<br /> BSF TRISC,4 ;数据端SDA定义为输入<br /> BSF TRISC,3 ;时钟端SCL定义为输入<br />BSF TRISB,0<br /> MOVLW 09H ;波特率设定为100khz<br /> MOVWF SSPADD ;波特率寄存器初始化<br /> BCF SSPSTAT,6 ;输入电平遵循IIC规范<br /> BSF SSPSTAT,7 ;关闭转换率控制<br /> BCF STATUS,5<br /> MOVLW 38H<br /> MOVWF SSPCON ;单片机设定为主控方式,使能MSSP口<br /> RETURN<br /><br /><br />;**************************键盘、显示芯片初始化***************************<br />INIT_7290<br /> MOVLW 70H ;7290从器件地址+1位写控制位<br /> MOVWF SLAVE_ADDR<br /> MOVLW 0CH ;闪烁周期控制寄存器FlashOnOff地址<br /> MOVWF DATA_ADDR<br /> MOVLW 22H ;控制数码管闪烁周期在1秒左右<br /> MOVWF DATA_WRITE<br /> CALL IIC_WRITE<br /> INCF DATA_ADDR,1 ;扫描位数寄存器ScanNum对应地址<br /> MOVLW 07H<br /> MOVWF DATA_WRITE ;控制8位数码管都发光<br /> CALL IIC_WRITE<br /> RETURN<br /><br /><br /> <br /><br /> <br /><br />IIC_WRITE<br />;===========================检测总线是否空闲==============================<br /> BSF STATUS,5<br />IICW_LP1 BTFSC SSPSTAT,2 <br /> GOTO IICW_LP1 <br />IICW_LP2 MOVF SSPCON2,0<br /> ANDLW 1FH<br /> BTFSS STATUS,2 <br /> GOTO IICW_LP2 <br />;======================建立总线启动信号并开始发送从地址=====================<br /> BSF SSPCON2,SEN ;建立总线启动信号<br />IICW_LP3 BCF STATUS,5<br /> BTFSS PIR1,SSPIF ;判断是否发生MSSP中断<br /> GOTO IICW_LP3 ;否,继续检测<br />;===============================应答信号检测================================<br /> MOVF SLAVE_ADDR,0 ;是,从器件地址+1位写控制位<br /> BCF STATUS,5<br /> MOVWF SSPBUF ;待发送字节载入缓冲器并启动发送<br /> BCF PIR1,SSPIF ;清中断标志位<br />IICW_LP4 BTFSS PIR1,SSPIF ;检测是否有新的MSSP中断<br /> GOTO IICW_LP4 ;否,继续检测<br /> BSF STATUS,5<br />IICW_LP5 BTFSC SSPSTAT,BF ;检测寄存器满标志位是否清零<br /> GOTO IICW_LP5 ;否,继续检测<br /> BCF STATUS,5<br />MOVF DATA_ADDR,0 ;待写入的从器件单元地址<br /> MOVWF SSPBUF<br />;===============================应答信号检测================================<br /> BCF PIR1,SSPIF <br />IICW_LP6 BTFSS PIR1,SSPIF <br /> GOTO IICW_LP6<br /> BSF STATUS,5<br />IICW_LP7 BTFSC SSPSTAT,BF <br /> GOTO IICW_LP7<br />MOVF DATA_WRITE,0 ;待写入的数据字节<br /> BCF STATUS,5<br /> MOVWF SSPBUF<br />;================================应答信号检测================================<br /> BCF PIR1,SSPIF <br />IICW_LP8 BTFSS PIR1,SSPIF <br /> GOTO IICW_LP8<br /> BCF PIR1,SSPIF<br /> BSF STATUS,5<br /> BSF SSPCON2,PEN ;停止信号时序使能<br /> BCF STATUS,5<br /> BCF PIR1,SSPIF ;清中断标志位<br />RETURN<br /><br /><br />;***************************延时10毫秒子程序*******************************<br />DELAY10<br /> MOVLW 0CH<br /> MOVWF DLY1<br />DLY_LP1 MOVLW 0FFH<br /> MOVWF DLY2<br />DLY_LP2 DECFSZ DLY2,1<br /> GOTO DLY_LP2<br /> DECFSZ DLY1,1<br /> GOTO DLY_LP1<br />RETURN<br /><br />END<br /> |
|