标题:
void IO_IN_UpData(void) 这C语言函数其中的逻辑关系 有大佬能指点下吗?
[打印本页]
作者:
0711zhao
时间:
2022-3-13 10:01
标题:
void IO_IN_UpData(void) 这C语言函数其中的逻辑关系 有大佬能指点下吗?
#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); //为什么没有延迟
}
复制代码
作者:
0711zhao
时间:
2022-3-13 10:02
里面的备注是我自己的理解加的 如果有错误希望大佬指正
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1