找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 883|回復(fù): 1
收起左側(cè)

void IO_IN_UpData(void) 這C語言函數(shù)其中的邏輯關(guān)系 有大佬能指點下嗎?

[復(fù)制鏈接]
ID:826942 發(fā)表于 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口的數(shù)據(jù)
  15. {
  16.     static uint8_t IN[16];//C不支持在函數(shù)外返回局部變量地址,除非定義局部變量為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)   //這個函數(shù)不是很明白其中的邏輯關(guān)系 有大佬能指點下嗎?
  36. {
  37.     uint8_t i;
  38.     uint8_t *In_Buf;
  39.     static uint8_t IO_in_Buf[16];   //16位數(shù)據(jù)緩存
  40.     In_Buf = IO_GetDate();   //把獲取的16位IO口數(shù)據(jù)給緩存

  41.     for(i = 0; i < 16; i++)
  42.     {
  43.         IO_in_Buf[i] = IO_in_Buf[i] << 1;  //沒得到一位數(shù)據(jù)左移一位
  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的針腳的電平狀態(tài)
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:826942 發(fā)表于 2022-3-13 10:02 | 顯示全部樓層
里面的備注是我自己的理解加的 如果有錯誤希望大佬指正
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表