打印
[DemoCode下载]

ML51单片机的LCD charge pump模式驱动测试

[复制链接]
654|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinxianshi|  楼主 | 2024-2-20 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2020 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/29/2020
//***********************************************************************************************************

/***********************************************************************************************************
  File Function: ML51 LCD charge pump mode driving test sample code

*  [url=home.php?mod=space&uid=247401]@brief[/url] LCD connect and LCD module circuit shor test based on charge pump interrupt.
*  @param  u8LCDPowerType  / u8LCDVSource  / u8DrivingType  / u8BiasLevel   / u8ComNum    /u8DrivingVol
*  @param   printftemp value adjust is based on LCD panel status adjust, the largest value is 0x3FF.
*  [url=home.php?mod=space&uid=266161]@return[/url] LCD charge pump counter over 0x20 com/seg.
//***********************************************************************************************************/

#include "ML51.H"

bit lcdintflag;
unsigned int printftemp=0;
unsigned char lcderrorcounter=0;

void LCD_ISR (void) interrupt 31
{
_push_(SFRS);
  SFRS=3;
  printftemp = ((LCDCPCT1<<8)&0xFF00) + LCDCPCT0;
  if (printftemp>0x40)
  {
      lcdintflag = 1;
  }
  EA = 0 ;
  nop;
_pop_(SFRS);
}  

void LCD_IO_Init(void)
{
/*TSLiu */
/* Enable COM pin MFP */
    MFP_P25_LCD_COM0;
    MFP_P24_LCD_COM1;
    MFP_P41_LCD_COM2;
    MFP_P40_LCD_COM3;
    MFP_P45_LCD_COM4;
    MFP_P44_LCD_COM5;
    MFP_P43_LCD_COM6;
    MFP_P42_LCD_COM7;

/* Enable SEG pin MFP */
    MFP_P06_LCD_SEG0;
    MFP_P07_LCD_SEG1;
    MFP_P34_LCD_SEG2;
    MFP_P35_LCD_SEG3;
    MFP_P20_LCD_SEG4;
    MFP_P21_LCD_SEG5;
    MFP_P26_LCD_SEG6;
    MFP_P27_LCD_SEG7;
    MFP_P64_LCD_SEG8;
    MFP_P65_LCD_SEG9;
    MFP_P66_LCD_SEG10;
    MFP_P67_LCD_SEG11;
    MFP_P30_LCD_SEG12;
//    MFP_P31_LCD_SEG13;
    MFP_P32_LCD_SEG14;
    MFP_P33_LCD_SEG15;
    MFP_P47_LCD_SEG16;
    MFP_P46_LCD_SEG17;
    MFP_P17_LCD_SEG18;
    MFP_P16_LCD_SEG19;
    MFP_P15_LCD_SEG20;
    MFP_P14_LCD_SEG21;
    MFP_P60_LCD_SEG22;
    MFP_P61_LCD_SEG23;
    MFP_P62_LCD_SEG24;
    MFP_P63_LCD_SEG25;

/* DH1 DH2 */
    MFP_P11_LCD_DH1;
    MFP_P12_LCD_DH2;
}


//----------------------------------------------------------------------------------------------//
void main (void)
{

  unsigned char i,j;
  Enable_UART0_VCOM_printf();
  ALL_GPIO_QUASI_MODE;
  /* As defaut all multi function define as GPIO */

  LCD_IO_Init();

  LCD_Clock_Setting(LIRC, LCD_FREQ_DIV2);
  LCD_Open(TYPE_A, Internal_VCP, LCD_CPVOL_3_6V, BIAS_1_4, LCD_8COM);
  LCD_Current_Mode(Buffer_Mode,TurnOn_All);

  LCD_PowerDown_Display(LCD_ON);
  LCD_Enable();
  LCD_SetAllPixels(Enable);

  Timer0_Delay(24000000,500,1000);
  LCD_SetAllPixels(Disable);

  /* Enable LCD chargepump interrupt */
  LCD_Interrupt_Initial(Enable, LCD_CPRD_INT,0);
  ENABLE_GLOBAL_INTERRUPT;
  


/* Routine driving each seg to test LCD module */
  SFRS=0; printf(" \n LCD Charge Pump Test Start ... ");
  for (i=0;i<8;i++)
    {
      for (j=0;j<32;j++)
        {
           LCD_SetOnePixel(i,j,Enable);
           if (lcdintflag)
            {
              SFRS=0; printf(" \n LCD pump counter = 0x%x",  printftemp);
              printf(" \n LCD com = %bd",  j);printf("     LCD seg = %bd",  i);
              lcderrorcounter++;
              lcdintflag = 0;
            }
            Timer0_Delay(24000000,100,1000);
            EA = 1;
          }
      SFRS=0; printf(" \n LCD test continue ... COM %bx", i);
    LCD_SetAllPixels(Disable);
    }

    if (lcderrorcounter==0)
    {
       SFRS=0; printf(" \n LCD test all pass ! ");
    }
    else
    {
       SFRS=0; printf(" \n LCD test finish ! Total error = %bd", lcderrorcounter);
    }
    LCD_SetAllPixels(Enable);
    while(1);
}


使用特权

评论回复
沙发
xinxianshi|  楼主 | 2024-2-20 11:46 | 只看该作者
#include "ML51.H":包含ML51系列单片机的头文件。

定义了一些全局变量和标志位,如lcdintflag表示LCD充电泵中断标志,printftemp用于存储LCD充电泵计数器的值,lcderrorcounter用于统计LCD测试中的错误次数。

LCD_ISR(void) interrupt 31:LCD的充电泵中断服务程序,当LCD充电泵计数器超过0x40时,设置lcdintflag标志,并禁止全局中断。

LCD_IO_Init(void):LCD的IO初始化函数,配置了LCD的COM和SEG引脚。

main()函数:

启用UART0用于printf输出。
配置所有GPIO为准双向模式。
调用LCD_IO_Init()初始化LCD的COM和SEG引脚。
配置LCD的时钟和开启LCD模块。
执行LCD的充电泵测试:
设置充电泵频率。
打开LCD显示和使能所有像素。
延时一段时间。
关闭所有像素。
开启LCD的充电泵中断,并使能全局中断。
循环测试LCD每个COM和SEG的像素,并检查充电泵计数器是否超过阈值。
若超过阈值,则打印相应的信息并增加错误计数。
继续进行测试直到所有COM和SEG测试完毕。
打印测试结果。

使用特权

评论回复
板凳
xinxianshi|  楼主 | 2024-2-20 11:46 | 只看该作者
这段代码的主要功能是通过LCD的充电泵模式进行驱动测试,检测LCD的COM和SEG是否正常工作,并打印测试结果。

使用特权

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

本版积分规则

88

主题

879

帖子

1

粉丝