掌握I2C总线:轻松提升PIC项目数据持久化能力

6 下载量 49 浏览量 更新于2024-08-28 收藏 408KB PDF 举报
"轻松学PIC之I2C总线篇" 是一篇教程,旨在帮助读者深入了解和掌握在增强型PIC实验板上使用I2C(Inter-Integrated Circuit)总线技术。前文概述了ICD2仿真烧写器的使用以及实验板上各种资源(如发光管、继电器等)的操作,强调了其易用性和学习效率。本篇教程将重点转向I2C总线的工作原理,它是一种主从通信架构,其中单片机作为主设备,可以连接多个从设备,如非易失性存储器,用于实现数据的持久存储。 I2C总线的特点包括双向通信,SDA(Serial Data)和SCL(Serial Clock)线的使用,以及单字节数据传输和起始/停止条件的规定。数据在传输过程中,SDA线的状态变化必须遵循时钟信号的同步,且每个字节传输后需接收到从设备的确认信号(ACK)。这一特性使得I2C适用于紧凑的空间和低功耗设计,尤其适合那些需要断电保持功能的设备,例如设置密码或累积汽车量程读数等场景。 通过学习I2C总线,读者不仅可以提升对单片机控制的高级功能理解,还能应用到实际项目中,实现设备之间的数据共享和存储,提高系统的稳定性和可靠性。整个教程以实践操作和理论相结合的方式,逐步引导读者掌握I2C编程和调试技巧,从而提升在PIC开发中的技能水平。

void I2C_3(unsigned char mcmd) { unsigned char length = 8; // Send Command while(length--) { if(mcmd & 0x80) { SDA3_1; } else { SDA3_0; } // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); mcmd = mcmd << 1; } } void I2C_Ack3() { SDA3_1; // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); } void I2C_NAck3() { SDA3_0; // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); } void I2C_Start3() { SDA3_0; // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); I2C_3(0x78); I2C_Ack3(); } void I2C_Stop3() { SCL3_1; // uDelay(5); SDA3_0; // uDelay(5); SDA3_1; // uDelay(5); } void Write_Command3(unsigned char Data) { I2C_Start3(); I2C_3(0x00); I2C_Ack3(); I2C_3(Data); I2C_Ack3(); I2C_Stop3(); } void Write_Data3(unsigned char Data) { I2C_Start3(); I2C_3(0x40); I2C_Ack3(); I2C_3(Data); I2C_Ack3(); I2C_Stop3(); } //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void pic13(void) { unsigned char i,j; unsigned int k; k=0; for(j=0;j<8;j++) { Write_Command3(0x22);//--set page1 Write_Command3(j);//--set start page Write_Command3(0x07);//--set end page for(i=0;i<128;i++) //ÏÔʾµ¥É«Êý¾Ýµ½LCD { Write_Data3(color13[k]); k=k+1; } } } void pic14(void) { Uchar i,j; Uint k; k=0; for(j=0;j<8;j++) { Write_Command3(0x22);//--set page1 Write_Command3(j);//--set start page Write_Command3(0x07);//--set end page for(i=0;i<128;i++) //ÏÔʾµ¥É«Êý¾Ýµ½LCD { Write_Data3(color14[k]); k=k+1; } } } void LCD_Init3(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); delay_ms(500);这些代码分别是什么意思

2023-05-25 上传