- #include <common.h>
- #define IO_ON 1
- #define IO_OFF 0
- GPIO_TypeDef *IO_OUT_GPIOx[1] = {GPIOB};
- uint16_t IO_OUT_GPIO_Pin[1] = {GPIO_Pin_9};
- BitAction IO_OUT_BitVal[1] = {Bit_RESET};
- uint8_t IO_IN_value[16];
- void IO_Init(void)
- {
- uint8_t i;
- for(i = 0; i < 16; i++)
- IO_IN_value[i] = IO_OFF;
- }
- uint8_t* IO_GetDate() //16位IO口的数据
- {
- static uint8_t IN[16];//C不支持在函数外返回局部变量地址,除非定义局部变量为static
- IN[0] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
- IN[1] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);
- IN[2] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0);
- IN[3] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1);
- IN[4] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);
- IN[5] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);
- IN[6] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);
- IN[7] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
- IN[8] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
- IN[9] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);
- IN[10] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
- IN[11] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
- IN[12] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12);
- IN[13] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5);
- IN[14] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6);
- IN[15] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
- return IN;
- }
- void IO_IN_UpData(void) //这个函数不是很明白其中的逻辑关系 有大佬能指点下吗?
- {
- uint8_t i;
- uint8_t *In_Buf;
- static uint8_t IO_in_Buf[16]; //16位数据缓存
- In_Buf = IO_GetDate(); //把获取的16位IO口数据给缓存
- for(i = 0; i < 16; i++)
- {
- IO_in_Buf[i] = IO_in_Buf[i] << 1; //没得到一位数据左移一位
- IO_in_Buf[i] &= 0x3f;
- if((*(In_Buf+i)) == 0x01)
- {
- IO_in_Buf[i] |= 0x01; //为什么
- }
- }
- for(i = 0; i < 16; i++)
- {
- if(IO_in_Buf[i] == 0)
- {
- IO_IN_value[i] = IO_OFF;
- }
- else if(IO_in_Buf[i] == 0x3f)
- {
- IO_IN_value[i] = IO_ON;
- }
- }
- }
- void IO_OUT_UpData(uint8_t add,uint8_t size,uint8_t *Mode,BitAction shanshuo)//(地址 大小 模式 闪烁)
- //bitactiion就是一个枚举类型的变量,表示这个位是高电平还是低电平
- {
- uint8_t i = 0;
- for(i = add;i < (add + size);i++) //首地址+长度 累加
- {
- if(Mode[i] == 2)
- {
- IO_OUT_BitVal[i] = shanshuo; //模式为2 闪烁
- }
- else if(Mode[i] == 1)
- {
- IO_OUT_BitVal[i] = Bit_SET; //模式为1 高电平
- }
- else
- {
- IO_OUT_BitVal[i] = Bit_RESET; //其他为低电平
- }
- GPIO_WriteBit(IO_OUT_GPIOx[i], IO_OUT_GPIO_Pin[i], IO_OUT_BitVal[i]); //写入GPIO的针脚的电平状态
- }
- }
- void IO_PowerRun(void)
- {
- uint8_t power_mode = 2; //电源模式为2
- static BitAction LED_shanshuo = Bit_RESET; //LED闪烁 置0
- if(Bit_RESET == LED_shanshuo)
- {
- LED_shanshuo = Bit_SET; //为0置1
- }
- else
- {
- LED_shanshuo = Bit_RESET; //为1置0 闪烁
- }
- IO_OUT_UpData(0,1,&power_mode,LED_shanshuo); //为什么没有延迟
- }
复制代码 |