IIC通讯之TM1650

版权声明:喝水不忘挖井人,转载请注明出处,[email protected]。 https://blog.csdn.net/qq_18842031/article/details/77936331

本篇博文最后修改时间:2017年08月14日 22:00。

一、简介

本文以Upd79F8513A(NEC)编程为例,介绍Upd79F8513A(NEC)与TM1650通讯

二、实验平台

电脑平台:Windows7 64位旗舰

编译软件:PM+ V6.30

硬件平台:Upd79F8513A(NEC) 、TM1650

三、版权声明

博主:_懵懂

声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。

原文地址:http://blog.csdn.NET/qq_18842031

懵懂之MCU交流群:136384801

四、实验前提

1、在进行本文步骤前,请先安装PM+ V6.30版本;准备好79F8513A、TM1650硬件平台。

         

五、基础知识

暂无

六、源码地址

暂无

七、关联文章

暂无

八、实验内容

1.声明及外部调用H文件

#define  Pt_TM1650_SDAM    PM2.3 //
#define  Pt_TM1650_SDA     P2.3  //
#define  Pt_TM1650_SCL     P2.2  //

#define  SDA_TM1650_IN     Pt_TM1650_SDAM=1  //
#define  SDA_TM1650_OUT    Pt_TM1650_SDAM=0  //

#define  SDA_H         Pt_TM1650_SDA=1   //
#define  SDA_L         Pt_TM1650_SDA=0   //
#define  SCL_H         Pt_TM1650_SCL=1   //
#define  SCL_L         Pt_TM1650_SCL=0   //
#define  W5NOP         NOP();NOP();NOP();NOP();NOP()

void Delay_us(uint8 u);
void I2CStart(void);
void I2Cask(void);
void I2CStop(void);
void I2CWrByte(uint8 oneByte);
uint8 Scan_Key(void);  // 按键扫描
void TM1650_Set(uint8 Address, uint8 dat);

2.编写引脚模拟IIC通讯代码C文件

void Delay_us(uint8 u)
{
    for( ; u > 0; u--)
    {
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
    }
}
void I2CStart(void)//开始信号
{
	  SDA_TM1650_OUT;
    SCL_H;
    W5NOP;
    SDA_H;
    Delay_us(5);
    SDA_L;
    Delay_us(5);
    SCL_L;
}
void I2CStop(void) //停止信号
{
    SDA_L;
    W5NOP;
    SCL_H;
    Delay_us(5);
    SDA_H;
    W5NOP;
    W5NOP;
    SCL_L;
    W5NOP;
    W5NOP;
    SDA_L;
    Delay_us(5);
    Delay_us(5);
}

void I2Cask(void) //ACK信号
{
    uint8 timeout = 1;
    SDA_TM1650_IN;          //SDA转换为输入
    SCL_L;
    while((Pt_TM1650_SDA) && (timeout <= 10)) //等待SDA返回‘0’电平
    {
        timeout++;
    }
    SCL_H;
    Delay_us(1);
    SCL_L;
    SDA_TM1650_OUT;          //SDA转换为输出
}

void I2CWrByte(uint8 oneByte) //写一个字节高位在前,低位在后
{
    uint8 i, temp;
    temp = oneByte;

    SCL_L;
    Delay_us(1);
    for(i = 0; i < 8; i++)
    {
        if(oneByte & 0x80)
            SDA_H;
        else
            SDA_L;

        Delay_us(1);
        SCL_H;
        Delay_us(1);
        SCL_L;
        oneByte <<= 1;
    }
}


void TM1650_Set(uint8 Address, uint8 dat) //数码管显示
{
    //写显存必须从高地址开始写
    I2CStart();
    I2CWrByte(Address); //第一个显存地址
    I2Cask();
    I2CWrByte(dat);
    I2Cask();
    I2CStop();
}

uint8 I2CReadByte() //写一个字节高位在前,低位在后
{
    uint8 dat, i;

    SDA_H;
    dat = 0;
    SDA_TM1650_IN;          //SDA转换为输入
    Delay_us(1);Delay_us(1); /////////////////////////////////////
    SCL_L;
    for(i = 0; i < 8; i++)
    {
        SCL_H;
        dat = dat << 1;
        if(Pt_TM1650_SDA)
        {
            dat++;
        }
        Delay_us(1);
        SCL_L;
        Delay_us(1);
    }
    return dat ;
}

uint8 Scan_Key(void)  // 按键扫描
{
    uint8 i;
    uint8 rekey;

    I2CStart();
    I2CWrByte(0x49);//读按键命令
    I2Cask();
    rekey = I2CReadByte();
    I2Cask();
    I2CStop();
    return(rekey);
}

猜你喜欢

转载自blog.csdn.net/qq_18842031/article/details/77936331
tm
今日推荐