翻译代码 void write(unsigned char date) { unsigned char i,aa; aa=date; sda_L; scl_L; for(i=0;i<8;i++) { scl_L; if(aa&0x01) { sda_H; delay_ms(2); } else { sda_L delay_ms(2); } scl_H; aa=aa>>1; } scl_L; sda_L; } //========================================================== // 函数名称: init_tm1640 // // 函数功能: 初始化TM1640 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void init_tm1640(void) { sda_H; scl_H; start(); write(SET_DATA_ORDER);//设置数据,0x40,0x44分别对应地址自动加一和固定地址模式 stop(); start(); write(SET_DISPLAY); //控制显示,开显示0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f分别对应脉冲宽度 //------------------1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16 //0x80关显示 stop(); } //========================================================== // 函数名称: init_tm1640_NEW // // 函数功能: 设置TM1640 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void init_tm1640_NEW(void) { unsigned char i; sda_H; scl_H; start(); write(SET_DATA_ORDER); //设置数据,0x40,0x44分别对应地址自动加一和固定地址模式 stop(); start(); write(0x00); //设置地址 for(i=0;i<4;i++) { write(TM164_DATA[i]); } stop(); start(); write(SET_DISPLAY); //控制显示,开显示0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f分别对应脉冲宽度 //------------------1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16 //0x80关显示 stop(); }
时间: 2023-09-04 20:06:19 浏览: 98
STM32 + VL53L0激光测距 TOF 软件I2C协议代码
3星 · 编辑精心推荐
这是一段嵌入式 C 语言代码,包含两个函数 `write()` 和 `init_tm1640()`,以及一个类似于 `init_tm1640()` 的函数 `init_tm1640_NEW()`。
函数 `write()` 的作用是向 TM1640 芯片写入一个字节的数据,参数 `date` 表示要写入的数据。函数内部使用了 Bit-Bang 方式实现了 I2C 协议,通过 SDA 和 SCL 两根线模拟 I2C 总线进行通信。具体来说,函数先将 SDA 和 SCL 拉低,然后将 `date` 的每一位一位地写入,写入过程中先将 SCL 拉低,再根据 `date` 的当前位值决定将 SDA 拉高还是拉低,最后将 SCL 拉高,将 `date` 右移一位,重复上述过程直到写入完整个字节,最后将 SCL 和 SDA 都拉低。
函数 `init_tm1640()` 的作用是初始化 TM1640 芯片,包括设置数据格式和控制显示。具体来说,函数先将 SDA 和 SCL 都拉高,然后调用 `start()` 函数启动 I2C 总线,接着调用 `write()` 函数向 TM1640 芯片写入数据 `SET_DATA_ORDER`,该数据表示设置地址自动加一。接着调用 `stop()` 函数停止 I2C 总线,再次启动总线并向 TM1640 芯片写入数据 `SET_DISPLAY`,该数据表示开启显示,并设置显示亮度。最后再次调用 `stop()` 函数停止 I2C 总线。
函数 `init_tm1640_NEW()` 的作用和 `init_tm1640()` 类似,不同之处在于它在设置地址时写入了 `TM164_DATA` 数组中的四个字节,而不是仅仅设置自动加一。
阅读全文