软件模拟IIC驱动搭建

通过MCU和TM1680的通信,简要概述IIC通信协议:

IC通过IIC通信的几个基本概念:

 

1,IIC的初始化:

      软件模拟IIC需要两个可编程IO口,分别对应数据和时序总线。 初始化IIC时,将两个GPIO分别设为输出(双向IO口),并将电平拉高(产生下降沿,做起始信号)。

2,IIC的起始信号:

      IIC的SDA在SCL为高时,产生一个下降沿

3,IIC终止信号:

    IIC的SDA在SCL为高时,产生一个上升沿

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/*********** TM1680 参考程序: 1、A1\A0 采用MCU进行控制,实际使用时,可以将A1\A0任意接高低电平,TM1680 ID改为相应指令即可; 2、该程序采用STC15W 芯片模拟IIC协议,IO口为双向IO口(无需设置输入与输出),如果MCU的IO口需要设置输入和输出,则在ACK时需要设置为输入 3、该芯片支持标准IIC协议 ************/ #include #include "intrins.h" #include /****命令宏定义****/ #define TM1680ID 0xe7 #define SYSDIS 0x80 #define SYSEN 0x81 #define LEDOFF 0x82 #define LEDON 0x83 #define BLINKOFF 0x88 #define BLINK2HZ 0x89 #define BLINK1HZ 0x8A #define BLINK0_5HZ 0x8B #define SLAVEMODE 0x90 #define RCMODE0 0x98 #define RCMODE1 0x9A #define EXTCLK0 0x9C #define EXTCLK1 0x9E #define COM8NMOS 0xA0 #define COM16NMOS 0xA4 #define COM8PMOS 0xA8 #define COM16PMOS 0xAC #define PWM01 0xB0 #define PWM02 0xB1 #define PWM03 0xB2 #define PWM04 0xB3 #define PWM05 0xB4 #define PWM06 0xB5 #define PWM07 0xB6 #define PWM08 0xB7 #define PWM09 0xB8 #define PWM10 0xB9 #define PWM11 0xBA #define PWM12 0xBB #define PWM13 0xBC #define PWM14 0xBD #define PWM15 0xBE #define PWM16 0xBF /******命令宏定义******/ /***端口定义***/ sbit SDA=P1^4; //TM1680通讯端口设置 sbit SCL=P1^5; sbit MA1=P1^6; sbit MA0=P1^7; /***按键功能设置***/ sbit KEY0=P3^2; sbit KEY1=P3^3; sbit KEY2=P3^6; /***LED指示灯定义***/ sbit RED=P3^4; sbit GREEN=P3^5; sbit WHITE=P3^7; /***显示数据***/ unsigned char TM1680perseg[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x8}; unsigned char DispA[8]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10}; /*** 函数功能:延时函数 ***/ void delayms(unsigned int n) { unsigned int i; while(n--) { for(i=0;i<550;i++); } } void delayus(unsigned char n) //256 { while (--n) { _nop_(); } } /**************************底层函数*****************************/ void TM1680start(void) { SDA=1; SCL=1; SDA=1; delayus(4); delayus(10); SDA=0; delayus(10); //起始信号,必须大于4.7us SCL=0; } void Ack(void) { SCL = 0; delayus(8); SCL = 1; delayus(8); while(SDA); SCL=0; delayus(15); } void TM1680SetAck(bit ack) { SCL=0; delayus(5); SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 delayus(5); //延时 SCL = 0; //拉低时钟线 delayus(5); //延时 } void TM1680stop(void) { SDA=0; SCL=1; delayus(10); SDA=1; //停止信号,大于5us delayus(10); SCL=1; SDA=1; } void TM1680SendByte(unsigned char sbyte) { unsigned char i=0; for(i=0; i<8; i++) { SCL=0;delayus(2); if(sbyte&0x80;) { SDA=1; //高位先发 }else{ SDA=0; } delayus(3); SCL=1; delayus(5); //高电平的时间大于4us sbyte<<=1; delayus(2); } SCL=0; delayus(3); SDA=0; delayus(3); } unsigned char TM1680RecvByte(void) { unsigned char i=0, sbyte; SDA=1;delayus(6); for(i=0; i<8; i++) { SCL=0;delayus(6); if(SDA) { sbyte |= 0x01 ; //置1 }else{ sbyte &= 0xfe; //置0 } delayus(3); SCL=1; delayus(5); //高电平的时间大于4us sbyte<<=1; } SCL=0; return sbyte; } /******************************底层函数结束**************************/ /******************************功能函数**************************/ /***单字节写操作函数***/ /***写命令函数:开始--ID-ACK--命令-ACK--结束***/ void TM1680WriteCmd(unsigned char scmd) { TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(scmd); Ack(); TM1680stop(); } /***写一个字节数据: 开始--ID-ACK-内部地址-ACK--数据-ACK-结束 ***/ void TM1680WriteOneByte(unsigned char faddr, unsigned char sdate) { TM1680start(); TM1680SendByte(TM1680ID); //写TM1680器件地址 Ack(); TM1680SendByte(faddr); //eeprom 地址 Ack(); TM1680SendByte(sdate); //写数据 Ack(); TM1680stop(); } /*** 函数功能:页操作 ***/ void TM1680PageWrite(unsigned char faddr, unsigned char *pdate,unsigned char cnt) { unsigned char i=0; TM1680start(); TM1680SendByte(TM1680ID); //写TM1680器件地址 Ack(); TM1680SendByte(faddr); //eeprom 地址 Ack(); for(i=0; i<cnt; i++) { TM1680SendByte(*pdate); //写数据 Ack(); pdate++; } TM1680stop(); } void TM1680PageAllWrite(unsigned char faddr, unsigned char sdate,unsigned char cnt) { unsigned char i=0; TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(faddr); //eeprom 地址 Ack(); for(i=0; i<cnt; i++) { TM1680SendByte(sdate); //写数据 Ack(); } TM1680stop(); } /*** 函数功能: 写命令+写数据 ***/ void TM1680WriteCmdDate(unsigned char faddr, unsigned char sdate, unsigned char cnt) { unsigned char i=0; TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(SYSDIS); Ack(); TM1680SendByte(COM8NMOS); Ack(); TM1680SendByte(RCMODE1); Ack(); TM1680SendByte(SYSEN); Ack(); TM1680SendByte(LEDON); Ack(); TM1680SendByte(PWM16); Ack(); TM1680SendByte(BLINKOFF); Ack(); TM1680SendByte(faddr); Ack(); for(i=0; i<cnt; i++) { TM1680SendByte(sdate); Ack(); } TM1680stop(); } /******************************************函数功能结束****************************************/ /*** 函数功能: TM1680 初始化 ***/ void TM1680Init(void) { TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(SYSDIS); Ack(); TM1680SendByte(COM8NMOS); //根据需求进行选择 Ack(); TM1680SendByte(RCMODE1); Ack(); TM1680SendByte(SYSEN); Ack(); TM1680SendByte(LEDON); Ack(); // TM1680SendByte(LEDOFF); // Ack(); TM1680SendByte(PWM16); Ack(); TM1680SendByte(BLINKOFF); Ack(); TM1680stop(); } /***PWM调节测试***/ void PWMTest(unsigned char sTime) { unsigned char i=0; for(i=0;i<16;i++) { TM1680WriteCmd(PWM01 | i); delayms(sTime); delayms(sTime); } } /***TM1680ID判断***/ void TM1680IDChange(void) { switch(TM1680ID) { case 0xe4: MA1=0; MA0=0; break; case 0xe5: MA1=0; MA0=1; break; case 0xe6: MA1=1; MA0=0; break; case 0xe7: MA1=1; MA0=1; break; default:break; } } /**** 函数功能:逐渐点亮每一段 ****/ void TM1680PerDisp(void) { unsigned char i=0,j=0; unsigned char faddr=0x00, fdate=TM1680perseg[0]; for(i=0;i<32; i++) { for(j=0;j<8;j++) { fdate=fdate|TM1680perseg[j]; TM1680WriteOneByte(faddr,fdate); delayms(20); } faddr+=2; fdate=TM1680perseg[0]; } } void main(void) { unsigned char i=0,j=0,fdate=0x10; TM1680IDChange(); TM1680Init(); TM1680PageAllWrite(0x00, 0x00, 32); //上电清零 delayms(100); TM1680PageAllWrite(0x00, 0xff, 32); //上电全部显示 TM1680PerDisp(); //每一段显示 while(1) { ; } }
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值