IIC通讯之TM1650

来源:互联网 发布:it设备管理 编辑:程序博客网 时间:2024/06/10 21:13



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




一、简介

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


二、实验平台

电脑平台:Windows7 64位旗舰

编译软件:PM+ V6.30

硬件平台:Upd79F8513A(NEC) 、TM1650


三、版权声明

博主:_懵懂

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

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

QQ:951795235

E-mail :951795235@qq.com

懵懂之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);}


原创粉丝点击