在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 zhjb1 于 2019-2-25 14:59 编辑
I2D觉得是比较难点的,所以休息了几天再捡起来。
先看手册:
在CHS图中可以看到PCA9551PW芯片的低4位连接了4个按键,高4位连接了4只LED。按键的数据需要读取,而LED的显示需要输出到I2C的对应寄存器控制显示。计划用按键来控制LED——按键1控制LED1点亮、依次类推,无按键全部暗。看图纸可以知道LED为负逻辑——低电平点亮。
看手册,还是不太复杂,只有7个控制LED点亮的寄存器。见截图0_51。因为高4位有LED,因此6个寄存器,实际上只用到4个,为了省事,6个都用上。而读取按键比较简单,直接读取低4位的数值即可。
首先在LCD上增加Key1的数值显示,高4位为两个十进制数,低4位为两个十进制数显示。实际上前者显示不了是因为实际上控制LED显示是8位bite。
前部增加函数,声明I2C类:
I2C i2c(P0_27,P0_28);//SDA0,SCL0
定义一些变量,分别放到对应的类别中:
int kk[2],keyDat[2]={0xC0,0x92};
int16_t keyVale[4];//此程序中只用了1个
int unsigned taddr[]={0xC0,0xA0,0x92,0x40};//4个I2C芯片的地址
增加3个函数,分别是初始化LED控制显示寄存器写的函数;4个按键读取数值,并且显示出来函数;再主程序中控制某个LED与对应键按下显示的函数:
//Test Key1
void onKey4(void){
char data[2];
i2c.read(taddr[0],data,2,rd);
keyDat[0]=0x0F&data[0];//低4位按键值
keyDat[1]=0xF0&data[0];
kk[0]=0x0F-(0x0F&keyDat[0]);
kk[1]=(0xF0-keyDat[1])>>4;
}
//Intial LEDs Regedit
void onLed4init(void){
char kTemp[2];
kTemp[0]=0x00;
kTemp[1]=0xFF;//I2C Write Enadble
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x01;
kTemp[1]=0x26;
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x02;
kTemp[1]=0xFE;
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x03;
kTemp[1]=0x24;//周期=24,~1秒
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x04;
kTemp[1]=0xFE;//0-亮|FF-暗
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x06;
kTemp[1]=0x56;//最低位LED亮
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x01;
kTemp[1]=0x00;//I2C Write Disable
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
keyVale[0]=kTemp[0];
}
//Test 1~4 LED
void onLed4(void){
int i=0x55;
switch(0x0F&kk[0]){
case 1:
i=0x56;break;
case 2:
i=0x59;break;
case 4:
i=0x65;break;
case 8:
i=0x95;break;
default:
i=0x55;break;
}
wait(0.001);
char kTemp[2];
wait(0.001);
kTemp[0]=0x00;
kTemp[1]=0xFF;//I2C Write Enadble
wait(0.00001);
kTemp[0]=0x06;
kTemp[1]=i;
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
kTemp[0]=0x00;
kTemp[1]=0x00;//I2C Write Disable
i2c.write(taddr[0],kTemp,2,true);
wait(0.00001);
}
在循环函数体内增加:
onKey4();
onLed4();
onTemp4();
结果见照片0_52是内置PWM调制寄存器设置后的输出波形,照片0_53~0_56为按键1~4分别按下,LED1~4对应亮的照片。
|
-
0_51
-
0_52
-
0_53
-
0_54
-
0_55
-
0_56
|