查看: 2814|回复: 2

[分享] [IRD-LPC1768-DEV测试]五、I2C测试4个按键和4个LED

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2019-2-25 13:57:42 | 显示全部楼层 |阅读模式
    本帖最后由 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_51

    0_52

    0_52

    0_53

    0_53

    0_54

    0_54

    0_55

    0_55

    0_56

    0_56
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3868

    主题

    7472

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39232
    最后登录
    2025-7-18
    发表于 2019-2-25 14:39:54 | 显示全部楼层
    谢谢分享
    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    半小时前
  • 签到天数: 1847 天

    连续签到: 2 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112625
    最后登录
    2025-7-20
    发表于 2019-2-25 21:15:54 | 显示全部楼层
    感谢分享,支持一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 23:26 , Processed in 0.087587 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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