【AT32F421测评】+数码管模块与自动计数显示
本帖最后由 jinglixixi 于 2021-4-17 11:59 编辑<p>在工业现场多采用数码管来显示数据,其主要原因是它显示亮度高,成本低且比较皮实。</p>
<p>通常为了便于使用,可直接购置数码管的功能模块,此类模块可分为2类,一种是采用并行的数据传输方式,另一种则是采用串行的数据传输方式。</p>
<p>这里介绍的是并行传输方式的数码管模块,见图1所示。该模块已配置了限流电阻及各显示位的驱动,因此在使用时,直接与开发板的相关引脚连接即可。</p>
<p>比较有意思的是,该模块只提供了电源VCC引脚,却没提供GND引脚。其中,D1~D4为位控引脚,A~DP则为段控引脚。</p>
<p><img alt="https://bbs.eeworld.com.cn/data/attachment/forum/202104/06/185132pjcf0kgtiveqcghz.png.thumb.jpg" src="https://bbs.eeworld.com.cn/data/attachment/forum/202104/06/185132pjcf0kgtiveqcghz.png.thumb.jpg" /></p>
<p>图1 数码管模块</p>
<p> </p>
<p>以2位数值的自动计数显示为例,其显示效果如图2所示。</p>
<p></p>
<p>图2 计数显示效果</p>
<p> </p>
<p>由于该模块是并行传输数据的,而开发板的引脚排列是分散的,因此在驱动数码管显示时没有采用传统的数据输出要固定占用某一端口的方式,而是按引脚的连接关系,直接以位控的方式来实现。</p>
<p>模块引脚与MCU的对应关系如下:</p>
<p>A---PA5</p>
<p>B---PA6</p>
<p>C---PA7</p>
<p>D---PA15</p>
<p>E---PB7</p>
<p>F---PA9</p>
<p>G---PB10</p>
<p>DP---PA8</p>
<p>D1---PB3</p>
<p>D2---PB4</p>
<p>D3---NC</p>
<p>D4---NC</p>
<p>定义相关引脚输出高低电平的语句为:</p>
<p>#define SMG_A_L GPIOA->BRE = GPIO_Pins_5</p>
<p>#define SMG_A_H GPIOA->BSRE = GPIO_Pins_5</p>
<p> </p>
<p>#define SMG_B_L GPIOA->BRE = GPIO_Pins_6</p>
<p>#define SMG_B_H GPIOA->BSRE = GPIO_Pins_6</p>
<p> </p>
<p>#define SMG_C_L GPIOA->BRE = GPIO_Pins_7</p>
<p>#define SMG_C_H GPIOA->BSRE = GPIO_Pins_7</p>
<p> </p>
<p>#define SMG_D_L GPIOA->BRE = GPIO_Pins_15</p>
<p>#define SMG_D_H GPIOA->BSRE = GPIO_Pins_15</p>
<p> </p>
<p>#define SMG_E_L GPIOB->BRE = GPIO_Pins_7</p>
<p>#define SMG_E_H GPIOB->BSRE = GPIO_Pins_7</p>
<p> </p>
<p>#define SMG_F_L GPIOA->BRE = GPIO_Pins_9</p>
<p>#define SMG_F_H GPIOA->BSRE = GPIO_Pins_9</p>
<p> </p>
<p>#define SMG_G_L GPIOB->BRE = GPIO_Pins_10</p>
<p>#define SMG_G_H GPIOB->BSRE = GPIO_Pins_10</p>
<p> </p>
<p>#define SMG_P_L GPIOA->BRE = GPIO_Pins_8</p>
<p>#define SMG_P_H GPIOA->BSRE = GPIO_Pins_8</p>
<p> </p>
<p>#define SMG_1L GPIOB->BRE = GPIO_Pins_3</p>
<p>#define SMG_1H GPIOB->BSRE = GPIO_Pins_3</p>
<p> </p>
<p>#define SMG_2L GPIOB->BRE = GPIO_Pins_4</p>
<p>#define SMG_2H GPIOB->BSRE = GPIO_Pins_4</p>
<p>显示数值0~9的函数为:</p>
<pre>
<code class="language-cpp">void smg_disp(char n)
{
if(n==0)
{
SMG_A_L;
SMG_B_L;
SMG_C_L;
SMG_D_L;
SMG_E_L;
SMG_F_L;
SMG_G_H;
SMG_P_H;
}
if(n==1)
{
SMG_A_H;
SMG_B_L;
SMG_C_L;
SMG_D_H;
SMG_E_H;
SMG_F_H;
SMG_G_H;
SMG_P_H;
}
if(n==2)
{
SMG_A_L;
SMG_B_L;
SMG_C_H;
SMG_D_L;
SMG_E_L;
SMG_F_H;
SMG_G_L;
SMG_P_H;
}
if(n==3)
{
SMG_A_L;
SMG_B_L;
SMG_C_L;
SMG_D_L;
SMG_E_H;
SMG_F_H;
SMG_G_L;
SMG_P_H;
}
if(n==4)
{
SMG_A_H;
SMG_B_L;
SMG_C_L;
SMG_D_H;
SMG_E_H;
SMG_F_L;
SMG_G_L;
SMG_P_H;
}
if(n==5)
{
SMG_A_L;
SMG_B_H;
SMG_C_L;
SMG_D_L;
SMG_E_H;
SMG_F_L;
SMG_G_L;
SMG_P_H;
}
if(n==6)
{
SMG_A_L;
SMG_B_H;
SMG_C_L;
SMG_D_L;
SMG_E_L;
SMG_F_L;
SMG_G_L;
SMG_P_H;
}
if(n==7)
{
SMG_A_L;
SMG_B_L;
SMG_C_L;
SMG_D_H;
SMG_E_H;
SMG_F_H;
SMG_G_H;
SMG_P_H;
}
if(n==8)
{
SMG_A_L;
SMG_B_L;
SMG_C_L;
SMG_D_L;
SMG_E_L;
SMG_F_L;
SMG_G_L;
SMG_P_H;
}
if(n==9)
{
SMG_A_L;
SMG_B_L;
SMG_C_L;
SMG_D_L;
SMG_E_H;
SMG_F_L;
SMG_G_L;
SMG_P_H;
}
}</code></pre>
<p> </p>
<p>实现2位数自动计数显示的主程序为:</p>
<p> </p>
<pre>
<code class="language-cpp">int main(void)
{
char i;
int j;
AT32_Board_Init();
smg_Init();
SMG_A_L;
SMG_B_L;
SMG_C_L;
SMG_D_L;
SMG_E_L;
SMG_F_L;
SMG_G_L;
SMG_P_L;
for(;;)
{
for(j=0;j<500;j++)
{
if(i<10)
{
SMG_1L;
SMG_2H;
smg_disp(i);
Delay_ms(2);
}
else
{
SMG_1L;
SMG_2H;
smg_disp(i%10);
Delay_ms(1);
SMG_1H;
SMG_2L;
smg_disp(i/10);
Delay_ms(1);
}
}
}
i++;
if(i>99) i=0;
}</code></pre>
<p style="text-align:justify"> </p>
<p>模块只提供了电源VCC引脚,却没提供GND引脚,,</p>
<p>为什么这样设计呢</p>
火辣西米秀 发表于 2021-4-19 23:19
模块只提供了电源VCC引脚,却没提供GND引脚,,
为什么这样设计呢
<p>估计是节省引脚吧,因此点亮段码是必须输出低电平。</p>
<p>哎,没有这么方便的周边模块,看来以后要买些套件了。</p>
Albert.G 发表于 2021-4-21 09:17
哎,没有这么方便的周边模块,看来以后要买些套件了。
<p>用些不太贵的模块还是比较合适的,会方便许多。</p>
<p>谢谢分享,期待后续!</p>
页:
[1]