查看: 2085|回复: 2

[分享] 【1768】PA9551LED驱动&I2C温度传感器&HTML POST方法控制四盏LED灯

[复制链接]
  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2954
    最后登录
    2023-7-24
    发表于 2019-4-1 00:54:23 | 显示全部楼层 |阅读模式
        LED的驱动方法,各位坛友已经造好轮子,我也就不需要再花时间自己重写一遍了,我只需要将算法优化一下,以便以最简单的方式驱动板上的四盏LED灯:
    1. #define PCA9551_SLVADDR        (0xC0>>1)

    2. void PCA9551_LED_Out(unsigned char value)
    3. {
    4.         unsigned char pca9551_buf[3];
    5.         I2C_M_SETUP_Type txsetup;
    6.         txsetup.sl_addr7bit=PCA9551_SLVADDR;
    7.         txsetup.tx_data=pca9551_buf;
    8.         txsetup.tx_length=3;
    9.         txsetup.rx_data=NULL;
    10.         txsetup.rx_length=0;
    11.         txsetup.retransmissions_max=3;
    12.        
    13.                 switch(value)
    14.         {
    15.                 case 0:
    16.                         value=0x55;
    17.                         break;
    18.                 case 1:
    19.                         value=0x15;
    20.                         break;
    21.                 case 2:
    22.                         value=0x45;
    23.                         break;
    24.                 case 3:
    25.                         value=0x05;
    26.                         break;
    27.                 case 4:
    28.                         value=0x51;
    29.                         break;
    30.                 case 5:
    31.                         value=0x11;
    32.                         break;
    33.                 case 6:
    34.                         value=0x41;
    35.                         break;
    36.                 case 7:
    37.                         value=0x01;
    38.                         break;
    39.                 case 8:
    40.                         value=0x54;
    41.                         break;
    42.                 case 9:
    43.                         value=0x14;
    44.                         break;
    45.                 case 10:
    46.                         value=0x44;
    47.                         break;
    48.                 case 11:
    49.                         value=0x04;
    50.                         break;
    51.                 case 12:
    52.                         value=0x50;
    53.                         break;
    54.                 case 13:
    55.                         value=0x10;
    56.                         break;
    57.                 case 14:
    58.                         value=0x40;
    59.                         break;
    60.                 case 15:
    61.                         value=0x00;
    62.                         break;
    63.         }
    64.        
    65.         pca9551_buf[0]=0x15;
    66.         pca9551_buf[1]=0x55;
    67.         pca9551_buf[2]=value;
    68.         I2C_MasterTransferData(LPC_I2C0,&txsetup,I2C_TRANSFER_POLLING);
    69. }
    复制代码

    算法实现方式是以BCD码形式驱动,0000~1111,即0~15,每一位置1即为点亮,置0即为熄灭,所以设置形参从0到15变化时,LED变化效果如下:
    1.gif
    然后是I2C温度传感器,同样是论坛的各位大佬造好轮子,直接使用:
    1. #define Temper_I2C_ADDR        0x96>>1

    2. #define Local_Temp_High        0x00
    3. #define Local_Temp_Low         0x22

    4. #define Remote_Temp_High       0x01
    5. #define Remote_Temp_Low        0x10

    6. float I2C_Temp_Read()
    7. {
    8.         unsigned char temp_buf=0,value,swap[2];
    9.         float temp;
    10.         I2C_M_SETUP_Type rxsetup;
    11.         rxsetup.sl_addr7bit = Temper_I2C_ADDR;
    12.         rxsetup.tx_data = &temp_buf;
    13.         rxsetup.tx_length = 1;
    14.         rxsetup.rx_data = &value;
    15.         rxsetup.rx_length = 1;
    16.         rxsetup.retransmissions_max = 3;
    17.         I2C_MasterTransferData(LPC_I2C0,&rxsetup,I2C_TRANSFER_POLLING);
    18.         swap[0]=value;
    19.        
    20.         temp_buf=0x22;
    21.         rxsetup.tx_data = &temp_buf;
    22.         rxsetup.rx_data = &value;
    23.         I2C_MasterTransferData(LPC_I2C0,&rxsetup,I2C_TRANSFER_POLLING);
    24.         swap[1]=value;
    25.        
    26.         if(swap[0]&&8==1)
    27.         {
    28.                 swap[0] =~swap[0];
    29.                 swap[1] = ~swap[1];
    30.                 temp=-1*(swap[0]+((swap[1]>>5)+1)*0.125f);
    31.         }
    32.         else
    33.         {
    34.                 temp=swap[0]+(swap[1]>>5)*0.125f;
    35.         }
    36.         return temp;

    37. }
    复制代码

    控制LED的方式,我采用POST方法,即在HTML布局下增加post控件,里面所有的控件都可以在submit操作下提交自身状态值,如单选框,复选框,下拉列表框等,我这里使用4个复选框来分别控制板上的4个LED:
    1. <form method="POST">\
    2. <label>LED1<input name="led1" type="checkbox" value="1" />  </label>\
    3. <label>LED2<input name="led2" type="checkbox" value="1" />  </label>\
    4. <label>LED3<input name="led3" type="checkbox" value="1" />  </label>\
    5. <label>LED4<input name="led4" type="checkbox" value="1" />  </label>\
    6. <p><input type="submit" value="提交"></p>\
    7. </form>\
    复制代码

    5.jpg IMG_20190401_000552.jpg
    6.jpg IMG_20190401_000513.jpg
    7.jpg IMG_20190401_000535.jpg
    上传工程文件:
    LPC1768.zip (3.51 MB, 下载次数: 8)
    今天心情不错
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2019-4-1 09:59:42 | 显示全部楼层
    真棒,我还没有以太网的练习。先向大牛学习了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2954
    最后登录
    2023-7-24
     楼主| 发表于 2019-4-1 10:12:01 | 显示全部楼层
    jobszheng5 发表于 2019-4-1 09:59
    真棒,我还没有以太网的练习。先向大牛学习了

    今晚再发一帖QT网络上位机的
    今天心情不错
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-26 05:37 , Processed in 0.111575 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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