[MM32软件] 【EV Board (MM32L0136C7P)测评】+ LCD屏显示驱动的探索

[复制链接]
943|2
 楼主| jinglixixi 发表于 2022-11-28 01:28 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2022-11-28 17:58 编辑

#申请原创#
EVB-L0130开发板上,最直观的显示器件是LCD屏。但在官方的例程中却并没有直接给出一个可供调用的显示函数,所提供的只是一个点亮各笔段的演示程序,要实现数据的显示功能,只有自己动手去解决了。
该显示屏的显示面板如图1所示,但从点亮笔段的演示中可以发现并不是所有的笔段都能点亮的。
a.jpg
图1 显示面板
此外,通过实测该LCD屏的相关资料介绍与实际情况也是存在出入的,见表1和表2所示。
表1 相关资料的内容
b.jpg
表2 实测的内容
3.jpg
为获得表2的内容,可通过如下的程序来实现:
  1. int main(void)
  2. {
  3.     BOARD_Init();
  4.     app_slcd_init();
  5.     GPIO_Init_Type gpio_init;
  6.     gpio_init.Pins  = GPIO_PIN_5;
  7.     gpio_init.PinMode  = GPIO_PinMode_In_PullUp;
  8.     gpio_init.Speed = GPIO_Speed_50MHz;
  9.     GPIO_Init(GPIOD, &gpio_init);
  10.     app_slcd_display();
  11.     while(1);
  12. }

  13. void app_slcd_display(void)
  14. {
  15.         uint32_t p;
  16.         p=1;
  17.         while(1)
  18.         {
  19.            /* Clear all segment bits. */
  20.           SLCD_ClearAllSegBits(BOARD_SLCD_PORT);
  21.           for (uint32_t com_x = 0u; com_x < BOARD_SLCD_COM_NUM; com_x++)
  22.           {
  23.              app_slcd_seg_bits[0u] = 0u;
  24.              app_slcd_seg_bits[1u] = 0u;
  25.              for (uint32_t seg_y = p; seg_y < p+1; seg_y++)
  26.              {
  27.                 if (app_slcd_seg_pin_buff[seg_y] < 32u)
  28.                 {
  29.                     app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[seg_y] );
  30.                 }
  31.                 else
  32.                 {
  33.                     app_slcd_seg_bits[1u] |= (1u << (app_slcd_seg_pin_buff[seg_y] - 32u) );
  34.                 }
  35.                 SLCD_SetCOMxSegBits(BOARD_SLCD_PORT, com_x, (uint32_t * )app_slcd_seg_bits);
  36.                 app_delay(200u);
  37.             }
  38.         }
  39.         while( GPIO_ReadInDataBit(BOARD_KEY0_GPIO_PORT, BOARD_KEY0_GPIO_PIN)==1);
  40.         if(p<28) p=p+1;
  41.         app_delay(100u);
  42.         }
  43. }

在编译下载程序后,每按下一次K2键,就显示出对应笔段的内容,以便分析和使用。
借助表2的帮助,可通过下面的程序来实现数字的显示测试:
数字符号显示:
  1. int main(void)
  2. {
  3.         BOARD_Init();
  4.         app_slcd_init();
  5.         app_display(0);
  6.         app_delay(500);
  7.         app_display(1);
  8.         app_delay(500);
  9.         app_display(2);
  10.         app_delay(500);
  11.         app_display(3);
  12.         app_delay(500);
  13.         app_display(4);
  14.         app_delay(500);
  15.         app_display(5);
  16.         app_delay(500);
  17.         app_display(6);
  18.         app_delay(500);
  19.         app_display(7);
  20.         app_delay(500);
  21.         app_display(8);
  22.         app_delay(500);
  23.         app_display(9);
  24.         app_delay(500);
  25.         while(1);
  26. }

  27. void app_display(char ch)
  28. {
  29.           unsigned char n,w;
  30.           unsigned char tab[10]={0xbe,0x06,0x7c,0x5e,0xc6,0xda,0xfa,0x0e,0xfe,0xde};
  31.           w=tab[ch];
  32.           SLCD_ClearAllSegBits(BOARD_SLCD_PORT);
  33.           app_slcd_seg_bits[0u] = 0u;
  34.           app_slcd_seg_bits[1u] = 0u;
  35.           for (uint32_t com_x = 0u; com_x < BOARD_SLCD_COM_NUM; com_x++)
  36.           {
  37.                         if((w&0x01)==1) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[5] );
  38.                         else  app_slcd_seg_bits[0u] &= (~(1u << app_slcd_seg_pin_buff[5] ));
  39.                         if((w&0x10)!=0) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[1] );
  40.                         else  app_slcd_seg_bits[0u] &= (~(1u << app_slcd_seg_pin_buff[1] ));
  41.                         SLCD_SetCOMxSegBits(BOARD_SLCD_PORT, com_x, (uint32_t * )app_slcd_seg_bits);
  42.                         w=w>>1;
  43.           }
  44. }

在显示数据时,常离不开小数点的实验,控制小数点的测试语句如下:
LCD_DisplayNumber(1,6,0);
app_delay(500);
LCD_DisplayNumber(1,8,0);
app_delay(500);
控制小数点的关键程序为:
  1. for (uint32_t com_x = 0u; com_x < BOARD_SLCD_COM_NUM; com_x++)
  2. {
  3.         if((w&0x01)==1) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[k] );
  4.         else  app_slcd_seg_bits[0u] &= (~(1u << app_slcd_seg_pin_buff[k] ));
  5.         if((w&0x10)!=0) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[j] );
  6.         else  app_slcd_seg_bits[0u] &= (~(1u << app_slcd_seg_pin_buff[j] ));
  7.         if((Point==1)&&(com_x==0)) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[k]);
  8.         SLCD_SetCOMxSegBits(BOARD_SLCD_PORT, com_x, (uint32_t * )app_slcd_seg_bits);
  9.         w=w>>1;
  10. }

实现多个小号数字出现的程序为:
  1. int main(void)
  2. {
  3.           BOARD_Init();
  4.           app_slcd_init();
  5.           SLCD_ClearAllSegBits(BOARD_SLCD_PORT);
  6.           app_slcd_seg_bits[0u] = 0u;
  7.           app_slcd_seg_bits[1u] = 0u;
  8.           LCD_DisplayNumber(1,8,0);
  9.           app_delay(500);
  10.           LCD_DisplayNumber(2,0,0);
  11.           while(1);
  12. }

测试多个大号数字出现的语句为:
           app_delay(500);
           LCD_DisplayNumberD(5,0,1);
           app_delay(500);
           LCD_DisplayNumberD(6,5,0);

           app_delay(500);
           LCD_DisplayNumberD(7,2,1);
           app_delay(500);
           LCD_DisplayNumberD(8,3,0);

           app_delay(500);
           LCD_DisplayNumberD(9,4,1);
           app_delay(500);
           LCD_DisplayNumberD(10,9,0);


实现大号数字显示的函数为:
  1. void LCD_DisplayNumberD(uint8_t Index,char ch,uint8_t Point)
  2. {
  3.           char j,k;
  4.           uint8_t w;
  5.           unsigned char tab[10]={0xd7,0x06,0xe3,0xa7,0x36,0xb5,0xe5,0x07,0xf7,0xb7};
  6.           w=tab[ch];
  7.           if(Index==5)
  8.           {
  9.                   j=6;
  10.                   k=7;
  11.           }
  12.           if(Index==6)
  13.           {
  14.                   j=8;
  15.                   k=9;
  16.           }
  17.           if(Index==7)
  18.           {
  19.                   j=13;
  20.                   k=14;
  21.           }
  22.           if(Index==8)
  23.           {
  24.                   j=18;
  25.                   k=17;
  26.           }
  27.           if(Index==9)
  28.           {
  29.                   j=20;
  30.                   k=19;
  31.           }
  32.            if(Index==10)
  33.            {
  34.                   j=26;
  35.                   k=27;
  36.           }
  37.           app_slcd_seg_bits[0u] = 0u;
  38.           for (uint32_t com_x = 0u; com_x < BOARD_SLCD_COM_NUM; com_x++)
  39.           {
  40.                      if((w&0x01)==1) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[k] );
  41.                      else  app_slcd_seg_bits[0u] &= (~(1u << app_slcd_seg_pin_buff[k] ));
  42.                      if((w&0x10)!=0) app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[j] );
  43.                      else  app_slcd_seg_bits[0u] &= (~(1u << app_slcd_seg_pin_buff[j] ));
  44.                      if(Point==1)
  45.                      {
  46.                                  if ( com_x == 3u)  app_slcd_seg_bits[0u] |= (1u << app_slcd_seg_pin_buff[k]);
  47.                      }
  48.                     SLCD_SetCOMxSegBits(BOARD_SLCD_PORT, com_x, (uint32_t * )app_slcd_seg_bits);
  49.                     w=w>>1;
  50.      }
  51. }

在与ADC相配合进行采集数据显示时,其效果如图2所示。

l.jpg
图2  显示采集数据

这样我们就可以利用LCD屏来进行人机交互了,而无需全部倚仗着串口的帮助。




coslight 发表于 2022-11-29 13:25 | 显示全部楼层
测试不错,支持一下
 楼主| jinglixixi 发表于 2022-11-29 15:11 | 显示全部楼层
coslight 发表于 2022-11-29 13:25
测试不错,支持一下

感谢支持!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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