本篇博文最后修改时间: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
项目合作开发地址:
https://shop309207239.taobao.com/
四、实验前提
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);
}