在线时间49 小时
UID1860622
注册时间2016-10-24
NXP金币0
TA的每日心情 | 无聊 2024-9-24 10:29 |
---|
签到天数: 95 天 连续签到: 1 天 [LV.6]常住居民II
高级会员

- 积分
- 663
- 最后登录
- 2024-9-24
|
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的脉宽(灯的亮度)
返回的数据用于判定哪个按键被按下
效果如下
|
|