打印
[开发工具]

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

[复制链接]
680|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 呐咯密密 于 2022-11-9 09:32 编辑

本章主题

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


测试背景

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


实际代码操作
开机自检流水灯
void delay(int z)
{
        int x,y;
        for(x=z;x>0;x--)
        for(y=360;y>0;y--);
}                        
void OPEND_LED(void)
{
        float LED_NUM;
        int CircleNum;
        LED_CirclePWMSet(50);
        for(CircleNum=0;CircleNum<4;CircleNum++)
        {
                for(LED_NUM=0;LED_NUM<12;LED_NUM++)
                {
                        LED_CirclePWMSet(LED_NUM*4);
                        LED_CircleSet1(LED_NUM);
                        LED_BarSet(LED_NUM);
                        delay(800);        
                }        
        }
                LED_CirclePWMSet(50);
                LED_CircleSet1(12);
                LED_BarSet(8);
                delay(1000);        

                LED_CircleSet1(1);
                LED_BarSet(0);
                delay(1000);
        
                LED_CircleSet1(12);
                LED_BarSet(8);
                delay(1000);        

                LED_CircleSet1(1);
                LED_BarSet(0);        
                delay(1000);
        
                LED_CircleSet1(12);
                LED_BarSet(8);
                delay(1000);               
}

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


数码管显示

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


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

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


那么,动态图看整体效果吧!(该动态图已小幅加速)
                                          



使用特权

评论回复
沙发
Anrenly| | 2022-11-9 13:16 | 只看该作者
先点个赞,再慢慢研究

使用特权

评论回复
板凳
七毛钱| | 2022-11-9 16:38 | 只看该作者
先点个赞再慢慢研究

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

484

主题

3816

帖子

47

粉丝