打印
[PIC®/AVR®/dsPIC®产品]

求 PIC18F13K22驱动OLED 的 硬件I2C程序

[复制链接]
1328|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
青莲新楓|  楼主 | 2017-4-13 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我硬件I2C协议写了  oled显示 初始化也写了 在51单片机上用模拟I2C运行完美  在PIC上用模拟和硬件的I2C都不能通信
沙发
青莲新楓|  楼主 | 2017-4-13 09:52 | 只看该作者
void init_fosc(void)
{
OSCCON = 0xF7;//16MHZ
}
void init_gpio(void)
{
     ANSEL=0x00;//使能数字输入
     ANSELH = 0x00;
     PORTB=0;
     LATB =0;
     TRISB =0xFF;

PORTC=0;
LATC=0;
TRISC =0x00;
}
void init_i2c_master()
{
    TRISB4 = input;
    TRISB6 = input;
    SSPCON1bits.SSPM0 = 0;
    SSPCON1bits.SSPM1 = 0;
    SSPCON1bits.SSPM2 = 0;
    SSPCON1bits.SSPM3 = 1;// I2C Master mode ,clock=Fosc/(4*(SSPxADD+1))
    SSPSTATbits.SMP = 0;//使能压摆率 400khz速度下
    SSPADD = 0x09;//SCL CLOCK Frequency 400KHZ
    SSPCON1bits.SSPEN = 1;
}
void i2c_master_tx(unsigned char tx_deviceaddr,unsigned char tx_resaddr,unsigned char tx_data)
{   
     PIR1bits.SSPIF = 0;//需要软件置0
    SSPCON2bits.SEN = 1;//启动条件
    while(SSPCON2bits.SEN == 1);//等启动条件完成  SEN由硬件清零
    // PIR1bits.SSPIF = 1;   由硬件置1
   
     
    SSPBUF = tx_deviceaddr;//从机设备地址
    while(ACKSTAT);  // ~ACK
    while(PIR1bits.SSPIF == 0);
    PIR1bits.SSPIF = 0;//需要软件置0
   
   
    SSPBUF = tx_resaddr;//写命令的寄存器
    while(ACKSTAT);  // ~ACK
    while(PIR1bits.SSPIF == 0);
    PIR1bits.SSPIF = 0;
   
   
    SSPBUF = tx_data;//写数据
    while(ACKSTAT);  // ~ACK
    while(PIR1bits.SSPIF == 0);
    PIR1bits.SSPIF = 0;
   
     
    SSPCON2bits.PEN = 1;//Stop condition
}

使用特权

评论回复
板凳
yangzj1974| | 2018-2-13 15:34 | 只看该作者
学习

使用特权

评论回复
地板
598330983| | 2023-10-21 18:50 | 只看该作者
PIC的I2C硬件超难用

使用特权

评论回复
5
wahahaheihei| | 2023-10-24 20:41 | 只看该作者
设置成开漏模式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝