IIC通讯之TM1650

本篇博文最后修改时间: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);
}

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目中提到了iic控制和TM1650,可以看出是要回答关于TM1650的I2C控制方法。 TM1650是一种常见的数字管驱动芯片,广泛应用于数码管显示等设备中。它通过I2C总线进行控制,即通过I2C协议来发送命令和数据来操作TM1650。 I2C(Inter-Integrated Circuit)是一种串行总线标准,可以实现多个设备之间的数据传输和通信。在使用I2C控制TM1650之前,我们首先需要确保系统中有I2C控制器与TM1650相连。 I2C通信主要涉及两根线:SCL(时钟线)和SDA(数据线)。首先,主控制器通过SCL线发送一串脉冲信号来确定通信时钟频率,而SDA线上的信号则用于传输数据和命令。 具体控制TM1650的步骤如下: 1. 启动信号:主控制器向SDA线发送一个低电平(0)的信号,同时保持SCL线为高电平(1)。这个低电平的信号表示启动一个通信过程的开始。 2. 设备地址:主控制器在SCL线保持高电平(1)的同时,按照I2C协议要求,向SDA线发送TM1650的设备地址。设备地址一般由芯片厂商预设,可以在TM1650的数据手册中找到。 3. 方向指令:主控制器会发送一个位,用以指示接下来的操作是写入数据(0)还是读取数据(1)。 4. 数据传输:根据方向指令,主控制器通过SCL和SDA线传输相应的命令和数据。具体的命令和数据可以根据TM1650的数据手册来确定。 5. 停止信号:主控制器向SDA线发送一个高电平(1)的信号,同时保持SCL线为高电平(1)。这个高电平的信号表示通信过程结束。 通过以上步骤,就可以通过I2C控制TM1650进行各种操作,例如显示数字、调节亮度等。 需要注意的是,具体的I2C控制细节还需参考TM1650的数据手册来进行调试和实现。此外,I2C控制TM1650还需要在相关的开发环境中编写相应的代码来完成控制操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值