本篇博文最後修改時間: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);
}