查看: 2626|回复: 0

[原创] 【IRD-LPC1768-DEV】5 iic_pca9551 控制button 及 led

[复制链接]
  • TA的每日心情
    无聊
    2024-9-24 10:29
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    15

    主题

    228

    帖子

    23

    高级会员

    Rank: 4

    积分
    663
    最后登录
    2024-9-24
    发表于 2019-3-15 22:22:22 | 显示全部楼层 |阅读模式
    1.iic 基础直接调用cmsis driver 库(前面写的很细致了)

    2.初始化iic0
    int IIC_init(void){
            uint32_t flag;
            flag = I2Cdrv->Initialize(NULL);
            if (flag != ARM_DRIVER_OK ) { return -1; }
           
            flag = I2Cdrv->PowerControl (ARM_POWER_FULL);
            if (flag != ARM_DRIVER_OK ) { return -1; }
           
            flag=I2Cdrv->Control      (ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);  //设置速度为快速,即400K
            if (flag != ARM_DRIVER_OK ) { return -1; }
           
      flag = I2Cdrv->Control      (ARM_I2C_BUS_CLEAR, 0);
            if (flag != ARM_DRIVER_OK ) { return -1; }
           
            return 0;
           
    }

    3. PCA9551 配置
            I2C_Button[0]=PCA9551_REG_INPUT;
           
            I2C_PSC0[0]=PCA9551_REG_PSC0;//PSC
            I2C_PSC0[1]=0x57;
            I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_PSC0, 2, false);
            while (I2Cdrv->GetStatus().busy);  //等待发送完成    配置频率
           
            I2C_PWM0[0]=PCA9551_REG_PWM0;//PWM0
            I2C_PWM0[1]=0X80;
            I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_PWM0, 2, false);
            while (I2Cdrv->GetStatus().busy);  //等待发送完成  配置占空比
           
            I2C_Led[0]=PCA9551_REG_LS1;//LED4-LED7
            I2C_Led[1]=0xAA;//受PWM0控制
            I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_Led, 2, false);
            while (I2Cdrv->GetStatus().busy);  //等待发送完成
           



    宏定义
    #define PCA9551_I2C_ADDR       0xC0>>1   //PCA9551 IIC地址为0xC0
    #define PCA9551_REG_INPUT   0    // INPUT register          (ro)
    #define PCA9551_REG_PSC0    1    // Frequency Prescaler 0   (rw) BLINK0 = (PSC0 + 1) / 38
    #define PCA9551_REG_PWM0    2    // PWM 0                   (rw) BLINK0 = (256 − PWM0) / 256
    #define PCA9551_REG_PSC1    3    // Frequency Prescaler 1   (rw) BLINK1 = (PSC1 + 1) / 38
    #define PCA9551_REG_PWM1    4    // PWM 1                   (rw)
    #define PCA9551_REG_LS0     5    // LED0 - LED3 Select      (rw)
    #define PCA9551_REG_LS1     6    // LED4 - LED7 Select      (rw)
    #define PCA9551_REG_AI   0x10    // Auto-Increment
    #define BUTTON_1       0x0E
    #define BUTTON_2       0x0D
    #define BUTTON_3       0x0B
    #define BUTTON_4       0x07


    //  00 LED ON  
    //  11 LED OFF
    //  10 PWM0
    //  11 PWM1

    //8位控制4个灯

    4.按键控制程序


    //按键控制
    uint8_t Get_Button(void)
    {
                    uint8_t KeyId =0;
                    I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_Button, 1, true);  //发送按键状态寄存器地址
                    while (I2Cdrv->GetStatus().busy);
                    I2Cdrv->MasterReceive (PCA9551_I2C_ADDR, &I2C_Button[1], 1, false);  //获取按键状态
                    while (I2Cdrv->GetStatus().busy);
                    I2C_Button[1]=I2C_Button[1]&0x0F;//只有四个按键
                    switch (I2C_Button[1]){
                            case BUTTON_1://SW1按下
                                    I2C_PSC0[1]+=30;
                                    I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_PSC0, 2, false);
                                    while (I2Cdrv->GetStatus().busy);  //等待发送完成
                                    KeyId=1;
                                    break;
                            case BUTTON_2: //SW2按下
                                    I2C_PSC0[1]-=30;
                                    I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_PSC0, 2, false);
                                    while (I2Cdrv->GetStatus().busy);  //等待发送完成
                                    KeyId=2;
                                    break;
                            case BUTTON_3: //SW3按下
                                    I2C_PWM0[1]+=40;
                                    I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_PWM0, 2, false);
                                    while (I2Cdrv->GetStatus().busy);  //等待发送完成
                                    KeyId=3;
                                    break;
                            case BUTTON_4://SW4按下
                                    I2C_PWM0[1]-=40;
                                    I2Cdrv->MasterTransmit (PCA9551_I2C_ADDR, I2C_PWM0, 2, false);
                                    while (I2Cdrv->GetStatus().busy);  //等待发送完成
                                    KeyId=4;
                                    break;
                            default:
                                    break;
                            }
                           
                            return KeyId;
                           
    }


    主要实现功能是前两个控制灯的频率快慢 加 减(闪的快慢)
    剩下两个灯控制pwm的脉宽(灯的亮度)
    返回的数据用于判定哪个按键被按下


    效果如下


    2.gif




    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 20:44 , Processed in 0.086458 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表