• 王官夫的SCCB


    ///////////////////////////////////////////////////////////////////////////
    //功能:写OV7660寄存器
    //返回:1-成功 0-失败
    //guanfu_wang
    unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
    {
    startSCCB();//发送SCCB 总线开始传输命令
    if(0==SCCBwriteByte(0x42))//写地址
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    delay_us(100);
       if(0==SCCBwriteByte(regID))//积存器ID
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    delay_us(100);
       if(0==SCCBwriteByte(regDat))//写数据到积存器
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
       stopSCCB();//发送SCCB 总线停止传输命令

       return(1);//成功返回
    }
    ////////////////////////////
    //功能:读OV7660寄存器
    //返回:1-成功 0-失败
    //guanfu_wang
    unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
    {
    //通过写操作设置寄存器地址
    startSCCB();
    if(0==SCCBwriteByte(0x42))//写地址
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    delay_us(100);
       if(0==SCCBwriteByte(regID))//积存器ID
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    stopSCCB();//发送SCCB 总线停止传输命令

    delay_us(100);

    //设置寄存器地址后,才是读
    startSCCB();
    if(0==SCCBwriteByte(0x43))//读地址
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    delay_us(1000);
       *regDat=SCCBreadByte();//返回读到的值
       noAck();//发送NACK命令
       stopSCCB();//发送SCCB 总线停止传输命令
       return(1);//成功返回
    }


    /*
    -----------------------------------------------
       功能: start命令,SCCB的起始信号
       参数: 无
     返回值: 无
    -----------------------------------------------
    */
    void startSCCB(void)
    {
        SCCB_SID_H();     //数据线高电平
        delay_us(500);

        SCCB_SIC_H();    //在时钟线高的时候数据线由高至低
        delay_us(500);
     
        SCCB_SID_L();
        delay_us(500);

        SCCB_SIC_L();  //数据线恢复低电平,单操作函数必要
        delay_us(500);


    }
    /*
    -----------------------------------------------
       功能: stop命令,SCCB的停止信号
       参数: 无
     返回值: 无
    -----------------------------------------------
    */
    void stopSCCB(void)
    {
        SCCB_SID_L();
        delay_us(500);
     
        SCCB_SIC_H();
        delay_us(500);
      

        SCCB_SID_H();
        delay_us(500);
       
    }

    /*
    -----------------------------------------------
       功能: noAck,用于连续读取中的最后一个结束周期
       参数: 无
     返回值: 无
    -----------------------------------------------
    */
    void noAck(void)
    {

    SCCB_SID_H();
    delay_us(500);

    SCCB_SIC_H();
    delay_us(500);

    SCCB_SIC_L();
    delay_us(500);

    SCCB_SID_L();
    delay_us(500);

    }

    /*
    -----------------------------------------------
       功能: 写入一个字节的数据到SCCB
       参数: 写入数据
     返回值: 发送成功返回1,发送失败返回0
    -----------------------------------------------
    */
    unsigned char SCCBwriteByte(unsigned char m_data)
    {
    unsigned char j,tem;

    for(j=0;j<8;j++) //循环8次发送数据
    {
    if((m_data<<j)&0x80)
    {
    SCCB_SID_H();
    }
    else
    {
    SCCB_SID_L();
    }
    delay_us(500);
    SCCB_SIC_H();
    delay_us(500);
    SCCB_SIC_L();
    delay_us(500);

    }
    delay_us(100);
    SCCB_SID_IN;/*设置SDA为输入*/
    delay_us(500);
    SCCB_SIC_H();
    delay_us(100);
    if(SCCB_SID_STATE){tem=0;}   //SDA=1发送失败,返回0}
    else {tem=1;}   //SDA=0发送成功,返回1
    SCCB_SIC_L();
    delay_us(500);
            SCCB_SID_OUT;/*设置SDA为输出*/

    return (tem);  
    }

    /*
    -----------------------------------------------
       功能: 一个字节数据读取并且返回
       参数: 无
     返回值: 读取到的数据
    -----------------------------------------------
    */
    unsigned char SCCBreadByte(void)
    {
    unsigned char read,j;
    read=0x00;

    SCCB_SID_IN;/*设置SDA为输入*/
    delay_us(500);
    for(j=8;j>0;j--) //循环8次接收数据
    {      
    delay_us(500);
    SCCB_SIC_H();
    delay_us(500);
    read=read<<1;
    if(SCCB_SID_STATE) 
    {
    read=read+1;
    }
    SCCB_SIC_L();
    delay_us(500);
    }
            SCCB_SID_OUT;/*设置SDA为输出*/
    return(read);
    }
     
     

    //功能:读OV7660寄存器
    //返回:1-成功 0-失败
    //guanfu_wang
    unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
    {
    //通过写操作设置寄存器地址
    startSCCB();
    if(0==SCCBwriteByte(0x42))//写地址
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    delay_us(100);
       if(0==SCCBwriteByte(regID))//积存器ID
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    stopSCCB();//发送SCCB 总线停止传输命令

    delay_us(100);

    //设置寄存器地址后,才是读
    startSCCB();
    if(0==SCCBwriteByte(0x43))//读地址
    {
    stopSCCB();//发送SCCB 总线停止传输命令
    return(0);//错误返回
    }
    delay_us(1000);
       *regDat=SCCBreadByte();//返回读到的值
       noAck();//发送NACK命令
       stopSCCB();//发送SCCB 总线停止传输命令
       return(1);//成功返回
    }

  • 相关阅读:
    点击对应不同name的button,显示不同name的弹窗(弹窗功能)
    点击添加本地图片的前端效果制作
    巧用margin/padding的百分比值实现高度自适应(多用于占位,避免闪烁)
    移动端取消touch高亮效果
    手机网站的几点注意
    图片自动切换+链接
    使用DOM的方法获取所有li元素,然后使用jQuery()构造函数把它封装为jQuery对象
    使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息
    利用jQuery扩展接口为jQuery框架定义了两个自定义函数,然后调用这两个函数
    jQuery链式语法演示
  • 原文地址:https://www.cnblogs.com/tao560532/p/2490591.html
Copyright © 2020-2023  润新知