找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 485|回复: 1
打印 上一主题 下一主题
收起左侧

void IO_IN_UpData(void) 这C语言函数其中的逻辑关系 有大佬能指点下吗?

[复制链接]
跳转到指定楼层
楼主
ID:826942 发表于 2022-3-13 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <common.h>

  2. #define IO_ON            1
  3. #define IO_OFF          0

  4. GPIO_TypeDef *IO_OUT_GPIOx[1] = {GPIOB};
  5. uint16_t IO_OUT_GPIO_Pin[1] = {GPIO_Pin_9};
  6. BitAction IO_OUT_BitVal[1] = {Bit_RESET};

  7. uint8_t IO_IN_value[16];

  8. void IO_Init(void)
  9. {
  10.     uint8_t i;
  11.     for(i = 0; i < 16; i++)   
  12.     IO_IN_value[i] = IO_OFF;
  13. }

  14. uint8_t* IO_GetDate()   //16位IO口的数据
  15. {
  16.     static uint8_t IN[16];//C不支持在函数外返回局部变量地址,除非定义局部变量为static
  17.     IN[0] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
  18.     IN[1] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);
  19.     IN[2] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0);
  20.     IN[3] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1);
  21.     IN[4] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);
  22.     IN[5] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);
  23.     IN[6] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);
  24.     IN[7] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
  25.     IN[8] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
  26.     IN[9] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);
  27.     IN[10] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
  28.     IN[11] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
  29.     IN[12] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12);
  30.     IN[13] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5);
  31.     IN[14] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6);
  32.     IN[15] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
  33.     return IN;
  34. }

  35. void IO_IN_UpData(void)   //这个函数不是很明白其中的逻辑关系 有大佬能指点下吗?
  36. {
  37.     uint8_t i;
  38.     uint8_t *In_Buf;
  39.     static uint8_t IO_in_Buf[16];   //16位数据缓存
  40.     In_Buf = IO_GetDate();   //把获取的16位IO口数据给缓存

  41.     for(i = 0; i < 16; i++)
  42.     {
  43.         IO_in_Buf[i] = IO_in_Buf[i] << 1;  //没得到一位数据左移一位
  44.         IO_in_Buf[i] &= 0x3f;      
  45.         if((*(In_Buf+i)) == 0x01)
  46.         {
  47.             IO_in_Buf[i] |= 0x01; //为什么
  48.         }
  49.     }
  50.     for(i = 0; i < 16; i++)
  51.     {
  52.         if(IO_in_Buf[i] == 0)
  53.         {
  54.             IO_IN_value[i] = IO_OFF;
  55.         }
  56.         else if(IO_in_Buf[i] == 0x3f)
  57.         {
  58.             IO_IN_value[i] = IO_ON;
  59.         }
  60.     }
  61. }

  62. void IO_OUT_UpData(uint8_t add,uint8_t size,uint8_t *Mode,BitAction shanshuo)//(地址   大小  模式  闪烁)
  63.         //bitactiion就是一个枚举类型的变量,表示这个位是高电平还是低电平
  64. {
  65.     uint8_t i = 0;
  66.     for(i = add;i < (add + size);i++)  //首地址+长度  累加
  67.     {
  68.         if(Mode[i] == 2)
  69.         {
  70.             IO_OUT_BitVal[i] = shanshuo;  //模式为2 闪烁
  71.         }
  72.         else if(Mode[i] == 1)
  73.         {
  74.             IO_OUT_BitVal[i] = Bit_SET; //模式为1 高电平
  75.         }
  76.         else
  77.         {
  78.             IO_OUT_BitVal[i] = Bit_RESET;  //其他为低电平
  79.         }
  80.         GPIO_WriteBit(IO_OUT_GPIOx[i], IO_OUT_GPIO_Pin[i], IO_OUT_BitVal[i]);  //写入GPIO的针脚的电平状态
  81.     }
  82. }

  83. void IO_PowerRun(void)
  84. {
  85.     uint8_t power_mode = 2;  //电源模式为2
  86.     static BitAction LED_shanshuo = Bit_RESET;   //LED闪烁 置0
  87.     if(Bit_RESET == LED_shanshuo)
  88.     {
  89.         LED_shanshuo = Bit_SET;       //为0置1
  90.     }
  91.     else
  92.     {
  93.         LED_shanshuo = Bit_RESET;      //为1置0   闪烁
  94.     }
  95.     IO_OUT_UpData(0,1,&power_mode,LED_shanshuo);   //为什么没有延迟
  96. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:826942 发表于 2022-3-13 10:02 | 只看该作者
里面的备注是我自己的理解加的 如果有错误希望大佬指正
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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