[开发工具] MCU开发板测评 + 且看“新定义”如何新定义国产MCU-第二弹

[复制链接]
 楼主| 呐咯密密 发表于 2022-11-9 09:32 | 显示全部楼层 |阅读模式
本帖最后由 呐咯密密 于 2022-11-9 09:32 编辑

本章主题

新定义触控开发板的开机动画展示及LED数码管显示按键值。


测试背景

LED在实际使用中除了当做状态显示,还可以充当动画效果,当触控方案应用在实际情况中时,除了亮灯显示实际操作结果,还可能需要一些简单的动画效果。例如开机时的流水灯进行简单的人家交互。如果触控滑轮运用在温控应用中,几颗LED可能并不能向用户展示实际的滑轮数值,此时可以添加数码管等显示具体数值。基于上述原因,进行一个简单的开机动画展示,同时也可以让用户进行设备自检(有无LED损坏),同时滚轮的数值通过数码管显示,便于更为精确的控制。


实际代码操作
开机自检流水灯
  1. void delay(int z)
  2. {
  3.         int x,y;
  4.         for(x=z;x>0;x--)
  5.         for(y=360;y>0;y--);
  6. }                        
  7. void OPEND_LED(void)
  8. {
  9.         float LED_NUM;
  10.         int CircleNum;
  11.         LED_CirclePWMSet(50);
  12.         for(CircleNum=0;CircleNum<4;CircleNum++)
  13.         {
  14.                 for(LED_NUM=0;LED_NUM<12;LED_NUM++)
  15.                 {
  16.                         LED_CirclePWMSet(LED_NUM*4);
  17.                         LED_CircleSet1(LED_NUM);
  18.                         LED_BarSet(LED_NUM);
  19.                         delay(800);        
  20.                 }        
  21.         }
  22.                 LED_CirclePWMSet(50);
  23.                 LED_CircleSet1(12);
  24.                 LED_BarSet(8);
  25.                 delay(1000);        

  26.                 LED_CircleSet1(1);
  27.                 LED_BarSet(0);
  28.                 delay(1000);
  29.         
  30.                 LED_CircleSet1(12);
  31.                 LED_BarSet(8);
  32.                 delay(1000);        

  33.                 LED_CircleSet1(1);
  34.                 LED_BarSet(0);        
  35.                 delay(1000);
  36.         
  37.                 LED_CircleSet1(12);
  38.                 LED_BarSet(8);
  39.                 delay(1000);               
  40. }

首先写一个软件1ms的粗延时,然后在OPEND_LED函数中使用for循环定义开机LED循环点亮次数,我这里暂定4次,在该循环中再次进行循环逐个点亮LED,同时在循环时通过LED_CirclePWMSet()函数动态修改PWM频率来修改亮度,亮度随LED点亮数量变高。LED_CircleSet1()和LED_BarSet()函数依次点亮LED。在循环结束后,所有的灯进行两次闪亮。


数码管显示

数码管使用三个通用IO进行模拟时序控制,因触控板占用IO较多,剩余IO其实还是较为紧张的,这里去用P54,P55,P47三个IO。

数码管IO.jpg
GPIO初始化:
将三个IO口初始化为输出:
  1. GPIO_Init(GPIO5, GPIO_PIN_4|GPIO_PIN_5,GPIO_MODE_OUT_PP);
  2.         GPIO_Init(GPIO4, GPIO_PIN_7,GPIO_MODE_OUT_PP);
定义数码管段码表(共阳极)
  1. /****************数码管段码表:共阳**********************/
  2. const unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,                                            //0~3
  3.                 0x99,0x92,0x82,0xf8,                                                                    //4~7
  4.                 0x80,0x90,0x88,0x83,                                                                    //8~9  A b
  5.                 0xc6,0xa1,0x86,0x8e,0xff,0x7f};                                                   // C d E F 灭 .
定义三个IO的位
  1. sbit SDA = P5^4;
  2. sbit CLK = P5^5;
  3. sbit LOAD = P4^7;        
编写一位数据显示函数和数据锁存函数
  1. void SPI_595(unsigned char value)
  2. {
  3.         unsigned char i;
  4.         for(i=0;i<8;i++)  
  5.         {
  6.                 CLK=0;                                                                //CLK引脚拉低
  7.                 if(0x80&value)                                //判断当前发送数据位
  8.                         SDA=1;                                                        //当前数据位为1,则拉高SDA
  9.                 else
  10.                         SDA=0;                                                        //当前数据位为0,则拉低SDA
  11.                 CLK=1;                                                                //保存移位数据
  12.                 value = value <<1 ;                //将数据左移一位
  13.         }
  14.         SDA=0;                                                                        //数据输入完毕后复位SDA/CLK
  15.         CLK=0;               
  16. }
  17. void load(void)
  18. {
  19.         LOAD=1;                                                                        //锁存移位数据并输出
  20.         LOAD=0;                                                                        //完毕后复位LOAD
  21. }
为了显示方便,编写一个直接点亮4位数码管的函数。
  1. void display(unsigned int n)
  2. {        
  3.         static uint8_t thousand_bit, hundred_bit, ten_bit, single_bit;        
  4.         thousand_bit = n / 1000;
  5.         hundred_bit = (n % 1000) / 100;
  6.         ten_bit = n % 1000 % 100 / 10;
  7.         single_bit = n % 10;  
  8.         SPI_595(Tab[single_bit]);
  9.         SPI_595(Tab[ten_bit]);               
  10.         SPI_595(Tab[hundred_bit]);
  11.         SPI_595(Tab[thousand_bit]);        
  12.         load();        
  13. }

最后在主函数的按键扫描函数中的DataProcessing()数据处理函数中进行显示按键值。因触摸板上有滑条和滑轮两个多级按键,此处扩充两个数码管,分别显示两组按键的值,两个数码管采用级联的方式,将滑轮W1的值CircleValue和滑条S1的值BarValue分贝显示,这两个值可从TKSlideModulePCBArray结构体中直接获取。如下:

滑轮 滑条键值打印.jpg
那么,动态图看整体效果吧!(该动态图已小幅加速)
                                          
数码管显示.gif


Anrenly 发表于 2022-11-9 13:16 | 显示全部楼层
先点个赞,再慢慢研究
七毛钱 发表于 2022-11-9 16:38 来自手机 | 显示全部楼层
先点个赞再慢慢研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部