本帖最后由 呐咯密密 于 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结构体中直接获取。如下:
那么,动态图看整体效果吧!(该动态图已小幅加速)
|