找回密码
 立即注册
楼主: lezjin

STC8H试验箱学习记录

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2025-05-08 19:39:50

23

主题

296

回帖

1176

积分

金牌会员

积分
1176
发表于 2024-6-28 21:04:33 | 显示全部楼层
七  ADC按键    时间片调用4个函数,点两个灯,串口2测试,ADC按键扫描,ADC按键检测后简单点灯测试。 参考例程代码采用if判断ADC值误差返回
健码,设置3次状态读取判断,可以正常运行,论坛里有一种采用移位然后switch的方法据说更快,后续再实验。




  1. /*-------------------------------------------------------------------------------
  2. @brief:  ADC初始化
  3. @param:
  4. @retval:
  5. ------------------------------------------------------------------------------*/
  6. void AdcInit(void)
  7. {
  8.         ADCTIM = 0X3F;  //  0011  1111   通道选择时间 CSSETUP : 0, 通道选择保持时间CSHOLD 01 , 采样时间SMPDUTY :11111;   
  9.         ADCCFG = 0x2f;  //  0010  1111    转换结果格式 RESFMT: 1  ,ADC工作工作时钟频率 SPEED : 1111  sysclkk/2/speed;
  10.         ADC_CONTR = 0x80; // adcpower = 1;       
  11. }
  12. /*-------------------------------------------------------------------------------
  13. @brief:  查询ADC转换完成标志位获取转换结果
  14. @param:  channel 要转换的通道 有效值0-15
  15. @retval:  12位的ADC转换结果
  16. ------------------------------------------------------------------------------*/
  17. uint16_t GetAdcResult(uint8_t channel)
  18. {
  19.         ADC_RES = 0;
  20.         ADC_RESL = 0;
  21.         ADC_CONTR = (ADC_CONTR & 0XF0) | 0x40 | channel; //  adc  start
  22.        
  23.         _nop_();       
  24.         _nop_();       
  25.         _nop_();       
  26.         _nop_();       
  27.        
  28.         while((ADC_CONTR & 0x20) == 0);
  29.         ADC_CONTR &= ~0x20;
  30.         return (((uint16_t) ADC_RES << 8) | ADC_RESL);
  31. }
  32. static uint8_t  AdcKeystate;
  33. static uint8_t  AdcKeystateOne;
  34. static uint8_t  AdcKeystateSec;
  35. static uint8_t  AdcKeystateThr;
  36. static uint8_t  AdcKeyHoldCnt;
  37. /*-------------------------------------------------------------------------------
  38. @brief:  获取ADC键码值
  39. @param:  adcval:按键按下是获取的ADC值
  40. @retva:  KeyValue:根据ADC值计算出来对应到具体哪个按键,返回键码值
  41. ------------------------------------------------------------------------------*/
  42. uint8_t CalcAdcKey(uint16_t adcval)
  43. {
  44.         uint8_t i;
  45.         uint16_t j;
  46.         uint8_t  KeyValue = 0;
  47.         if ( adcval < (256 - ADC_OFFSET) )
  48.         {
  49.                 AdcKeystate = 0;
  50.                 AdcKeyHoldCnt = 0;
  51.         }
  52.         j = 256;
  53.         for (i = 1; i <= 16; i++)
  54.         {
  55.                 if ((adcval >= (j - ADC_OFFSET)) && (adcval <= (j + ADC_OFFSET))) //找出在偏差上下限范围内的I值
  56.                         break;
  57.                 j +=  256;
  58.         }
  59.         AdcKeystateThr = AdcKeystateSec;
  60.         AdcKeystateSec = AdcKeystateOne;
  61.         if (i > 16)
  62.         {
  63.                 AdcKeystateOne = 0;
  64.         }
  65.         else
  66.         {
  67.                 AdcKeystateOne = i;
  68.                 if ((AdcKeystateThr == AdcKeystateSec) && (AdcKeystateSec == AdcKeystateOne) &&
  69.                                 (AdcKeystateThr > 0) && (AdcKeystateSec > 0) && (AdcKeystateOne > 0))
  70.                 {
  71.                         if (AdcKeystate == 0)
  72.                         {
  73.                                 KeyValue = i;
  74.                                 AdcKeystate = i;
  75.                                 AdcKeyHoldCnt = 0;
  76.                         }
  77.                         if (AdcKeystate == i)
  78.                         {
  79.                                 if ( ++AdcKeyHoldCnt >= 100)
  80.                                 {
  81.                                         AdcKeyHoldCnt = 90;
  82.                                         KeyValue = i;
  83.                                 }
  84.                         }
  85.                         else
  86.                         {
  87.                                 AdcKeyHoldCnt = 0;
  88.                         }
  89.                 }
  90.         }
  91.         return KeyValue;
  92. }
  93. /*-------------------------------------------------------------------------------
  94. @brief: ADC按键测试函数
  95. @param:   
  96. @retva:
  97. ------------------------------------------------------------------------------*/
  98. void  AdcKeyTest(void)
  99. {
  100.     uint8_t keyresult = 0;
  101.     uint16_t adcresult = 0;
  102.     adcresult = GetAdcResult(0);
  103.     if (adcresult < 4096)
  104.     {
  105.         keyresult = CalcAdcKey(adcresult);
  106.     }
  107.     if (keyresult > 0)
  108.     {
  109.         switch (keyresult)
  110.         {
  111.             case 1:
  112.                 P66 = ~P66;
  113.                 break;
  114.              case 5:
  115.                 P67 = ~P67;
  116.                 break;
  117.               case 8:
  118.                 P65 = ~P65;
  119.                 break;
  120.               default:
  121.                 P64 = ~P64;
  122.                 break;
  123.         }
  124.     }
  125. }
  126. static Task_t g_task[] =
  127. {
  128.   //状态  计数  周期  函数
  129.         {0,   500,   500,        LedCtrlone},
  130.         {0,   10,   10,        AdcKeyTest},
  131.         {0,   5000,   5000,testuart2},
  132.         {0,   2000,   2000,        LedCtrltwo},
  133.           /* Add new task here */
  134. };
复制代码



ADC.mp4

9.31 MB, 下载次数: 50

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-05-08 00:01:49
已绑定手机

19

主题

3196

回帖

4956

积分

论坛元老

积分
4956
发表于 2024-6-28 21:36:19 来自手机 | 显示全部楼层
实验箱蛮强大的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2025-05-08 19:39:50

23

主题

296

回帖

1176

积分

金牌会员

积分
1176
发表于 2024-6-29 17:07:55 | 显示全部楼层
so*** 发表于 2024-6-28 21:36
实验箱蛮强大的

试验箱功能很多,可以学习到很多常用的外设。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 03:26 , Processed in 0.150438 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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