jinglixixi 发表于 2024-10-27 09:41

【翌创ET6001测评】串行数码管显示驱动

<p>本打算用GPIO口实现一个I2C接口OLED屏的显示,在几经调试无果的情况下,只好先放弃这个选择。</p>

<p >于是选取了串行数码管显示模块作为突破口,经测试其显示效果良好。</p>

<p >该显示模块以MAX7219为主控芯片,可显示8位数值,并支持级联使用。除电源外,它只需3个GPIO口,故十分节省引脚资源。</p>

<p > &nbsp;</p>

<p>图1 串行数码管显示模块</p>

<p >&nbsp;</p>

<p >该显示模块与开发板的连接关系为:</p>

<p >SCL---GPIO2_2</p>

<p >SDA---GPIO2_3</p>

<p >CS---GPIO2_4</p>

<p >&nbsp;</p>

<p >为便于向串行数码管显示模块提供高低电平的输出,所定义的语句为:</p>

<p >#define CLK_SetLow &nbsp;&nbsp;GPIO_WritePin(GPIO2, GPIO_PIN_02, RESET)</p>

<p >#define CLK_SetHigh &nbsp;GPIO_WritePin(GPIO2, GPIO_PIN_02, SET)</p>

<p >&nbsp;</p>

<p >#define DIN_SetLow &nbsp;&nbsp;GPIO_WritePin(GPIO2, GPIO_PIN_03, RESET)</p>

<p >#define DIN_SetHigh &nbsp;GPIO_WritePin(GPIO2, GPIO_PIN_03, SET)</p>

<p >&nbsp;</p>

<p >#define CS_SetLow &nbsp;&nbsp;&nbsp;GPIO_WritePin(GPIO2, GPIO_PIN_04, RESET)</p>

<p >#define CS_SetHigh &nbsp;&nbsp;GPIO_WritePin(GPIO2, GPIO_PIN_04, SET)</p>

<p >&nbsp;</p>

<p>由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为:</p>

<pre>
<code class="language-cpp">static void Write_Max7219_byte(char DATA)
{
char i;
CS_SetLow;
delay(10);
for(i=8;i&gt;=1;i--)
{
      CLK_SetLow;
      if(DATA&amp;0x80)
         DIN_SetHigh;
      else
         DIN_SetLow;
      delay(10);
      DATA=(char)(DATA&lt;&lt;1);
      CLK_SetHigh;
      delay(10);
}
}</code></pre>

<p>&nbsp;</p>

<p>以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:</p>

<pre>
<code class="language-cpp">static void Write_Max7219(char address,char dat)
{
CS_SetLow;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh;
}</code></pre>

<p>&nbsp;</p>

<p>对于串行数码管显示模块,其初始化函数为:</p>

<pre>
<code class="language-cpp">static void Init_MAX7219(void)
{
   Write_Max7219(0x09, 0xff);
   Write_Max7219(0x0a, 0x02);
   Write_Max7219(0x0b, 0x07);
   Write_Max7219(0x0c, 0x01);
   Write_Max7219(0x0f, 0x00);
}</code></pre>

<p>&nbsp;</p>

<p>要实现串行数码管显示模块的测试,相应的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    EVB_LEDInit();
    Init_MAX7219();
    Write_Max7219(1,1);
    Write_Max7219(2,2);
    Write_Max7219(3,3);
    Write_Max7219(4,4);
    Write_Max7219(5,5);
    Write_Max7219(6,6);
    Write_Max7219(7,7);
    Write_Max7219(8,8);
    while (1)
    {
      GPIO_TogglePin(GPIO_LED_PORT, GPIO_LED_PIN);
      __Delay(0x5FFFFF);
}
}</code></pre>

<p>&nbsp;</p>

<p>经程序编译与运行,其效果如图2所示。</p>

<p> &nbsp;</p>

<p>图2 显示效果图</p>

<p >&nbsp;</p>

<p >这样,就实现了串行数码管模块的显示驱动,后面再有数值显示的需要就可以交它来完成。</p>

秦天qintian0303 发表于 2024-10-27 12:25

<p>模拟IIC接口呢?硬件不同的芯片不同的问题&nbsp;&nbsp;</p>

jinglixixi 发表于 2024-10-27 12:51

秦天qintian0303 发表于 2024-10-27 12:25
模拟IIC接口呢?硬件不同的芯片不同的问题&nbsp;&nbsp;

<p>模拟的,这样移植使用时比较方便。</p>
页: [1]
查看完整版本: 【翌创ET6001测评】串行数码管显示驱动