本帖最后由 jinglixixi 于 2022-9-17 12:14 编辑
在ESK32-30519 开发板上配置了数码管显示器,可实现相应数据的显示,其电路原理图如图1所示。
图1 数码管电路
为此,该数码管的引脚定义如下: #defineHTCFG_LEDC_COM_D1 4
#defineHTCFG_LEDC_COM_D2 5
#defineHTCFG_LEDC_COM_D3 6
#defineHTCFG_LEDC_COM_D4 7
#define_HTCFG_LEDC_COM0_GPIO_PORT C // DIG1
#define_HTCFG_LEDC_COM0_GPIO_PIN 4
#define_HTCFG_LEDC_COM1_GPIO_PORT C // DIG2
#define_HTCFG_LEDC_COM1_GPIO_PIN 5
#define_HTCFG_LEDC_COM2_GPIO_PORT C // DIG3
#define_HTCFG_LEDC_COM2_GPIO_PIN 6
#define_HTCFG_LEDC_COM3_GPIO_PORT C // DIG4
#define_HTCFG_LEDC_COM3_GPIO_PIN 7
#define_HTCFG_LEDC_SEG0_GPIO_PORT A // F
#define_HTCFG_LEDC_SEG0_GPIO_PIN 0
#define_HTCFG_LEDC_SEG1_GPIO_PORT A // DP
#define_HTCFG_LEDC_SEG1_GPIO_PIN 1
#define_HTCFG_LEDC_SEG2_GPIO_PORT A // C
#define_HTCFG_LEDC_SEG2_GPIO_PIN 2
#define _HTCFG_LEDC_SEG3_GPIO_PORT A // E
#define_HTCFG_LEDC_SEG3_GPIO_PIN 3
#define_HTCFG_LEDC_SEG4_GPIO_PORT D // A
#define_HTCFG_LEDC_SEG4_GPIO_PIN 4
#define_HTCFG_LEDC_SEG5_GPIO_PORT D // D
#define _HTCFG_LEDC_SEG5_GPIO_PIN 5
#define_HTCFG_LEDC_SEG6_GPIO_PORT D // G
#define_HTCFG_LEDC_SEG6_GPIO_PIN 2
#define_HTCFG_LEDC_SEG7_GPIO_PORT A // B
#define_HTCFG_LEDC_SEG7_GPIO_PIN 7
为实现数码的显示,其段码的定义如下: const u8 NumberChar[]={
/* a: Seg4(0x10), b:Seg7(0x80), c: Seg2(0x04), d: Seg5(0x20),
e: Seg3(0x08), f:Seg0(0x01), g: Seg6(0x40), dp: Seg1(0x02) */
0xBD, /* '0' =a+b+c+d+e+f = 0x10 + 0x80 + 0x04 +0x20 + 0x08 + 0x01 = 0xBD*/
0x84, /* '1' = b+c+ = 0x80 + 0x04 = 0x84 */
0xF8, /* '2' = a+b +d+e +g = 0x10 + 0x80 + 0x20 + 0x08 + + 0x40 = 0xF8 */
0xF4, /* '3' = a+b+c+d +g = 0x10 + 0x80 + 0x04 + 0x20 + + 0x40 = 0xF4 */
0xC5, /* '4' = b+c +f+g = 0x80 + 0x04 + 0x01 + 0x40 = 0xC5 */
0x75, /* '5' = a +c+d +f+g = 0x10 + 0x04 + 0x20 + 0x01 + 0x40 = 0x75 */
0x7D, /* '6' = a +c+d+e+f+g = 0x10 + 0x04 + 0x20 + 0x08+ 0x01 + 0x40 = 0x7D */
0x95, /* '7' = a+b+c +f = 0x10 + 0x80 + 0x04 + 0x01 = 0x95 */
0xFD, /* '8' =a+b+c+d+e+f+g = 0x10 + 0x80 + 0x04 +0x20 + 0x08 + 0x01 + 0x40 = 0xFD*/
0xF5, /* '9' = a+b+c+d +f+g = 0x10 + 0x80 + 0x04 + 0x20 + 0x01 + 0x40 = 0xF5 */
0x02 /* '.' = dp = 0x02 = 0x02 */
};
以显示“1”为例,需点亮B段和C段,故输出的段码为10000100,即0x84。
那么又该如何来理解下面的数码管显示的主程序呢? int main(void)
{
u8 CharIndex=0;
u8 CharSize = sizeof(NumberChar);
GPIO_Configuration();
LEDC_Configuration();
while (1)
{
if(gIsUpdateChar)
{
/* The character has been displayed for 1 second, and the new character will be replaced.*/
LEDC_SetData(HTCFG_LEDC_COM_D1, NumberChar[CharIndex++%CharSize]);
LEDC_SetData(HTCFG_LEDC_COM_D2, NumberChar[CharIndex++%CharSize]);
LEDC_SetData(HTCFG_LEDC_COM_D3, NumberChar[CharIndex++%CharSize]);
LEDC_SetData(HTCFG_LEDC_COM_D4, NumberChar[CharIndex++%CharSize]);
gIsUpdateChar = FALSE;
}
}
}
其实它的作用就是依次从左到右来输出每一位的段码值来实现显示,其输出的段码也可以说是显示内容是靠变量NumberChar[CharIndex来控制的,每显示一轮该变量的值就向后移动1位。 为防止溢出,则是通过取余来实现内容的滚动显示。而每轮显示的延时值,则是通过中断处理来完成的,其判别标识则是变量gIsUpdateChar。 在为例程添加工程文件及修改关联文件路径的情况下,通过下载即可见到图2和图3所示的效果。
图2 显示“2345”
图3 显示“4567” 那如何才能显示“3.30”这样的数值呢? 使用下面的程序就可获得图4所示的效果。 while (1)
{
if(gIsUpdateChar)
{
LEDC_SetData(HTCFG_LEDC_COM_D1, NumberChar[3]);
LEDC_SetData(HTCFG_LEDC_COM_D2, NumberChar[10]);
LEDC_SetData(HTCFG_LEDC_COM_D3, NumberChar[3]);
LEDC_SetData(HTCFG_LEDC_COM_D4, NumberChar[0]);
gIsUpdateChar = FALSE;
}
}
图4 显示指定内容
|