[MM32软件] EV Board (MM32L0136C7P)测评】+SLCD外设探秘

[复制链接]
 楼主| gaoyang9992006 发表于 2022-11-30 20:20 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2022-11-30 22:10 编辑

       说来惭愧,第一次使用LCD段码屏,无从下手,然后认真阅读了芯片手册与LCD屏模块手册,并跟多位大佬沟通学习,现在有所收获,特来分享学习成果和经验,帮助后来者,并作为自己学习的笔记,以备遗忘。
1221863873e9cc48a2.png
根据手册,芯片内部提供了显示数据寄存器,因此我们要显示的内容是要装填到该寄存器区域。然后片内SLCD外设会将这些数据映射到对应的管脚上。
这次开发板自带的屏幕的SEG段码引脚几本书都在如下红框区域了。共用端口4个COM0~COM3,对应LCD屏手册上的COM1~COM4,这里要注意,起始编号不同。
3098863873f181bffa.png
应注意以下关键词:SLCD 模块提供公共端(COM)引脚和段(SEG)引脚的驱动。

这些内部寄存器是怎么按位映射到引脚呢?
      当作为 SLCD 引脚使用时,每一个 SLCD 引脚都可以被重映射为 COM 或者 SEG 引脚,以简化电路板上的布局布线。SLCD 模块支持从 L0 到 L63 最多 64 个 SLCD 引脚(SLCD 引脚的最终数量由产品规格书中设备引脚的数目决定),每一个引脚可以通过相应的 SLCD_CFGR0 和 SLCD_CFGR1 寄存器来配置,重映射其作为 COM 或者 SEG 功能。

这其中的难点在于理解L0到L63是什么,需要查看数据手册4.2 引脚定义表,L0到L63为映射到IO端口上的复用LCD功能引脚。
这里可以结合库函数中的部分内容一起阅读更好理解。
本开发板上单片机与LCD引脚的对应关系为
  1. #define BOARD_SLCD_COM0_PIN   35u /* COM0 -> L35. */
  2. #define BOARD_SLCD_COM1_PIN   40u /* COM1 -> L40. */
  3. #define BOARD_SLCD_COM2_PIN   0u  /* COM2 -> L0. */
  4. #define BOARD_SLCD_COM3_PIN   1u  /* COM3 -> L1. */

  5. #define BOARD_SLCD_SEG0_PIN   3u  /* Segment 0 -> L3. */
  6. #define BOARD_SLCD_SEG1_PIN   7u  /* Segment 1 -> L7. */
  7. #define BOARD_SLCD_SEG2_PIN   6u  /* Segment 2 -> L6. */
  8. #define BOARD_SLCD_SEG3_PIN   5u  /* Segment 3 -> L5. */
  9. #define BOARD_SLCD_SEG4_PIN   4u  /* Segment 4 -> L4. */
  10. #define BOARD_SLCD_SEG5_PIN   58u /* Segment 5 -> L58. */
  11. #define BOARD_SLCD_SEG6_PIN   26u /* Segment 6 -> L26. */
  12. #define BOARD_SLCD_SEG7_PIN   27u /* Segment 7 -> L27. */
  13. #define BOARD_SLCD_SEG8_PIN   30u /* Segment 8 -> L30. */

  14. #define BOARD_SLCD_SEG15_PIN  8u /* Segment 15 -> L8. */
  15. #define BOARD_SLCD_SEG16_PIN  9u /* Segment 16 -> L9. */
  16. #define BOARD_SLCD_SEG17_PIN  10u /* Segment 17 -> L10. */
  17. #define BOARD_SLCD_SEG18_PIN  11u /* Segment 18 -> L11. */
  18. #define BOARD_SLCD_SEG19_PIN  15u /* Segment 19 -> L15. */
  19. #define BOARD_SLCD_SEG20_PIN  16u /* Segment 20 -> L16. */
  20. #define BOARD_SLCD_SEG21_PIN  17u /* Segment 21 -> L17. */

  21. #define BOARD_SLCD_SEG23_PIN  20u /* Segment 23 -> L20. */
  22. #define BOARD_SLCD_SEG24_PIN  19u /* Segment 24 -> L19. */
  23. #define BOARD_SLCD_SEG25_PIN  22u /* Segment 25 -> L22. */
  24. #define BOARD_SLCD_SEG26_PIN  21u /* Segment 26 -> L21. */
  25. #define BOARD_SLCD_SEG27_PIN  28u /* Segment 27 -> L28. */
  26. #define BOARD_SLCD_SEG28_PIN  29u /* Segment 28 -> L29. */
其中
Segment 0 ~Segment 28 以及COM0~COM3对应LCD屏上的1到29针脚,分布如下图所示,所以12到15针脚这里要配置成COM0到COM3,即下图中对应的COM1到COM4,这里主意编号的起始号。
918266387432809658.png
另外观察上屏PIN1:PIN2如果移动2位就刚好对应3和4映射到第二个八段数码管,以此类推,我们可以定义出第一个的字码表,通过移位操作即可实现其他的八段数码管控制,前提是L0到L63也是按顺序与LCD屏幕的针脚连接的。因此如果自己设计原理图的话,可以注意一下这里的细节,目前开发板上并未按顺序连接。
于是我对照手册与头文件中已经定义好的编码做了如下定义,实现编号为1的数码管上显示0到F,以及“.”点的显示,共计17个字符,由于4个COM端口对应四组寄存器
所以定义为如下17行4列数组。
  1. uint32_t TAB1[17][4]={
  2. {(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//0
  3. {0,(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG1_PIN),0},                                                                                                    //1
  4. {(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG1_PIN)},                           //2
  5. {(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG1_PIN)},                           //3
  6. {0,(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG0_PIN)},                                                  //4
  7. {(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                           //5
  8. {(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//6
  9. {0,(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG1_PIN)},                                                                             //7
  10. {(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//8
  11. {(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//9
  12. {0,((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//A
  13. {(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN)},                               //b
  14. {(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),0,((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                                                      //C
  15. {(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),0},                           //d
  16. {(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                               //E
  17. {0,(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                                                      //F
  18. {(1<<BOARD_SLCD_SEG1_PIN),0,0,0}                                                                                                                                //.
  19. };


然后我们编写测试程序
  1. int main(void)
  2. {
  3.         int i=0;
  4.         BOARD_Init();

  5.     app_slcd_init();
  6.   //  app_slcd_display();
  7.     while (1)
  8.     {
  9.                         for(i=0;i<17;i++)
  10.                         {
  11.                                 // COM0
  12.                                 BOARD_SLCD_PORT->DR0 =TAB1[i][0];
  13.                                 // COM1                        
  14.                                 BOARD_SLCD_PORT->DR2 =TAB1[i][1];
  15.                                 // COM2                        
  16.                                 BOARD_SLCD_PORT->DR4 =TAB1[i][2];
  17.                                 // COM3                        
  18.                                 BOARD_SLCD_PORT->DR6 =TAB1[i][3];

  19.                                 app_delay(100u);                        
  20.                         }
  21.                         
  22.     }
  23. }
运行效果
834786387478817b46.jpg




coslight 发表于 2022-12-1 10:29 | 显示全部楼层
写的挺好,感觉明白点slcd的使用方法了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16351

帖子

222

粉丝
快速回复 返回顶部 返回列表