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

QQ:951795235

E-mail [email protected]

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章