LP-MSPM0L1306开发板试用体验---数码管显示驱动篇

[复制链接]
 楼主| jinglixixi 发表于 2023-10-9 21:23 | 显示全部楼层 |阅读模式
本打算先使用GPIO口实现一个I2C接口OLED屏的显示,在几经调试无果的情况下,只好先放弃这个选择。
为了确保能有所收获,就选取了串行数码管显示模块作为突破口,其实现的显示效果如下图所示。
1.jpg
显示效果图


该串行数码管显示模块与开发板的连接关系为:
SCL---PA27
SDA---PA26
CS---PA13

也就是说它借用了RGB_LED所使用的引脚,这也再次体现了开发板所采用的设计方式的好处。

为便于向串行数码管显示模块提供高低电平的输出,其定义的语句为:
#define CLK_SetHigh()   DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_27)
#define CLK_SetLow()    DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_27)

#define DIN_SetHigh()   DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_26)
#define DIN_SetLow()    DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_26)

#define CS_SetHigh()    DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_13)  //CS
#define CS_SetLow()     DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_13)


为确保输出信号的稳定与可靠,特配置了一个短时的延时函数,其内容为:
  1. void delay(unsignedint n)
  2. {
  3.     unsignedint uci;
  4.     unsignedint count=2;
  5.     for(uci=0;uci<n;uci++)
  6.     {
  7.         count=4;
  8.         while(count--);
  9.     }
  10. }

由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为:
  1. void Write_Max7219_byte(char DATA)
  2. {
  3.    char i;
  4.    CS_SetLow();
  5.    delay(10);
  6.    for(i=8;i>=1;i--)
  7.    {
  8.         CLK_SetLow();
  9.         if(DATA&0x80)
  10.           DIN_SetHigh();
  11.         else
  12.           DIN_SetLow();
  13.         delay(10);
  14.         DATA=DATA<<1;
  15.         CLK_SetHigh();
  16.         delay(10);
  17.    }
  18. }

以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:
  1. voidWrite_Max7219(char address,char dat)
  2. {
  3.      CS_SetLow();
  4.      Write_Max7219_byte(address);
  5.      Write_Max7219_byte(dat);
  6.      CS_SetHigh();
  7. }

对于串行数码管显示模块,其初始化函数为:
  1. voidInit_MAX7219(void)
  2. {
  3.    Write_Max7219(0x09, 0xff);
  4.    Write_Max7219(0x0a, 0x02);
  5.    Write_Max7219(0x0b, 0x07);
  6.    Write_Max7219(0x0c, 0x01);
  7.    Write_Max7219(0x0f, 0x00);
  8. }

要实现串行数码管显示模块的测试,相应的主程序为:
  1. int main(void)
  2. {
  3.     SYSCFG_DL_init();
  4.     Init_MAX7219();
  5.     Write_Max7219(1,1);
  6.     Write_Max7219(2,2);
  7.     Write_Max7219(3,3);
  8.     Write_Max7219(4,4);
  9.     Write_Max7219(5,5);
  10.     Write_Max7219(6,6);
  11.     Write_Max7219(7,7);
  12.     Write_Max7219(8,8);
  13.     while(1);
  14. }

这样,就实现了串行数码管显示模块的驱动,后面再有数值显示的任务就可以交给它来解决了。

caigang13 发表于 2023-10-10 07:41 来自手机 | 显示全部楼层
GPIO模拟IIC不是很easy嘛
 楼主| jinglixixi 发表于 2023-10-10 08:35 | 显示全部楼层
caigang13 发表于 2023-10-10 07:41
GPIO模拟IIC不是很easy嘛

是呀,但是OLED屏一点反应也没有。
lulugl 发表于 2023-10-10 18:46 | 显示全部楼层
是不是电平不对呀,用示波器看看电平对不对
 楼主| jinglixixi 发表于 2023-10-10 19:09 | 显示全部楼层
lulugl 发表于 2023-10-10 18:46
是不是电平不对呀,用示波器看看电平对不对

5V和3.3V的都试了,电阻上拉也试过,就是没戏。
Tristan_C 发表于 2023-10-11 13:39 | 显示全部楼层
可以逻辑分析仪再看看
 楼主| jinglixixi 发表于 2023-10-11 16:51 | 显示全部楼层
Tristan_C 发表于 2023-10-11 13:39
可以逻辑分析仪再看看

木有呀!
xyz549040622 发表于 2023-10-11 22:32 | 显示全部楼层
官方有基于I2C的程序,可以参考看看,还有那个延时函数,官方也有自己的延时函数,比较准确,不需要自己重新写的。
 楼主| jinglixixi 发表于 2023-10-12 09:00 | 显示全部楼层
xyz549040622 发表于 2023-10-11 22:32
官方有基于I2C的程序,可以参考看看,还有那个延时函数,官方也有自己的延时函数,比较准确,不需要自己重 ...

有标准的延时函数就太好了,其实搞I2C就是基于延时函数。
xyz549040622 发表于 2023-10-12 21:30 | 显示全部楼层
jinglixixi 发表于 2023-10-12 09:00
有标准的延时函数就太好了,其实搞I2C就是基于延时函数。

delay_cycles(cycles),官方的延时是基于这个函数的。
 楼主| jinglixixi 发表于 2023-10-13 08:42 | 显示全部楼层
xyz549040622 发表于 2023-10-12 21:30
delay_cycles(cycles),官方的延时是基于这个函数的。

好的,后面就用它了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部