IIC通讯之TM1650

2019-04-15 18:21发布

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