找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9880|回复: 9
收起左侧

STM8L单片机+BS818A的八位电容触摸按键方案全套设计资料 PCB+程序源码等

  [复制链接]
ID:219113 发表于 2018-7-31 17:14 | 显示全部楼层 |阅读模式
分享一套基于BS818A的八位电容触摸按键方案
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png

成品pcb正面和背面:
0.png 0.png

元件清单:
0.png


STM8L15x-16x-05x-AL31-L_StdPeriph_Lib   原文件夹名称/库名称。


1.触发关闭的动作从中断it文件中拿出。
某些情况下,可能出现设定左右中断后halt过程中。突然进入中断,关闭中断,导致再也无法唤醒。

2.代码里面放一个计数器,计算唤醒的次数。

3.ADC 的while(1)等待需要做一个超时限制。

4.整机需要RTC唤醒,或者看门狗么?

5.需要减少唤醒功耗。

6.
///////////////////
1.2016-06-18增加没有传感接入情况下的Err显示。
2.

/////////
1.增加开机后的debug显示。
2.关闭初始化后的debug。
3.增加一个次数的变量。增加一个唤醒次数的变量。
4.增加检测detect引脚,触发debug输出的代码。
5.修改err显示值的设定范围。----------------------------
6.修改电池电压的获取时间。----------------------------
7.关闭屏幕的时候,按照正确的流程来。将多余的电留在屏幕电容里面上,估计可以减少对启动电流的需求。
8.


///////////////////////////
1.修改detect pin输出的debug信息。=========
2.增加独立watchdog。=========
3.显示时间增加到5秒==========
4.修改option 代码为 00 00 00 03 00 00 00 00 ,iwatchdog 由硬件启动,halt后停止,关闭代码读取。===========
5.增加reset次数记录和显示。


PCB空板使用说明


1.焊接电池座时,注意焊盘正负极。
2.根据自己的需要,在按键上覆盖按键面板材料。
3.J1跳线用于测试整机功耗。
4.J11跳线用于测试芯片的工作模式(串行,并行)
5.J13跳线用于测试芯片的低功耗模式(会影响按键扫描速度)
6.整个板子可以根据需要,从中间切开,分成单独的芯片模块和MCU模块。以便使用其他方案驱动。
7.J12为STM8L的SWIM接口。
8.在粘接压克力等面板到PCB上时,建议使用3M的468MP无基材胶。

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm8l15x.h"
  3. #include "main.h"

  4. /** @addtogroup STM8L15x_StdPeriph_Template
  5.   * @{
  6.   */

  7. /* Private typedef -----------------------------------------------------------*/

  8. /* Private define ------------------------------------------------------------*/

  9. /* Private macro -------------------------------------------------------------*/



  10. /* Private variables ---------------------------------------------------------*/

  11. /* Private function prototypes -----------------------------------------------*/
  12. void DEBUGBOARD_Init(void);

  13. void GPIO_LowPower_Config(void);
  14. void IWDG_Config(void);

  15. /* Private functions ---------------------------------------------------------*/



  16. #define NSS_H        GPIO_SetBits(GPIOA, GPIO_Pin_2)
  17. #define NSS_L        GPIO_ResetBits(GPIOA, GPIO_Pin_2)

  18. #define DATA_H        GPIO_SetBits(GPIOD, GPIO_Pin_0)
  19. #define DATA_L        GPIO_ResetBits(GPIOD, GPIO_Pin_0)

  20. #define SCK_H        GPIO_SetBits(GPIOA, GPIO_Pin_3)
  21. #define SCK_L        GPIO_ResetBits(GPIOA, GPIO_Pin_3)






  22. void delay_us(volatile uint32_t times)
  23. {
  24.         while(times--);
  25. }






  26. void GPIO_LowPower_Config(void)
  27. {

  28. #if 1////all low out

  29. GPIO_Init(GPIOA, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Fast);//SWIM
  30. GPIO_Init(GPIOA, GPIO_Pin_1, GPIO_Mode_Out_PP_Low_Fast);///NRST

  31. GPIO_Init(GPIOA, GPIO_Pin_2, GPIO_Mode_In_FL_No_IT);//bin1
  32. GPIO_Init(GPIOA, GPIO_Pin_3, GPIO_Mode_In_FL_No_IT);//bin0


  33. GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Fast);///
  34. GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Fast);///
  35. GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);///
  36. GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);///
  37. GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast);///
  38. GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);///
  39. GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);///
  40. GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Fast);///



  41. GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Fast);////SDA
  42. GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_PP_Low_Fast);////SCL

  43. GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_Out_PP_Low_Fast);////

  44. GPIO_Init(GPIOC, GPIO_Pin_5, GPIO_Mode_In_FL_No_IT);///bin3
  45. GPIO_Init(GPIOC, GPIO_Pin_6, GPIO_Mode_In_FL_No_IT);///bin2

  46. GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_In_FL_No_IT);///debug data


  47. #endif

  48. }












  49. void testpin(uint8_t high_low)
  50. {
  51.         if(high_low == 1)
  52.                 GPIO_SetBits(GPIOC,GPIO_Pin_6);
  53.         else
  54.                 GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  55. }



  56. void Init(void)
  57. {
  58.         //IWDG_Config();
  59.          /*High speed internal clock prescaler: 1*/
  60.         CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  61.         //GPIO_Config();
  62.         GPIO_LowPower_Config();
  63.         //ADC_Periph_Init();///2017-01-04
  64.         
  65. #if 1//def  DEBUG
  66.         ///DEBUGBOARD_Init();///move in GPIO_LowPower_Config();
  67. #endif

  68. }


  69. void Power_Ctrl(uint8_t onoff)
  70. {
  71.         if(onoff == 1)///////更换了电阻为上拉。(更加省电)2016-05-11/////带mos 管,1
  72.         {
  73.                 GPIO_ResetBits(GPIOB, GPIO_Pin_7);///通电
  74.         }
  75.         else
  76.         {
  77.                 GPIO_SetBits(GPIOB, GPIO_Pin_7);///断电
  78.         }
  79. }





  80. void uart_put(uint8_t  data)/////new 2016-07-19///////因为中断问题,80->100
  81. {
  82.         uint8_t i;

  83.         NSS_L;
  84.         SCK_L;

  85.         if((data&0x80)!=0)/////第一个bit data
  86.                 DATA_H;
  87.         else
  88.                 DATA_L;

  89.         delay_us(10);
  90.         SCK_H;

  91.         for(i=1;i<8;i++)
  92.         {
  93.                 delay_us(10);
  94.                 SCK_L;
  95.                 NSS_H;/////////////////完成识别后才拉高。
  96.                
  97.                 if(((data<<i)&0x80)!=0)
  98.                         DATA_H;
  99.                 else
  100.                         DATA_L;
  101.                 delay_us(10);
  102.                 SCK_H;
  103.         }
  104.         delay_us(10);//////每个byte的间隙。

  105. }



  106. void DEBUGBOARD_Init(void)
  107. {
  108.         /* Enable AHB clock to the GPIO domain. */
  109.         //LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
  110.         GPIO_Init(GPIOA, GPIO_Pin_2, GPIO_Mode_Out_PP_Low_Fast);//ce
  111.         GPIO_Init(GPIOA, GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Fast);//clk
  112.         GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Fast);//data

  113. }









  114. void RTC_Config(uint16_t time)//////////////两个RTC 会冲突。在需要调用的时候通过改变CLK源实现重启。2017-01-06
  115. {
  116.   CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
  117. #if 0//def USE_LSE
  118.   CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);
  119. #else
  120.   CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);///////内置晶振38K////////2375Hz
  121. #endif
  122.   Calendar_Init();//////LSI 38k set to 1Hz spre

  123.   /* Configures the RTC wakeup timer_step = RTCCLK/16 = LSE/16 = 488.28125 us */

  124.   ///////ck_spre frequency = ck_apre frequency/(PREDIV_S+1)
  125.   ///////ck_apre frequency = fRTCCLK frequency/ (PREDIV_A+1)
  126.   ///////ck_spre frequency = (fRTCCLK frequency/ (PREDIV_A+1))/(PREDIV_S+1)
  127.   ///////RTCCLK frequency = CLK_RTCCLKSource_LSI/CLK_RTCCLKDiv_1
  128.   ///////ck_spre frequency = (38000/(0x7f+1))/(0x00ff+1) == 1s

  129.   RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);////RTC_WakeUpClock_RTCCLK_Div16////---2375/16 = 148.43Hz == 0.0067368s///////////设置为1秒

  130.   
  131.   //RTC_BypassShadowCmd(DISABLE);/////////////////////move here  2016-05-29

  132.   /* Enable wake up unit Interrupt */
  133.   RTC_ITConfig(RTC_IT_WUT, ENABLE); //开启中断
  134.   
  135.   RTC_SetWakeUpCounter(time); //设置RTC Weakup计算器初值
  136.   
  137.   RTC_WakeUpCmd(ENABLE); //使能自动唤醒

  138. }


  139. void RTC_Config_old(void)
  140. {
  141.   CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
  142. #ifdef USE_LSE
  143.   CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);
  144. #else
  145.   CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);
  146. #endif

  147.   /* Configures the RTC wakeup timer_step = RTCCLK/16 = LSE/16 = 488.28125 us */
  148.   RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);

  149.   Calendar_Init();
  150.   RTC_BypassShadowCmd(DISABLE);/////////////////////move here  2016-05-29


  151.   /* Enable wake up unit Interrupt */
  152.   RTC_ITConfig(RTC_IT_WUT, ENABLE);
  153.   
  154. }






  155. uint8_t WakeUpModeParser(uint8_t wakeupsource,uint8_t timeout_func,uint8_t up_func,uint8_t down_func)
  156. {
  157. uint8_t sys_mod = SYS_STANDBY_MODE;

  158.         if(wakeupsource == 1)///up
  159.         {
  160.                 sys_mod = up_func;
  161.         }
  162.         else if(wakeupsource == 2)///down
  163.         {
  164.                 sys_mod = down_func;
  165.         }
  166.         else if(wakeupsource == 3)////RTC  wake up
  167.         {
  168.                 sys_mod = timeout_func;
  169.                 #ifdef DEBUG
  170.                 printf_string("RTC wake\n");
  171.                 #endif
  172.         }
  173.         else
  174.         {
  175.                 sys_mod = SYS_STANDBY_MODE;
  176.         }

  177. return sys_mod;
  178.                
  179. }


















  180. void RTC_SetSleepTimer(uint8_t sleeptype,uint16_t counter)
  181. {

  182.         if(counter == DISABLE)
  183.         {
  184.                 RTC_WakeUpCmd(DISABLE);
  185.                 CLK_PeripheralClockConfig(CLK_Peripheral_RTC, DISABLE);
  186.         }
  187.         else
  188.         {
  189.                 /////////定时器打开。///////1秒后唤醒RTC_Config();
  190.                 /* RTC wake-up event every 500 ms (timer_step x (1023 + 1) )*/
  191.                 CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);/////////temp  是不是可以移动到初始化的地方?2017-01-06
  192.                 if(sleeptype == TYPE_SHORTTIME)
  193.                 {
  194.                         RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
  195.                         RTC_SetWakeUpCounter((counter<<1));//RTC wakeup timer_step = RTCCLK/16 = LSE/16 = 488.28125 us */////2048->1000ms //////~~=  y=2X
  196.                 }
  197.                 else if(sleeptype == TYPE_LONGTIME)
  198.                 {
  199.                         RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);////RTC_WakeUpClock_RTCCLK_Div16////---2375/16 = 148.43Hz == 0.0067368s///////////设置为1秒
  200.                         RTC_SetWakeUpCounter(counter);
  201.                 }
  202.                 RTC_WakeUpCmd(ENABLE);
  203.         }


  204.         
  205. }




  206. volatile uint32_t g_timer_count  = 0;


  207. void TIMER_Configuration(void)
  208. {
  209.   TIM4_DeInit();

  210.   /* Enable TIM4 Clock */
  211.   CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);

  212.   /* Time base configuration */
  213.   TIM4_TimeBaseInit(TIM4_Prescaler_16384, 0xf0 );

  214.   /* Enable TIM4 IT UPDATE */
  215.   TIM4_ITConfig(TIM4_IT_Update, ENABLE);

  216.   /* Clear the Flag */
  217.   TIM4_ClearFlag(TIM4_FLAG_Update);

  218.   /* Enable TIM4 */
  219.   TIM4_Cmd(ENABLE);
  220. }





  221. RTC_InitTypeDef   RTC_InitStr;


  222. /**
  223.   * @brief  Calendar Configuration.
  224.   * @param  None
  225.   * @retval None
  226.   */
  227. void Calendar_Init(void)
  228. {
  229.   RTC_InitStr.RTC_HourFormat = RTC_HourFormat_24;
  230.   RTC_InitStr.RTC_AsynchPrediv = 0x7c;
  231.   RTC_InitStr.RTC_SynchPrediv = 0x012F;
  232.   RTC_Init(&RTC_InitStr);
  233. }



  234. ///////////////////////////////////////////////////////////////
  235. #define RELOAD_VALUE   254

  236. /**
  237.   * @brief  Configures the IWDG to generate a Reset if it is not refreshed at the
  238.   *         correct time.
  239.   * @param  None
  240.   * @retval None
  241.   */
  242. void IWDG_Config(void)
  243. {
  244.   /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  245.   IWDG_Enable();
  246.   
  247.   /* IWDG timeout equal to 214 ms (the timeout may varies due to LSI frequency
  248.      dispersion) */
  249.   /* Enable write access to IWDG_PR and IWDG_RLR registers */
  250.   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  251.   
  252.   /* IWDG configuration: IWDG is clocked by LSI = 38KHz */
  253.   IWDG_SetPrescaler(IWDG_Prescaler_128);////>510ms
  254.   
  255.   /* IWDG timeout equal to 214.7 ms (the timeout may varies due to LSI frequency dispersion) */
  256.   /* IWDG timeout = (RELOAD_VALUE + 1) * Prescaler / LSI
  257.                   = (254 + 1) * 32 / 38 000
  258.                   = 214.7 ms */
  259.   IWDG_SetReload((uint8_t)RELOAD_VALUE);
  260.   
  261.   /* Reload IWDG counter */
  262.   IWDG_ReloadCounter();
  263. }



  264. void IWatchdogReset()
  265. {



  266.   /* IWDG Configuration */
  267.   IWDG_Config();
  268.   
  269.   while(1);///////////等待reset

  270.   #if 0
  271.   while (1)
  272.   {
  273.    /* Reload IWDG counter */
  274.     IWDG_ReloadCounter();  
  275.   }
  276.   #endif


  277. }












  278. void SoftReset_AtFirstTimeStartup(void)
  279. {
  280.         uint32_t startadd = FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS;// + (uint16_t)FLASH_BLOCK_SIZE;

  281.         if(FLASH_ReadByte(startadd) != 0xfb)/////////如果没有写过0xfa,写入0xfa,并reset
  282.         {
  283.                 /* Define flash programming Time*/
  284.                 FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);

  285.                 /* Unlock flash data eeprom memory */
  286.                 FLASH_Unlock(FLASH_MemType_Data);
  287.                 /* Wait until Data EEPROM area unlocked flag is set*/
  288.                 while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)
  289.                 {}

  290.                 FLASH_ProgramByte(startadd,(uint8_t)(0xfb));///////不用擦,直接写
  291.                 FLASH_Lock(FLASH_MemType_Data);/////锁定
  292.                
  293.                 IWatchdogReset();//////通过watchdog 软reset
  294.         }

  295.         /* Check if the system has resumed from IWDG reset */
  296.         if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)//////////////检查是否有watchdog reset的flag。去掉
  297.         {
  298.                 /* IWDGF flag set */
  299.                 /* Clear IWDGF Flag */
  300.                 RST_ClearFlag(RST_FLAG_IWDGF);
  301.                 #ifdef DEBUG
  302.                 printf_string("Reset by watchdog\n");
  303.                 #endif
  304.         }
  305.         else
  306.         {
  307.                 /* IWDGF flag is not set */
  308.                 #ifdef DEBUG
  309.                 printf_string("Normal reset\n");
  310.                 #endif
  311.         }





  312. }


  313. ///////////////////////////////////////////////////////////////


  314. void IWDG_test(void)
  315. {


  316.         printf_string("reset\n");
  317.         IWDG_ReloadCounter();

  318. while(1)
  319. {
  320.         testpin(1);
  321.         delay_us(102660);////////max  delay_us(102660) == 840ms
  322.         IWDG_ReloadCounter();
  323.         testpin(0);
  324.         delay_us(102660);
  325.         IWDG_ReloadCounter();
  326. }




  327. }






  328. //**********************************************************




  329. uint8_t SPIx_ReadWriteByte(uint8_t dat)///////////sw spi
  330. {

  331.         uint8_t i = 0;
  332.         uint8_t temp = 0;
  333.         //uint8_t b = 0;

  334.         SCLK_L;//GPIOSetValue(PORT0,6,0);//GPIO_ResetBits(GPIOB, GPIO_Pin_0);    //SCK=0
  335.         delay_us(2);

  336.         for(i=0;i<8;i++)
  337.         {
  338.                 if(dat&0x80)    //1000,0000;输出1
  339.                 {
  340.                         MOSI_H;//GPIOSetValue(PORT0,9,1);//GPIO_SetBits(GPIOB, GPIO_Pin_1);    //MOSI=1
  341.                 }
  342.                 else
  343.                 {
  344.                         MOSI_L;//GPIOSetValue(PORT0,9,0);//GPIO_ResetBits(GPIOB, GPIO_Pin_1);    //MOSI=0
  345.                 }
  346.                 dat = (dat << 1);    //串行输出

  347.                 temp = (temp << 1);    //串行输入

  348.                 //if(LPC_GPIO0->DATA&(1<<8))
  349.                 if((GPIOB->IDR & (uint8_t)GPIO_Pin_2)!=0)
  350.                 {
  351.                         temp++;    //读入1
  352.                 }
  353.                 delay_us(2);
  354.                 SCLK_H;////GPIO_SetBits(GPIOB, GPIO_Pin_0);    //SCK=1
  355.                 delay_us(2);
  356.                 SCLK_L;////GPIO_ResetBits(GPIOB, GPIO_Pin_0);    //SCK=0

  357.         }

  358.         return temp;    //返回读入的数据

  359. }






  360. void LED_onoff(uint8_t led,uint8_t onoff)
  361. {
  362. uint8_t led_light = 0x00;
  363.         
  364.         switch(led)
  365.         {
  366.         case 0:
  367.                 if(onoff == 1)
  368.                 {
  369.                         led_light |= 0x01;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  370.                 }
  371.                 else
  372.                 {
  373.                         led_light &= (~0x01);///断电
  374.                 }
  375.                 break;

  376.         case 1:
  377.                 if(onoff == 1)
  378.                 {
  379.                         led_light |= 0x02;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  380.                 }
  381.                 else
  382.                 {
  383.                         led_light &= (~0x02);///断电
  384.                 }
  385.                 break;

  386.         case 2:
  387.                 if(onoff == 1)
  388.                 {
  389.                         led_light |= 0x04;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  390.                 }
  391.                 else
  392.                 {
  393.                         led_light &= (~0x04);///断电
  394.                 }
  395.                 break;

  396.         case 3:
  397.                 if(onoff == 1)
  398.                 {
  399.                         led_light |= 0x08;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  400.                 }
  401.                 else
  402.                 {
  403.                         led_light &= (~0x08);///断电
  404.                 }
  405.                 break;

  406.         case 4:
  407.                 if(onoff == 1)
  408.                 {
  409.                         led_light |= 0x10;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  410.                 }
  411.                 else
  412.                 {
  413.                         led_light &= (~0x10);///断电
  414.                 }
  415.                 break;

  416.         case 5:
  417.                 if(onoff == 1)
  418.                 {
  419.                         led_light |= 0x20;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  420.                 }
  421.                 else
  422.                 {
  423.                         led_light &= (~0x20);///断电
  424.                 }
  425.                 break;

  426.         case 6:
  427.                 if(onoff == 1)
  428.                 {
  429.                         led_light |= 0x40;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  430.                 }
  431.                 else
  432.                 {
  433.                         led_light &= (~0x40);///断电
  434.                 }
  435.                 break;

  436.         case 7:
  437.                 if(onoff == 1)
  438.                 {
  439.                         led_light |= 0x80;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  440.                 }
  441.                 else
  442.                 {
  443.                         led_light &= (~0x80);///断电
  444.                 }
  445.                 break;

  446.         case 8:
  447.                 if(onoff == 1)
  448.                 {
  449.                         led_light |= 0xff;// GPIO_ResetBits(GPIOB, GPIO_Pin_0);///通电
  450.                 }
  451.                 else
  452.                 {
  453.                         led_light &= (~0xff);///断电
  454.                 }
  455.                 break;


  456.         default:
  457.                 break;
  458.         
  459.         }


  460. GPIOB->ODR = (~led_light);////低电平为开2017-03-02


  461. }


  462. //**********************************************************



  463. uint8_t ParallelPort_in(void)
  464. {
  465. uint8_t value = 0x00;

  466.         if ((GPIOA->IDR & (uint8_t)GPIO_Pin_3)!=0)//(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3));///0
  467.         {
  468.                 value|= 0x01;
  469.         }

  470.         if((GPIOA->IDR & (uint8_t)GPIO_Pin_2)!=0)//(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2));///1
  471.         {
  472.                 value|= 0x02;
  473.         }

  474.         if((GPIOC->IDR & (uint8_t)GPIO_Pin_6)!=0)//(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6));///2
  475.         {
  476.                 value|= 0x04;
  477.         }

  478.         if((GPIOC->IDR & (uint8_t)GPIO_Pin_5)!=0)//(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5));///3
  479.         {
  480.                 value|= 0x08;
  481. ……………………

  482. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
818A的八位电容触摸按键方案_PDF_C97370_2017-03-10.7z (13.16 MB, 下载次数: 238)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:406596 发表于 2018-10-12 10:53 | 显示全部楼层
很有用的资料,谢谢分享,非常感谢,正需要。
回复

使用道具 举报

ID:417411 发表于 2018-10-29 17:58 | 显示全部楼层
执迷不悟55 发表于 2018-10-12 10:53
很有用的资料,谢谢分享,非常感谢,正需要。

可以发一份吗,没积分,谢谢。1311257161@qq.com
回复

使用道具 举报

ID:434737 发表于 2018-11-28 09:44 | 显示全部楼层
不错的资料
回复

使用道具 举报

ID:183372 发表于 2019-4-9 21:00 | 显示全部楼层
支持。。。。。。
回复

使用道具 举报

ID:223337 发表于 2019-9-29 10:55 | 显示全部楼层
谢谢您的分享这段时间正在学习单片机电容触模
回复

使用道具 举报

ID:630749 发表于 2019-10-27 02:32 | 显示全部楼层
大哥能不能帮给一个,点动6位触摸 高电平输出的程序
回复

使用道具 举报

ID:529463 发表于 2019-12-17 00:11 | 显示全部楼层
支持好的资料
回复

使用道具 举报

ID:387478 发表于 2020-6-14 14:57 | 显示全部楼层
好想学习学习
回复

使用道具 举报

ID:721377 发表于 2020-10-30 17:54 | 显示全部楼层
很有用的资料,谢谢分享,非常感谢,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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