打印
[LKS32 硬件]

【LKS32MC081评测】 +串行数码管显示模块驱动

[复制链接]
1382|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2022-6-9 18:27 编辑

对任何一款开发板来说,人机交互功能都是十分必要的。对LKS32MC081开发板也不例外,那为它配置怎样一个显示器件呢?
由于该开发板是一款面向电机控制的板子,在直接使用扩展引脚的情况下,可控自由使用的引脚并不太多。为此,为它配置一个以串行模式工作的数码管模块是比较适于在工控环境下使用的。
为测试所用引脚的正确性,特以LED模块进行了测试,其线路连接如图1所示,使用的引脚为P1.10。
经测试,其效果如图2所示,说明用法是正确的,这样就可以进行串行数码管的驱动了。
图1 器件连接
图2 测试效果
该串行数码管模块的外观如图3所示,可显示8位数字。它设有输入接口和输出接口,可供级联使用以显示更多的数位,每个接口均有5个引脚。
这5个引脚的作用如下:
VCC---5V电源
GND---电源地
DIN---数据引脚
CS ---片选引脚
CLK---时钟引脚
图3 串行数码管模块
该串行数码管模块的核心芯片为MAX7219,是通过它将串行信号转变为控制数码管显示的并行信号,从而达到节省引脚资源的作用。
由于该芯片具有数据锁存、编解码及驱动功能,故在使用时十分方便。
该显示模块与开发板的连接情况为:
DIN---P1.11
CS ---P0.4
CLK--- P1.10
开发板的扩展接口如图4所示,可见能自由使用的资源较为有限。


图4 扩展接口
为此,对引脚的配置函数为:
void smg_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIO1, &GPIO_InitStruct);
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIO1, &GPIO_InitStruct);
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIO0, &GPIO_InitStruct);
}

在信号输出时,为保证信号的可靠稳定,特配置了一个延时函数,其内容如下:
void Delay_xs(u16 x)
{
   u16 i,j;
   for(i=0;i<x;i++)
    for(j=0;j<112;j++);
}

MAX7219的初始化函数为:
void Init_MAX7219(void)
{
    Write_Max7219(0x09, 0xff);
    Write_Max7219(0x0a, 0x03);
    Write_Max7219(0x0b, 0x07);
    Write_Max7219(0x0c, 0x01);
    Write_Max7219(0x0f, 0x01);
}

以模拟方式,发送字节数据的函数为:
void Write_Max7219_byte(u8 DATA)
{
         u8 i;
         GPIO_ResetBits(GPIO0, GPIO_Pin_4);
         for(i=8;i>=1;i--)
         {
              GPIO_ResetBits(GPIO1, GPIO_Pin_10);
              if(DATA&0x80)
              {
                      GPIO_SetBits(GPIO1, GPIO_Pin_11);
              }
              else
              {
                     GPIO_ResetBits(GPIO1, GPIO_Pin_11);
              }
              Delay_xs(2);
              DATA=DATA<<1;
              GPIO_SetBits(GPIO1, GPIO_Pin_10);
             Delay_xs(2);
        }
}

将数据写入寄存器的函数为:
void Write_Max7219(u8 address,u8 dat)
{
      GPIO_ResetBits(GPIO0, GPIO_Pin_4);
      Write_Max7219_byte(address);
      Write_Max7219_byte(dat);
      GPIO_SetBits(GPIO0, GPIO_Pin_4);
}

实现数值显示的主程序为:
int main(void)
{
  u8 key = 0;
  u16 i;
  Hardware_init();
  smg_init();
  Init_MAX7219();
  delay(2000);
  Write_Max7219(0x0f, 0x00);
  Write_Max7219(1,8);
  Write_Max7219(2,7);
  Write_Max7219(3,6);
  Write_Max7219(4,5);
  Write_Max7219(5,4);
  Write_Max7219(6,3);
  Write_Max7219(7,2);
  Write_Max7219(8,1);
  while (1);
}

经编译和下载,其显示效果如图5所示。
图5 显示效果

使用特权

评论回复
沙发
daichaodai| | 2022-6-9 21:30 | 只看该作者
左边那个只有个LED的是什么模块?

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2022-6-9 22:43 | 只看该作者
daichaodai 发表于 2022-6-9 21:30
左边那个只有个LED的是什么模块?

LED模块,用于测试GPIO口的输出性能,用起来比较方便和安全。

使用特权

评论回复
地板
yinwuqing110| | 2022-6-11 23:37 | 只看该作者
有驱动16*8的点阵屏示例么?

使用特权

评论回复
5
robincotton| | 2022-6-20 15:23 | 只看该作者
现在的数码管驱动太多了。  

使用特权

评论回复
6
bartonalfred| | 2022-6-20 16:06 | 只看该作者
可以做点阵吗?

使用特权

评论回复
7
saservice| | 2022-6-20 16:29 | 只看该作者
串行的驱动的速度很快吗?

使用特权

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

本版积分规则

455

主题

2756

帖子

38

粉丝