[STM32F1] 谁有PCA5555的历程

[复制链接]
1151|9
 楼主| dsh1989 发表于 2017-11-28 13:13 | 显示全部楼层 |阅读模式
dongnanxibei 发表于 2017-11-28 13:57 | 显示全部楼层
这个是什么,都没听说过,百度都没找到。
 楼主| dsh1989 发表于 2017-11-28 19:07 | 显示全部楼层
错了,是PCA9555
Houtz 发表于 2017-11-29 09:16 | 显示全部楼层
这个非常简单的,I2C总线转换为16线并口,以前就做过。
643757107 发表于 2017-11-29 09:33 | 显示全部楼层
1.德州仪器PCA9555-简化PCB布线,对处理器有限的IO口进行补充。


2.带中断,不带重启


3.24 引脚的CMOS器件,提供I2C/SMBus16位通用并行(GPIO)的扩展

4.地址:总共1字节(八位),前四位固定,(A0,A1,A2自定,最后一位,0为写,1为读。
643757107 发表于 2017-11-29 09:34 | 显示全部楼层
pca9555.h
  1. #ifndef __PCA9555_H
  2. #define __PCA9555_H         

  3. extern u8 value_keep0_l,value_keep0_h,value_keep1_l,value_keep1_h,value_keep2_l,value_keep2_h;
  4. extern u8 parameters;
  5. extern u16 led_buf[5];
  6. extern u8 value_feedback0[2],value_feedback1[2],value_feedback2[2];
  7. extern u16 auto_off_time_count;
  8. extern u16 auto_open_off_time_count[16];
  9. extern u16 auto_close_off_time_count[16];
  10. extern u8 doorstate[16];
  11. extern u8 powerstate[8];
  12. extern u8 Refresh_Led;
  13. extern u8 Refresh_Power;

  14. void delay(u32 conut);

  15. void IIC_SDA_DIR_SET(u8 io_dir);
  16. void IIC_Ready(void);
  17. void IIC_PORT_INIT(void);
  18. void IIC_Start(void);
  19. void IIC_Stop(void);
  20. void IIC_Ack(void);
  21. void IIC_Send_Ack(void);
  22. void IIC_Send_NoAck(void);
  23. void IIC_Write_Byte(u8 a);
  24. u8 IIC_Read_Byte(void);
  25. void IIC_Write_Pca9555(u8 addr,u8 reg_addr,u8 low_byte,u8 high_byte);
  26. void IIC_Read_Pca9555(u8 addr,u8 reg_addr,u8* pBuffer,u16 num);

  27. void IIC_SDA_DIR_SET_LED(u8 io_dir);
  28. void IIC_Ready_LED(void);
  29. void IIC_PORT_INIT_LED(void);
  30. void IIC_Start_LED(void);
  31. void IIC_Stop_LED(void);
  32. void IIC_Ack_LED(void);
  33. void IIC_Send_Ack_LED(void);
  34. void IIC_Send_NoAck_LED(void);
  35. void IIC_Write_Byte_LED(u8 a);
  36. u8 IIC_Read_Byte_LED(void);
  37. void IIC_Write_Pca9555_LED(u8 addr,u8 reg_addr,u8 low_byte,u8 high_byte);
  38. void IIC_Read_Pca9555_LED(u8 addr,u8 reg_addr,u8* pBuffer,u16 num);

  39. void write1(u8 PCA9555_dengban_ADDR,u8 pro2,u8 pro3);         //控制灯板上的pca芯片
  40. void write2(u8 PCA9555_zkb_ADDR,u8 pro0,u8 pro1);                 //控制主控板的上pca芯片


  41. void I2C_ReadS_PCA9555(u8 PCA9555_zhukong_ADDR,u8 PCA9555_REG_IN,u8* pBuffer,u16 no);
  42. void I2C_ReadS_PCA95552(u8 PCA9555_dengban_ADDR,u8 PCA9555_REG_IN,u8* pBuffer,u16 no);
  43. void PCA9555_Init(void);
  44. void I2CM_Init(void) ;       

  45. void Set_Value_To_Output(u8 num);
  46. void Clear_Value_To_Output(u8 num);
  47. void Change_Value_To_Output(u8 num,u8 value);
  48. void All_Off__To_Output(void);
  49. void All_On__To_Output(void);
  50. void All_Off__To_OpenDoor_Output(void);
  51. void All_On__To_OpenDoor_Output(void);
  52. void All_Off__To_Power_Output(void);
  53. void All_On__To_Power_Output(void);
  54. void All_Off__To_CloseDoor_Output(void);
  55. void All_On__To_CloseDoor_Output(void);
  56. u16 uart_deal_function(void);

  57. void Led_Off_RGB(u8 num,u16 value);
  58. void Led_On_RGB(u8 num,u16 value);
  59. void Led_Off_R(u8 num);
  60. void Led_On_R(u8 num);
  61. void Led_Off_G(u8 num);
  62. void Led_On_G(u8 num);
  63. void Led_Off_B(u8 num);
  64. void Led_On_B(u8 num);         
  65. void All_Led_On(void);
  66. void All_Led_Off(void);

  67. void Refresh_Door_Condition(void);
  68. void Refresh_Power_Condition(void);
  69. void Refresh_Door_Condition_Led(void);
  70. void Refresh_Power_Condition_Led(void);
  71. void PowerOn_Auto_CloseOff(void);                                    
  72. #endif
643757107 发表于 2017-11-29 09:34 | 显示全部楼层
pca9555.c

  1. #include "stm32f10x.h"
  2. #include "pca9555.h"
  3. #include "usart.h"
  4. #include "timer2.h"
  5. #include "wdg.h"

  6. #define SCL           GPIO_Pin_6
  7. #define SDA           GPIO_Pin_7
  8. #define SCL_LED           GPIO_Pin_10
  9. #define SDA_LED           GPIO_Pin_11
  10. #define IIC_BIT_DELAY           5
  11. #define DELAY                        delay(100)

  12. //  定义PCA9555(NXP半导体I/O扩展芯片,I2C接口)   
  13. #define  PCA9555_SLA             (0x40 >> 1)                 //  定义PAC9555的器件地址   
  14. #define  PCA9555_REG_IN0         0x00                        //  定义输入寄存器0地址   
  15. #define  PCA9555_REG_IN1         0x01                        //  定义输入寄存器1地址   
  16. #define  PCA9555_REG_OUT0        0x02                        //  定义输出寄存器0地址   
  17. #define  PCA9555_REG_OUT1        0x03                        //  定义输出寄存器1地址   
  18. #define  PCA9555_REG_POL0        0x04                        //  定义极性反转寄存器0地址   
  19. #define  PCA9555_REG_POL1        0x05                        //  定义极性反转寄存器1地址
  20. #define  PCA9555_REG_CFG0        0x06                        //  定义方向配置寄存器0地址   
  21. #define  PCA9555_REG_CFG1        0x07                        //  定义方向配置寄存器1地址      
  22. #define  PCA9555_DEVICE_ADDR     0x40                        //  定义PCA9555地址

  23. #define  LOOP_COUNT     10000

  24. u8 pro0=0xff,pro1=0xff,pro2=0xff,pro3=0xff,PCA9555_dengban_ADDR,PCA9555_zkb_ADDR;

  25. u8 value_keep0_l,value_keep0_h,value_keep1_l,value_keep1_h,value_keep2_l,value_keep2_h;
  26. u8 parameters;
  27. u16 led_buf[5];
  28. u8 value_feedback0[2],value_feedback1[2],value_feedback2[2];
  29. u16 auto_off_time_count;
  30. u16 auto_open_off_time_count[16];
  31. u16 auto_close_off_time_count[16];
  32. u8 doorstate[16];
  33. u8 powerstate[8];
  34. u8 Refresh_Led=0;
  35. u8 Refresh_Power=0;
  36. /*//  定义全局变量   
  37. static unsigned long I2CM_BASE = I2C0_MASTER_BASE;  //  定义I2C主机基址,并初始化   
  38. static tI2CM_DEVICE gtDevice;                       //  器件数据接口   
  39. static unsigned short gusStatus = STAT_IDLE;        //  工作状态   
  40. //static tBoolean gbSendRecv;                         //  收发操作标志,false发送,true接收   
  41. static char gcAddr[4];                              //  数据地址数组   
  42. static unsigned short gusAddrIndex;                 //  数据地址数组索引变量   
  43. static unsigned short gusDataIndex;                 //  数据缓冲区索引变量   
  44. */

  45. void delay(u32 conut)
  46. {
  47.                 while(conut -- > 0);
  48. }


  49. void IIC_SDA_DIR_SET(u8 io_dir) //SDA引脚输入输出设置
  50. {
  51.         GPIO_InitTypeDef GPIO_InitStructure;
  52.         if(io_dir==0)
  53.         {
  54.                 GPIO_InitStructure.GPIO_Pin = SDA;
  55.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//output
  56.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  58.         }
  59.         else if(io_dir==1)
  60.         {
  61.                 GPIO_InitStructure.GPIO_Pin = SDA;
  62.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//input  pull_up
  63.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  64.         }
  65. }

  66. void IIC_SDA_DIR_SET_LED(u8 io_dir) //SDA_LED引脚输入输出设置
  67. {
  68.         GPIO_InitTypeDef GPIO_InitStructure;
  69.         if(io_dir==0)
  70.         {
  71.                 GPIO_InitStructure.GPIO_Pin = SDA_LED;
  72.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//output
  73.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  74.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  75.         }
  76.         else if(io_dir==1)
  77.         {
  78.                 GPIO_InitStructure.GPIO_Pin = SDA_LED;
  79.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//input  pull_up
  80.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  81.         }
  82. }

  83. void IIC_Ready(void)
  84. {
  85.    
  86.            GPIO_SetBits(GPIOB,SCL);
  87.           DELAY;
  88.            GPIO_SetBits(GPIOB,SDA);
  89.            DELAY;
  90. }

  91. void IIC_PORT_INIT(void)
  92. {
  93.         GPIO_InitTypeDef GPIO_InitStructure;
  94.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

  95.         GPIO_InitStructure.GPIO_Pin = SCL|SDA;
  96.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  97.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  98.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  99.        
  100.         IIC_Ready();
  101. }

  102. void IIC_Start(void)
  103. {
  104.         GPIO_SetBits(GPIOB,SDA);
  105.         DELAY;
  106.         GPIO_SetBits(GPIOB,SCL);
  107.         DELAY;
  108.         GPIO_ResetBits(GPIOB, SDA);
  109.         DELAY;
  110. }

  111. void IIC_Stop(void)

  112. {
  113.         GPIO_ResetBits(GPIOB, SDA);
  114.         DELAY;
  115.         GPIO_SetBits(GPIOB,SCL);
  116.         DELAY;
  117.         GPIO_SetBits(GPIOB,SDA);
  118.         DELAY;
  119. }

  120. void IIC_Ack(void)

  121. {
  122.         u16 i;
  123.         GPIO_SetBits(GPIOB,SCL);
  124.         DELAY;
  125.         IIC_SDA_DIR_SET(1);
  126.         while(GPIO_ReadInputDataBit(GPIOB,SDA)&&(i<0x2b0)) {i++;}
  127.         IIC_SDA_DIR_SET(0);
  128.         GPIO_ResetBits(GPIOB,SCL);
  129.         DELAY;
  130. }

  131. void IIC_Send_Ack(void)

  132. {
  133.         GPIO_ResetBits(GPIOB,SDA);
  134.         DELAY;
  135.         GPIO_SetBits(GPIOB,SCL);
  136.         DELAY;
  137.         GPIO_ResetBits(GPIOB,SCL);
  138.         DELAY;
  139. }

  140. void IIC_Send_NoAck(void)

  141. {
  142.         GPIO_SetBits(GPIOB,SDA);
  143.         DELAY;
  144.         GPIO_SetBits(GPIOB,SCL);
  145.         DELAY;
  146.         GPIO_ResetBits(GPIOB,SCL);
  147.         DELAY;
  148. }


  149. void IIC_Write_Byte(u8 a)
  150. {
  151.         u16 i;
  152.         GPIO_ResetBits(GPIOB,SCL); //scl=0;
  153.         DELAY;
  154.         for(i=0;i<8;i++)
  155.         {
  156.                 if(a&0x80)
  157.                 GPIO_SetBits(GPIOB,SDA);//sda=1;
  158.                 else
  159.                 GPIO_ResetBits(GPIOB,SDA);

  160.                 a=a<<1;
  161.                 GPIO_SetBits(GPIOB,SCL);//scl=1;
  162.                 DELAY;
  163.                 GPIO_ResetBits(GPIOB,SCL);//scl=0;
  164.                 DELAY;
  165.         }
  166.         GPIO_SetBits(GPIOB,SDA);//sda=1;
  167.         DELAY;
  168. }

  169. u8 IIC_Read_Byte(void)
  170. {
  171.         u8 i,temp;
  172.         temp=0;
  173.         GPIO_SetBits(GPIOB,SDA);//sda=1;
  174.         DELAY;
  175.         GPIO_ResetBits(GPIOB,SCL); //scl=0;
  176.         DELAY;
  177.         IIC_SDA_DIR_SET(1);
  178.         for(i=0;i<8;i++)
  179.         {
  180.                 GPIO_SetBits(GPIOB,SCL); //scl=1;
  181.                 DELAY;
  182.                 DELAY;
  183.                 temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,SDA);
  184.                 DELAY;
  185.                 GPIO_ResetBits(GPIOB,SCL); //scl=0;
  186.                 DELAY;
  187.         }
  188.         IIC_SDA_DIR_SET(0);
  189.         GPIO_SetBits(GPIOB,SDA);//sda=1;
  190.         DELAY;
  191.         //GPIO_ResetBits(GPIOB,SCL);//scl=0;
  192.         //DELAY;
  193.         return temp;
  194. }
  195. ////////////////////////////////////////////////////////////////////////////////
  196. /////////////////////////////////////////////////////////////////////////////////
  197. /////////////////////////////////////////////////////////////////////////////////
  198. void IIC_Ready_LED(void)
  199. {
  200.    
  201.            GPIO_SetBits(GPIOB,SCL_LED);
  202.           DELAY;
  203.            GPIO_SetBits(GPIOB,SDA_LED);
  204.            DELAY;
  205. }

  206. void IIC_PORT_INIT_LED(void)
  207. {
  208.         GPIO_InitTypeDef GPIO_InitStructure;
  209.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

  210.         GPIO_InitStructure.GPIO_Pin = SCL_LED|SDA_LED;
  211.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  212.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  213.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  214.        
  215.         IIC_Ready_LED();
  216. }

  217. void IIC_Start_LED(void)
  218. {
  219.         GPIO_SetBits(GPIOB,SDA_LED);
  220.         DELAY;
  221.         GPIO_SetBits(GPIOB,SCL_LED);
  222.         DELAY;
  223.         GPIO_ResetBits(GPIOB, SDA_LED);
  224.         DELAY;
  225. }

  226. void IIC_Stop_LED(void)

  227. {
  228.         GPIO_ResetBits(GPIOB, SDA_LED);
  229.         DELAY;
  230.         GPIO_SetBits(GPIOB,SCL_LED);
  231.         DELAY;
  232.         GPIO_SetBits(GPIOB,SDA_LED);
  233.         DELAY;
  234. }

  235. void IIC_Ack_LED(void)

  236. {
  237.         u16 i;
  238.         GPIO_SetBits(GPIOB,SCL_LED);
  239.         DELAY;
  240.         IIC_SDA_DIR_SET_LED(1);
  241.         while(GPIO_ReadInputDataBit(GPIOB,SDA_LED)&&(i<0x2b0)) {i++;}
  242.         IIC_SDA_DIR_SET_LED(0);
  243.         GPIO_ResetBits(GPIOB,SCL_LED);
  244.         DELAY;
  245. }

  246. void IIC_Send_Ack_LED(void)

  247. {
  248.         GPIO_ResetBits(GPIOB,SDA_LED);
  249.         DELAY;
  250.         GPIO_SetBits(GPIOB,SCL_LED);
  251.         DELAY;
  252.         GPIO_ResetBits(GPIOB,SCL_LED);
  253.         DELAY;
  254. }

  255. void IIC_Send_NoAck_LED(void)

  256. {
  257.         GPIO_SetBits(GPIOB,SDA_LED);
  258.         DELAY;
  259.         GPIO_SetBits(GPIOB,SCL_LED);
  260.         DELAY;
  261.         GPIO_ResetBits(GPIOB,SCL_LED);
  262.         DELAY;
  263. }

  264. void IIC_Write_Byte_LED(u8 a)
  265. {
  266.         u16 i;
  267.         GPIO_ResetBits(GPIOB,SCL_LED); //scl=0;
  268.         DELAY;
  269.         for(i=0;i<8;i++)
  270.         {
  271.                 if(a&0x80)
  272.                 GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
  273.                 else
  274.                 GPIO_ResetBits(GPIOB,SDA_LED);

  275.                 a=a<<1;
  276.                 GPIO_SetBits(GPIOB,SCL_LED);//scl=1;
  277.                 DELAY;
  278.                 GPIO_ResetBits(GPIOB,SCL_LED);//scl=0;
  279.                 DELAY;
  280.         }
  281.         GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
  282.         DELAY;
  283. }

  284. u8 IIC_Read_Byte_LED(void)
  285. {
  286.         u8 i,temp;
  287.         temp=0;
  288.         GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
  289.         DELAY;
  290.         GPIO_ResetBits(GPIOB,SCL_LED); //scl=0;
  291.         DELAY;
  292.         IIC_SDA_DIR_SET_LED(1);
  293.         for(i=0;i<8;i++)
  294.         {
  295.                 GPIO_SetBits(GPIOB,SCL_LED); //scl=1;
  296.                 DELAY;
  297.                 DELAY;
  298.                 temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,SDA_LED);
  299.                 DELAY;
  300.                 GPIO_ResetBits(GPIOB,SCL_LED); //scl=0;
  301.                 DELAY;
  302.         }
  303.         IIC_SDA_DIR_SET_LED(0);
  304.         GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
  305.         DELAY;
  306.         //GPIO_ResetBits(GPIOB,SCL_LED);//scl=0;
  307.         //DELAY;
  308.         return temp;
  309. }

  310. void IIC_Write_Pca9555(u8 addr,u8 reg_addr,u8 low_byte,u8 high_byte)
  311. {
  312.           IIC_Start();
  313.           IIC_Write_Byte(addr & 0xfe);
  314.           IIC_Ack();
  315.           IIC_Write_Byte(reg_addr);
  316.           IIC_Ack();
  317.           IIC_Write_Byte(low_byte);
  318.           IIC_Ack();
  319.           IIC_Write_Byte(high_byte);
  320.           IIC_Ack();
  321.           IIC_Stop();
  322. }

  323. void IIC_Write_Pca9555_LED(u8 addr,u8 reg_addr,u8 low_byte,u8 high_byte)
  324. {
  325.           IIC_Start_LED();
  326.           IIC_Write_Byte_LED(addr & 0xfe);
  327.           IIC_Ack_LED();
  328.           IIC_Write_Byte_LED(reg_addr);
  329.           IIC_Ack_LED();
  330.           IIC_Write_Byte_LED(low_byte);
  331.           IIC_Ack_LED();
  332.           IIC_Write_Byte_LED(high_byte);
  333.           IIC_Ack_LED();
  334.           IIC_Stop_LED();
  335. }

  336. void IIC_Read_Pca9555(u8 addr,u8 reg_addr,u8* pBuffer,u16 num)
  337. {
  338.           IIC_Start();
  339.           IIC_Write_Byte(addr & 0xfe);
  340.           IIC_Ack();
  341.           IIC_Write_Byte(reg_addr);
  342.           IIC_Ack();

  343.           IIC_Start();
  344.           IIC_Write_Byte(addr | 0x01);
  345.           IIC_Ack();
  346.           while (num)
  347.           {
  348.                     *pBuffer = IIC_Read_Byte();
  349.                         if (num == 1)
  350.                         {
  351.                                 IIC_Send_NoAck();
  352.                         }
  353.                         else
  354.                         {
  355.                                 IIC_Send_Ack();
  356.                         }       
  357.                     pBuffer++;
  358.                         num--;
  359.           }
  360.           IIC_Stop();
  361. }

  362. void IIC_Read_Pca9555_LED(u8 addr,u8 reg_addr,u8* pBuffer,u16 num)
  363. {
  364.           IIC_Start_LED();
  365.           IIC_Write_Byte_LED(addr & 0xfe);
  366.           IIC_Ack_LED();
  367.           IIC_Write_Byte_LED(reg_addr);
  368.           IIC_Ack_LED();

  369.           IIC_Start_LED();
  370.           IIC_Write_Byte_LED(addr | 0x01);
  371.           IIC_Ack_LED();
  372.           while (num)
  373.           {
  374.                     *pBuffer = IIC_Read_Byte_LED();
  375.                         if (num == 1)
  376.                         {
  377.                                 IIC_Send_NoAck_LED();
  378.                         }
  379.                         else
  380.                         {
  381.                                 IIC_Send_Ack_LED();
  382.                         }       
  383.                     pBuffer++;
  384.                         num--;
  385.           }
  386.           IIC_Stop_LED();
  387. }

  388. //  I2C主机初始化   
  389. void I2CM_Init(void)   
  390. {   
  391. //    I2CM_DeviceInitSet(>Device, 0, 0, 0, (void *)0, 0);   
  392.    
  393.             I2C_InitTypeDef  I2C_InitStructure;
  394.                   GPIO_InitTypeDef  GPIO_InitStructure;

  395.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2 | RCC_APB1Periph_I2C1,ENABLE);
  396.             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  397.    

  398.                 /* PB6,7 SCL and SDA */
  399.                 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 | GPIO_Pin_11;
  400.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  401.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;         //设置管脚为复用功能开漏输出
  402.                 GPIO_Init(GPIOB, &GPIO_InitStructure);                  //
  403.        

  404.                 I2C_DeInit(I2C2);
  405.                 I2C_DeInit(I2C1);
  406.             I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;                 //
  407.             I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;        //
  408.             I2C_InitStructure.I2C_OwnAddress1 = 0x30;                  //
  409.             I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;                //
  410.             I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  411.             I2C_InitStructure.I2C_ClockSpeed = 400000;                //
  412.    
  413.                 I2C_Cmd(I2C2, ENABLE);
  414.                 I2C_Cmd(I2C1, ENABLE);                                    //
  415.                 I2C_Init(I2C2, &I2C_InitStructure);                       //
  416.                 I2C_Init(I2C1, &I2C_InitStructure);
  417.                 I2C_AcknowledgeConfig(I2C2, ENABLE);
  418.                 I2C_AcknowledgeConfig(I2C1, ENABLE);
  419. }   


  420. //写主控板上的pca9555
  421. /*
  422.   u8 PCA9555_dengban_ADDR  芯片地址,0x40表示第一个芯片地址
  423.   u8 pro2  写入芯片的前八位数据
  424.   u8 pro3   写入芯片的前后位数据

  425. */
  426. void write1(u8 PCA9555_dengban_ADDR,u8 pro2,u8 pro3)

  427. {                        
  428. //__disable_irq ;
  429.        
  430.         IIC_Write_Pca9555_LED(PCA9555_dengban_ADDR,0x02,pro2,pro3);
  431.         //IIC_Write_Pca9555_LED(PCA9555_dengban_ADDR,0x06,0x00,0x00);

  432. //__enable_irq ;                           


  433. }


  434. /********************************主控板上的pca555控制程序*********************************************/
  435.    
  436.   //////////////////////////////////////////////////////////////////写命令 i2c1操作的是主控板上的pca555
  437. void write2(u8 PCA9555_zkb_ADDR,u8 pro0,u8 pro1)
  438. {                        
  439. //__disable_irq ;

  440.         IIC_Write_Pca9555(PCA9555_zkb_ADDR,0x02,pro0,pro1);
  441.         //IIC_Write_Pca9555(PCA9555_zkb_ADDR,0x06,0x00,0x00);

  442. //__enable_irq ;                           

  443. }




  444. /*****************************读命令主控板*****************************************/

  445. void I2C_ReadS_PCA9555(u8 PCA9555_zhukong_ADDR,u8 PCA9555_REG_IN,u8* pBuffer,u16 no)

  446. {
  447. /*
  448. *Read from register
  449. */   
  450. //__disable_irq ;
  451.         //IIC_Write_Pca9555(PCA9555_zhukong_ADDR,0x06,0xff,0xff);        
  452.         IIC_Read_Pca9555(PCA9555_zhukong_ADDR,PCA9555_REG_IN,pBuffer,no);
  453. //__enable_irq ;   //开中断
  454. }



  455.   /*****************************读命令灯板*****************************************/

  456. void I2C_ReadS_PCA95552(u8 PCA9555_dengban_ADDR,u8 PCA9555_REG_IN,u8* pBuffer,u16 no)

  457. {
  458. /*
  459. *Read from register

  460. */
  461.                         
  462. //__disable_irq ;
  463.         IIC_Read_Pca9555_LED(PCA9555_dengban_ADDR,PCA9555_REG_IN,pBuffer,no);
  464. //__enable_irq ;                           

  465. }


  466. void Set_Value_To_Output(u8 num)
  467. {
  468.          if (num <17)
  469.          {
  470.                          if  (num <9)
  471.                         {
  472.                                    value_keep0_l |= 0x01<<(num - 1);
  473.                                    write2(0x44,value_keep0_l,value_keep0_h);
  474.                                    return;
  475.                         }
  476.                         else
  477.                         {
  478.                                    value_keep0_h |= 0x01<<(num - 9);
  479.                                    write2(0x44,value_keep0_l,value_keep0_h);
  480.                                    return;
  481.                         }
  482.          }
  483.          else if (num >16 && num <33)
  484.          {
  485.                          if  (num <25)
  486.                         {
  487.                                    value_keep1_l |= 0x01<<(num - 17);
  488.                                    write2(0x46,value_keep1_l,value_keep1_h);
  489.                                    return;
  490.                         }
  491.                         else
  492.                         {
  493.                                    value_keep1_h |= 0x01<<(num - 25);
  494.                                    write2(0x46,value_keep1_l,value_keep1_h);
  495.                                    return;
  496.                         }
  497.          }
  498.          else if (num <41)
  499.          {
  500.                          value_keep2_l |= 0x01<<(num - 33);
  501.                         write2(0x4a,value_keep2_l,value_keep2_h);
  502.                         return;
  503.          }
  504.          else
  505.          {
  506.                          //error
  507.          }
  508. }

  509. void Clear_Value_To_Output(u8 num)
  510. {
  511.          if (num <17)
  512.          {
  513.                          if  (num <9)
  514.                         {
  515.                                    value_keep0_l &= ~(0x01<<(num - 1));
  516.                                    write2(0x44,value_keep0_l,value_keep0_h);
  517.                                    return;
  518.                         }
  519.                         else
  520.                         {
  521.                                    value_keep0_h &= ~(0x01<<(num - 9));
  522.                                    write2(0x44,value_keep0_l,value_keep0_h);
  523.                                    return;
  524.                         }
  525.          }
  526.          else if (num >16 && num <33)
  527.          {
  528.                          if  (num <25)
  529.                         {
  530.                                    value_keep1_l &= ~(0x01<<(num - 17));
  531.                                    write2(0x46,value_keep1_l,value_keep1_h);
  532.                                    return;
  533.                         }
  534.                         else
  535.                         {
  536.                                    value_keep1_h &= ~(0x01<<(num - 25));
  537.                                    write2(0x46,value_keep1_l,value_keep1_h);
  538.                                    return;
  539.                         }
  540.          }
  541.          else if (num <41)
  542.          {
  543.                          value_keep2_l &= ~(0x01<<(num - 33));
  544.                         write2(0x4a,value_keep2_l,value_keep2_h);
  545.                         return;
  546.          }
  547.          else
  548.          {
  549.                          //error
  550.          }
  551. }

  552. void Change_Value_To_Output(u8 num,u8 value)
  553. {
  554.                 if (value == 0)
  555.                          Clear_Value_To_Output(num);
  556.                 else
  557.                          Set_Value_To_Output(num);
  558. }

  559. void All_Off__To_Output(void)
  560. {
  561.                 write2(0x44,0,0);
  562.                 write2(0x46,0,0);
  563.                 write2(0x4a,0,0);
  564.                 value_keep0_l = 0;value_keep0_h = 0;
  565.                 value_keep1_l = 0;value_keep1_h = 0;
  566.                 value_keep2_l = 0;value_keep2_h = 0;
  567. }       

  568. void All_On__To_Output(void)
  569. {
  570.                 write2(0x44,0xff,0xff);//delay(100000);
  571.                 write2(0x46,0xff,0xff);//delay(100000);
  572.                 write2(0x4a,0xff,0xff);//delay(100000);
  573.                 value_keep0_l = 0xff;value_keep0_h = 0xff;
  574.                 value_keep1_l = 0xff;value_keep1_h = 0xff;
  575.                 value_keep2_l = 0xff;value_keep2_h = 0xff;
  576. }

  577. void All_Off__To_OpenDoor_Output(void)
  578. {               
  579.                 write2(0x46,0,0);
  580.                 write2(0x44,0,0);
  581.                 value_keep0_l = 0;value_keep0_h = 0;
  582.                 value_keep1_l = 0;value_keep1_h = 0;
  583. }       

  584. void All_On__To_OpenDoor_Output(void)
  585. {
  586.                 write2(0x44,0xff,0xff);
  587.                 write2(0x46,0xff,0xff);
  588.                 value_keep0_l = 0xff;value_keep0_h = 0xff;
  589.                 value_keep1_l = 0xff;value_keep1_h = 0xff;

  590. }
  591. void All_Off__To_CloseDoor_Output(void)
  592. {               
  593.                 write2(0x46,0,0);
  594.                 write2(0x44,0,0);
  595.                 value_keep0_l = 0;value_keep0_h = 0;
  596.                 value_keep1_l = 0;value_keep1_h = 0;
  597. }       

  598. void All_On__To_CloseDoor_Output(void)
  599. {
  600.                 write2(0x44,0,0);
  601.                 write2(0x46,0xff,0xff);
  602.                 value_keep0_l = 0;value_keep0_h = 0;
  603.                 value_keep1_l = 0xff;value_keep1_h = 0xff;

  604. }
  605. void All_Off__To_Power_Output(void)
  606. {
  607.                 write2(0x4a,0,0);
  608.                 value_keep2_l = 0;value_keep2_h = 0;
  609. }       

  610. void All_On__To_Power_Output(void)
  611. {
  612.                 write2(0x4a,0xff,0xff);
  613.                 value_keep2_l = 0xff;value_keep2_h = 0xff;

  614. }

  615. u16 uart_deal_function(void)
  616. {
  617.         u8 i;
  618.         u8 temp_data[BUFFER_LEN],temp_data_length;
  619.         u8 state=0;
  620.         if (uart_data_length > 0 && uart_timerout_count == 0)
  621.         {
  622.                 //__disable_irq ;
  623.                 for (i=0;i<uart_data_length;i++)
  624.                 {
  625.                         temp_data[i] = uart_data485[i];
  626.                 }
  627.                 temp_data_length =         uart_data_length;
  628.        
  629.                 uart_data_length = 0;
  630.                 //__enable_irq ;
  631.                 for (i=0;i<temp_data_length;i++)
  632.                 {
  633.                         //Send_Byte(temp_data[i]);
  634.                         switch(state)
  635.                         {
  636.                                 case 0:       
  637.                                         if (temp_data[i] == 'o')
  638.                                         {
  639.                                                 state = 10;
  640.                                         }
  641.                                         else if (temp_data[i] == 'c')
  642.                                         {
  643.                                                 state = 20;
  644.                                         }
  645.                                         else if (temp_data[i] == 't')
  646.                                         {
  647.                                                 state = 30;
  648.                                         }
  649.                                         else if (temp_data[i] == 'd')
  650.                                         {
  651.                                                 if (temp_data_length - i > 8)
  652.                                                 {
  653.                                                         if (temp_data[i+1] == 'o')
  654.                                                                 if (temp_data[i+2] == 'o')
  655.                                                                         if (temp_data[i+3] == 'r')
  656.                                                                                 if (temp_data[i+4] == 's')
  657.                                                                                         if (temp_data[i+5] == 't')
  658.                                                                                                 if (temp_data[i+6] == 'a')
  659.                                                                                                         if (temp_data[i+7] == 't')
  660.                                                                                                                 if (temp_data[i+8] == 'e')
  661.                                                                                                                 {
  662.                                                                                                                         return 10;//doorstate
  663.                                                                                                                 }


  664.                                                         state = 0;
  665.                                                 }
  666.                                         }
  667.                                         else if (temp_data[i] == 'p')
  668.                                         {
  669.                                                 if (temp_data_length - i > 9)
  670.                                                 {
  671.                                                         if (temp_data[i+1] == 'o')
  672.                                                                 if (temp_data[i+2] == 'w')
  673.                                                                         if (temp_data[i+3] == 'e')
  674.                                                                                 if (temp_data[i+4] == 'r')
  675.                                                                                         if (temp_data[i+5] == 's')
  676.                                                                                                 if (temp_data[i+6] == 't')
  677.                                                                                                         if (temp_data[i+7] == 'a')
  678.                                                                                                                 if (temp_data[i+8] == 't')
  679.                                                                                                                         if (temp_data[i+9] == 'e')
  680.                                                                                                                         {
  681.                                                                                                                                 return 11;//powerstate
  682.                                                                                                                         }


  683.                                                         state = 0;
  684.                                                 }
  685.                                         }
  686.                                         else
  687.                                         {
  688.                                         }
  689.                                         break;
  690.                                 case 10:
  691.                                         if (temp_data[i] == 'p')
  692.                                         {
  693.                                                 state = 11;
  694.                                         }
  695.                                         else if (temp_data[i] == 'n')
  696.                                         {
  697.                                                 if (i + 1 == temp_data_length)
  698.                                                 {
  699.                                                         return 3;//on
  700.                                                 }
  701.                                                 else
  702.                                                 {
  703.                                                         if (temp_data_length - i > 1)
  704.                                                         {
  705.                                                                    if (temp_data[i+1] > 0x2f && temp_data[i+1] < 0x3a )
  706.                                                                    {
  707.                                                                                    parameters = temp_data[i+1] - 0x30;
  708.                                                                                    return 4 + (parameters<<8);//onx
  709.                                                                    }
  710.                                                                    else
  711.                                                                                    state = 0;
  712.                                                         }
  713.                                                         else
  714.                                                                 return 0;
  715.                                                 }
  716.                                         }
  717.                                         else if (temp_data[i] == 'f')
  718.                                         {
  719.                                                 state = 13;
  720.                                         }
  721.                                         else
  722.                                         {
  723.                                                 state = 0;
  724.                                         }
  725.                                         break;
  726.                                 case 11:
  727.                                         if (temp_data[i] == 'e')
  728.                                         {
  729.                                                 state = 14;
  730.                                         }
  731.                                         else
  732.                                         {
  733.                                                 state = 0;
  734.                                         }
  735.                                         break;
  736.                                 case 12:
  737.                                         break;
  738.                                 case 13:
  739.                                         if (temp_data[i] == 'f')
  740.                                         {
  741.                                                 if (i + 1 == temp_data_length)
  742.                                                 {
  743.                                                         return 5;//off
  744.                                                 }
  745.                                                 else
  746.                                                 {
  747.                                                         if (temp_data_length - i > 1)
  748.                                                         {
  749.                                                                    if (temp_data[i+1] > 0x2f && temp_data[i+1] < 0x3a )
  750.                                                                    {
  751.                                                                                    parameters = temp_data[i+1] - 0x30;
  752.                                                                                    return 6 + (parameters<<8);//offx
  753.                                                                    }
  754.                                                                    else
  755.                                                                                    state = 0;
  756.                                                         }
  757.                                                         else
  758.                                                                 return 0;
  759.                                                 }
  760.                                         }
  761.                                         else
  762.                                         {
  763.                                                 state = 0;
  764.                                         }
  765.                                         break;
  766.                                 case 14:
  767.                                         if (temp_data[i] == 'n')
  768.                                         {
  769.                                                 if (i + 1 == temp_data_length)
  770.                                                 {
  771.                                                         return 1;//open
  772.                                                 }
  773.                                                 else
  774.                                                 {
  775.                                                         if (temp_data_length - i > 2)
  776.                                                         {
  777.                                                                    if (temp_data[i+1] > 0x2f && temp_data[i+1] < 0x3a && temp_data[i+2] > 0x2f && temp_data[i+2] < 0x3a)
  778.                                                                    {
  779.                                                                                    parameters = (temp_data[i+1] - 0x30) * 10 + (temp_data[i+2] - 0x30);
  780.                                                                                    return 2 + (parameters<<8);//openxx
  781.                                                                    }
  782.                                                                    else
  783.                                                                                    state = 0;
  784.                                                         }
  785.                                                         else
  786.                                                                 return 0;
  787.                                                 }
  788.                                         }
  789.                                         else
  790.                                         {
  791.                                                 state = 0;
  792.                                         }
  793.                                         break;
  794.                                 case 20:
  795.                                         if (temp_data[i] == 'l')
  796.                                         {
  797.                                                 state = 21;
  798.                                         }
  799.                                         else
  800.                                         {
  801.                                                 state = 0;
  802.                                         }
  803.                                         break;
  804.                                 case 21:
  805.                                         if (temp_data[i] == 'o')
  806.                                         {
  807.                                                 state = 22;
  808.                                         }
  809.                                         else
  810.                                         {
  811.                                                 state = 0;
  812.                                         }
  813.                                         break;
  814.                                 case 22:
  815.                                         if (temp_data[i] == 's')
  816.                                         {
  817.                                                 state = 23;
  818.                                         }
  819.                                         else
  820.                                         {
  821.                                                 state = 0;
  822.                                         }
  823.                                         break;
  824.                                 case 23:
  825.                                         if (temp_data[i] == 'e')
  826.                                         {
  827.                                                 if (i + 1 == temp_data_length)
  828.                                                 {
  829.                                                         return 7;//close
  830.                                                 }
  831.                                                 else
  832.                                                 {
  833.                                                         if (temp_data_length - i > 2)
  834.                                                         {
  835.                                                                    if (temp_data[i+1] > 0x2f && temp_data[i+1] < 0x3a && temp_data[i+2] > 0x2f && temp_data[i+2] < 0x3a)
  836.                                                                    {
  837.                                                                                    parameters = (temp_data[i+1] - 0x30) * 10 + (temp_data[i+2] - 0x30);
  838.                                                                                    return 8 + (parameters<<8);//closexx
  839.                                                                    }
  840.                                                                    else
  841.                                                                                    state = 0;
  842.                                                         }
  843.                                                         else
  844.                                                                 return 0;
  845.                                                 }
  846.                                         }
  847.                                         else
  848.                                         {
  849.                                                 state = 0;
  850.                                         }
  851.                                         break;
  852.                                 case 30:
  853.                                         if (temp_data[i] == 'i')
  854.                                         {
  855.                                                 state = 31;
  856.                                         }
  857.                                         else
  858.                                         {
  859.                                                 state = 0;
  860.                                         }
  861.                                         break;
  862.                                 case 31:
  863.                                         if (temp_data[i] == 'm')
  864.                                         {
  865.                                                 state = 32;
  866.                                         }
  867.                                         else
  868.                                         {
  869.                                                 state = 0;
  870.                                         }
  871.                                         break;
  872.                                 case 32:
  873.                                         if (temp_data[i] == 'e')
  874.                                         {
  875.                                                
  876.                                                 if (temp_data_length - i > 2)
  877.                                                 {
  878.                                                            if (temp_data[i+2] == 's')
  879.                                                            {
  880.                                                                            if (temp_data[i+1] > 0x30 && temp_data[i+1] < 0x3a)
  881.                                                                         {
  882.                                                                                    parameters = temp_data[i+1] - 0x30;
  883.                                                                                    return 9 + (parameters<<8);//timexs
  884.                                                                         }
  885.                                                                         else if (temp_data[i+1] == 0x41)
  886.                                                                         {
  887.                                                                                 parameters = 0x0a;
  888.                                                                                    return 9 + (parameters<<8);//timexs
  889.                                                                         }
  890.                                                                         else
  891.                                                                                 state = 0;
  892.                                                            }
  893.                                                            else
  894.                                                                            state = 0;
  895.                                                 }
  896.                                                 else
  897.                                                         return 0;
  898.                                         }
  899.                                         else
  900.                                         {
  901.                                                 state = 0;
  902.                                         }
  903.                                         break;
  904.                         }
  905.                 }
  906.                 return 0;
  907.         }
  908.         else
  909.                 return 0;

  910. }

  911. void Led_On_RGB(u8 num,u16 value)
  912. {
  913.                 if (num < 6)
  914.                 {
  915.                         led_buf[0] &= (~(value<<((num-1)*3)));
  916.                         write1(0x40,led_buf[0],led_buf[0] >> 8);
  917.                 }
  918.                 else if(num > 6 && num <11)
  919.                 {
  920.                         led_buf[1] &= (~(value<<((num-7)*3+2)));
  921.                         write1(0x42,led_buf[1],led_buf[1] >> 8);
  922.                 }
  923.                 else if(num > 11 && num <17)
  924.                 {
  925.                         led_buf[2] &= (~(value<<((num-12)*3+1)));
  926.                         write1(0x44,led_buf[2],led_buf[2] >> 8);
  927.                 }
  928.                 else if(num > 16 && num <22)
  929.                 {
  930.                         led_buf[3] &=( ~(value<<((num-17)*3)));
  931.                         write1(0x46,led_buf[3],led_buf[3] >> 8);
  932.                 }
  933.                 else if(num > 22 && num <25)
  934.                 {
  935.                         led_buf[4] &= (~(value<<((num-23)*3+2)));
  936.                         write1(0x48,led_buf[4],led_buf[4] >> 8);
  937.                 }
  938.                 else if (num == 6)
  939.                 {
  940.                         led_buf[0] &= (~(value<<15));
  941.                         led_buf[1] &= (0xfffc | (~(value>>1)));
  942.                         write1(0x40,led_buf[0],led_buf[0] >> 8);
  943.                         write1(0x42,led_buf[1],led_buf[1] >> 8);
  944.                 }
  945.                 else if (num == 11)
  946.                 {
  947.                         led_buf[1] &= (~(value<<14));
  948.                         led_buf[2] &= (0xfffe | (~(value>>2)));
  949.                         write1(0x42,led_buf[1],led_buf[1] >> 8);
  950.                         write1(0x44,led_buf[2],led_buf[2] >> 8);
  951.                 }
  952.                 else if (num == 22)
  953.                 {
  954.                         led_buf[3] &= (~(value<<15));
  955.                         led_buf[4] &= (0xfffc | (~(value>>1)));
  956.                         write1(0x46,led_buf[3],led_buf[3] >> 8);
  957.                         write1(0x48,led_buf[4],led_buf[4] >> 8);
  958.                 }       
  959. }

  960. void Led_Off_RGB(u8 num,u16 value)
  961. {
  962.                 if (num < 6)
  963.                 {
  964.                         led_buf[0] |= (value<<((num-1)*3));
  965.                         write1(0x40,led_buf[0],led_buf[0] >> 8);
  966.                 }
  967.                 else if(num > 6 && num <11)
  968.                 {
  969.                         led_buf[1] |= (value<<((num-7)*3+2));
  970.                         write1(0x42,led_buf[1],led_buf[1] >> 8);
  971.                 }
  972.                 else if(num > 11 && num <17)
  973.                 {
  974.                         led_buf[2] |= (value<<((num-12)*3+1));
  975.                         write1(0x44,led_buf[2],led_buf[2] >> 8);
  976.                 }
  977.                 else if(num > 16 && num <22)
  978.                 {
  979.                         led_buf[3] |= (value<<((num-17)*3));
  980.                         write1(0x46,led_buf[3],led_buf[3] >> 8);
  981.                 }
  982.                 else if(num > 22 && num <25)
  983.                 {
  984.                         led_buf[4] |= (value<<((num-23)*3+2));
  985.                         write1(0x48,led_buf[4],led_buf[4] >> 8);
  986.                 }
  987.                 else if (num == 6)
  988.                 {
  989.                         led_buf[0] |= ((~0x7fff) & (value<<15));
  990.                         led_buf[1] |= ((~0xfffc) & ((value>>1)& 0x7fff));
  991.                         write1(0x40,led_buf[0],led_buf[0] >> 8);
  992.                         write1(0x42,led_buf[1],led_buf[1] >> 8);
  993.                 }
  994.                 else if (num == 11)
  995.                 {
  996.                         led_buf[1] |= ((~0x3fff) & (value<<14));
  997.                         led_buf[2] |= ((~0xfffe) & ((value>>2)&0x3fff));
  998.                         write1(0x42,led_buf[1],led_buf[1] >> 8);
  999.                         write1(0x44,led_buf[2],led_buf[2] >> 8);
  1000.                 }
  1001.                 else if (num == 22)
  1002.                 {
  1003.                         led_buf[3] |= ((~0x7fff) & (value<<15));
  1004.                         led_buf[4] |= ((~0xfffc) & ((value>>1)& 0x7fff));
  1005.                         write1(0x46,led_buf[3],led_buf[3] >> 8);
  1006.                         write1(0x48,led_buf[4],led_buf[4] >> 8);
  1007.                 }       
  1008. }

  1009. void Led_Off_R(u8 num)
  1010. {
  1011.         Led_Off_RGB(num,0x0004);
  1012. }
  1013. void Led_On_R(u8 num)
  1014. {
  1015.         Led_On_RGB(num,0x0004);
  1016. }
  1017. void Led_Off_G(u8 num)
  1018. {
  1019.         Led_Off_RGB(num,0x0002);
  1020. }
  1021. void Led_On_G(u8 num)
  1022. {
  1023.         Led_On_RGB(num,0x0002);
  1024. }
  1025. void Led_Off_B(u8 num)
  1026. {
  1027.         Led_Off_RGB(num,0x0001);
  1028. }
  1029. void Led_On_B(u8 num)
  1030. {
  1031.         Led_On_RGB(num,0x0001);
  1032. }
  1033. void All_Led_Off(void)
  1034. {
  1035.                 write1(0x40,0xff,0xff);
  1036.                 write1(0x42,0xff,0xff);
  1037.                 write1(0x44,0xff,0xff);
  1038.                 write1(0x46,0xff,0xff);
  1039.                 write1(0x48,0xff,0xff);
  1040.                 led_buf[0] = ~0;
  1041.                 led_buf[1] = ~0;
  1042.                 led_buf[2] = ~0;
  1043.                 led_buf[3] = ~0;
  1044.                 led_buf[4] = ~0;
  1045. }
  1046. void All_Led_On(void)
  1047. {
  1048.                 write1(0x40,0x00,0x00);
  1049.                 write1(0x42,0x00,0x00);
  1050.                 write1(0x44,0x00,0x00);
  1051.                 write1(0x46,0x00,0x00);
  1052.                 write1(0x48,0x00,0x00);
  1053.                 led_buf[0] = 0x00;
  1054.                 led_buf[1] = 0x00;
  1055.                 led_buf[2] = 0x00;
  1056.                 led_buf[3] = 0x00;
  1057.                 led_buf[4] = 0x00;
  1058. }

  1059. void Refresh_Power_Condition(void)
  1060. {
  1061.         I2C_ReadS_PCA9555(0x4d,0,value_feedback2,2);
  1062.         Refresh_Power = 1;
  1063. }

  1064. void Refresh_Power_Condition_Led(void)
  1065. {
  1066.         u8 i;
  1067.         for (i=0;i<8;i++)
  1068.         {
  1069.                 if (value_feedback2[0] & (0x01<<i))
  1070.                 {
  1071.                         Led_Off_G(i+1);Led_On_R(i+1);
  1072.                         powerstate[i] = 0x30;
  1073.                 }
  1074.                 else
  1075.                 {
  1076.                         Led_Off_R(i+1);Led_On_G(i+1);
  1077.                         powerstate[i] = 0x31;
  1078.                 }
  1079.         }
  1080. }

  1081. void Refresh_Door_Condition(void)
  1082. {
  1083.         u8 i;         
  1084.         I2C_ReadS_PCA9555(0x40,0,value_feedback0,2);
  1085.         I2C_ReadS_PCA9555(0x42,0,value_feedback1,2);
  1086.        
  1087.         for (i=0;i<8;i++)
  1088.         {
  1089.                 if ((value_feedback0[0] & (0x01<<i)) == (value_feedback1[0] & (0x01<<i)))
  1090.                 {
  1091.                         //Led_Off_G(i+9);Led_Off_R(i+9);Led_On_B(i+9);
  1092.                         //doorstate[i] = 0x32;
  1093.                 }
  1094.                 else if ((value_feedback0[0] & (0x01<<i)) == 0 )
  1095.                 {
  1096.                         if (auto_open_off_time_count[i]!= 0xffff)
  1097.                         {
  1098.                                 //auto_open_off_time_count[i] = 0;
  1099.                                 Clear_Value_To_Output(17+i);
  1100.                                 Clear_Value_To_Output(1+i);                                                          
  1101.                                 auto_open_off_time_count[i] = 0xffff;
  1102.                         }
  1103.                         //Led_Off_B(i+9);Led_Off_R(i+9);Led_On_G(i+9);
  1104.                         //doorstate[i] = 0x31;
  1105.                 }
  1106.                 else
  1107.                 {
  1108.                         if (auto_close_off_time_count[i]!= 0xffff)
  1109.                         {
  1110.                                 //auto_close_off_time_count[i] = 0;
  1111.                                 Clear_Value_To_Output(17+i);
  1112.                                 Clear_Value_To_Output(1+i);
  1113.                                 auto_close_off_time_count[i] = 0xffff;
  1114.                         }
  1115.                         //Led_Off_G(i+9);Led_Off_B(i+9);Led_On_R(i+9);
  1116.                         //doorstate[i] = 0x30;
  1117.                 }
  1118.         }
  1119.         for (i=0;i<8;i++)
  1120.         {
  1121.                 if ((value_feedback0[1] & (0x01<<i)) == (value_feedback1[1] & (0x01<<i)))
  1122.                 {
  1123.                         //Led_Off_G(i+17);Led_Off_R(i+17);Led_On_B(i+17);
  1124.                         //doorstate[i+8] = 0x32;
  1125.                 }
  1126.                 else if ((value_feedback0[1] & (0x01<<i)) == 0 )
  1127.                 {
  1128.                         if (auto_open_off_time_count[i+8]!= 0xffff)
  1129.                         {
  1130.                                 //auto_open_off_time_count[i+8] = 0;
  1131.                                 Clear_Value_To_Output(25+i);
  1132.                                 Clear_Value_To_Output(9+i);
  1133.                                 auto_open_off_time_count[i+8] = 0xffff;
  1134.                         }
  1135.                         //Led_Off_B(i+17);Led_Off_R(i+17);Led_On_G(i+17);
  1136.                         //doorstate[i+8] = 0x31;
  1137.                 }
  1138.                 else
  1139.                 {
  1140.                         if (auto_close_off_time_count[i+8] != 0xffff)
  1141.                         {
  1142.                                 //auto_close_off_time_count[i+8] = 0;
  1143.                                 Clear_Value_To_Output(25+i);
  1144.                                 Clear_Value_To_Output(9+i);
  1145.                                 auto_close_off_time_count[i+8] = 0xffff;
  1146.                         }
  1147.                         //Led_Off_G(i+17);Led_Off_B(i+17);Led_On_R(i+17);
  1148.                         //doorstate[i+8] = 0x30;
  1149.                 }
  1150.         }
  1151.         Refresh_Led = 1;
  1152. }

  1153. void Refresh_Door_Condition_Led(void)
  1154. {
  1155.         u8 i;                
  1156.         for (i=0;i<8;i++)
  1157.         {
  1158.                 if ((value_feedback0[0] & (0x01<<i)) == (value_feedback1[0] & (0x01<<i)))         //value_feedback0[0]反馈数据  16路
  1159.                 {
  1160.                         Led_Off_G(i+9);Led_Off_R(i+9);Led_On_B(i+9);
  1161.                         doorstate[i] = 0x32;        //ascii码的字符为2 表示异常
  1162.                 }
  1163.                 else if ((value_feedback0[0] & (0x01<<i)) == 0 )
  1164.                 {
  1165.                         Led_Off_B(i+9);Led_Off_R(i+9);Led_On_G(i+9);
  1166.                         doorstate[i] = 0x31;
  1167.                 }
  1168.                 else
  1169.                 {
  1170.                         Led_Off_G(i+9);Led_Off_B(i+9);Led_On_R(i+9);
  1171.                         doorstate[i] = 0x30;
  1172.                 }
  1173.         }
  1174.         for (i=0;i<8;i++)
  1175.         {
  1176.                 if ((value_feedback0[1] & (0x01<<i)) == (value_feedback1[1] & (0x01<<i)))
  1177.                 {
  1178.                         Led_Off_G(i+17);Led_Off_R(i+17);Led_On_B(i+17);
  1179.                         doorstate[i+8] = 0x32;
  1180.                 }
  1181.                 else if ((value_feedback0[1] & (0x01<<i)) == 0 )
  1182.                 {
  1183.                         Led_Off_B(i+17);Led_Off_R(i+17);Led_On_G(i+17);
  1184.                         doorstate[i+8] = 0x31;
  1185.                 }
  1186.                 else
  1187.                 {
  1188.                         Led_Off_G(i+17);Led_Off_B(i+17);Led_On_R(i+17);
  1189.                         doorstate[i+8] = 0x30;
  1190.                 }
  1191.         }
  1192. }

  1193. void PowerOn_Auto_CloseOff(void)
  1194. {
  1195.         u8 i;
  1196.         for (i=0;i<16;i++)
  1197.         {
  1198.                 if (doorstate[i] != 0x30)
  1199.                 {
  1200.                         Clear_Value_To_Output(1+i);
  1201.                         Set_Value_To_Output(17+i);
  1202.                         auto_close_off_time_count[i] = auto_off_time_count;
  1203.                 }
  1204.         }
  1205. }
643757107 发表于 2017-11-29 09:35 | 显示全部楼层
你把上面两个文件保存一下,就可以用了。
643757107 发表于 2017-11-29 09:38 | 显示全部楼层
PCA9555驱动.zip (5.83 KB, 下载次数: 15)

还是直接给你提供好吧
 楼主| dsh1989 发表于 2017-11-29 14:38 | 显示全部楼层
谢谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部