|
如上图,这是使用fm33a048内部lcd显示效果,有些段显示不清楚,请问会是什么原因呢?
下面是液晶初始化
- //IO配置为液晶功能
- void LCD_IO_Init(void)
- {
- AnalogIO( GPIOA, GPIO_Pin_5 ); //PA5; //COM0
- AnalogIO( GPIOA, GPIO_Pin_4 ); //PA4; //COM1
- AnalogIO( GPIOA, GPIO_Pin_7 ); //PA7; //COM2
- AnalogIO( GPIOA, GPIO_Pin_6 ); //PA6; //COM3
- AnalogIO( GPIOA, GPIO_Pin_3 ); //PA3; //COM4
- AnalogIO( GPIOA, GPIO_Pin_2 ); //PA2; //COM5
- AnalogIO( GPIOA, GPIO_Pin_1 ); //PA1; //COM6
- AnalogIO( GPIOA, GPIO_Pin_0 ); //PA0; //COM7
- AnalogIO( GPIOA, GPIO_Pin_8 ); //PA8;//SEG1
- AnalogIO( GPIOA, GPIO_Pin_9 ); //PA9;//SEG2
- AnalogIO( GPIOA, GPIO_Pin_10 ); //PA10;//SEG3
- AnalogIO( GPIOA, GPIO_Pin_11 ); //PA11;//SEG4
- AnalogIO( GPIOA, GPIO_Pin_12 ); //PA12;//SEG5
- AnalogIO( GPIOA, GPIO_Pin_13 ); //PA13;//SEG6
- AnalogIO( GPIOB, GPIO_Pin_4 ); //PB4;//SEG7
- AnalogIO( GPIOB, GPIO_Pin_5 ); //PB5;//SEG8
- AnalogIO( GPIOB, GPIO_Pin_6 ); //PB6;//SEG9
- AnalogIO( GPIOB, GPIO_Pin_7 ); //PB7;//SEG10
- AnalogIO( GPIOB, GPIO_Pin_8 ); //PB8;//SEG11
- AnalogIO( GPIOB, GPIO_Pin_9 ); //PB9;//SEG12
- AnalogIO( GPIOB, GPIO_Pin_10 ); //PB10;//SEG13
- AnalogIO( GPIOB, GPIO_Pin_11); //PB11;//SEG14
- AnalogIO( GPIOB, GPIO_Pin_12 ); //PB12;//SEG15
- AnalogIO( GPIOB, GPIO_Pin_13 ); //PB13;//SEG16
- AnalogIO( GPIOB, GPIO_Pin_14 ); //PB14;//SEG17
- AnalogIO( GPIOB, GPIO_Pin_15 ); //PB15;//SEG18
- AnalogIO( GPIOD, GPIO_Pin_2 ); //PD2;//SEG19
- AnalogIO( GPIOD, GPIO_Pin_3 ); //PD3;//SEG20
- }
- /*使能液晶COM,SEG驱动波形输出*/
- void LCD_COMSEGEN_Init(void)
- {
- uint32_t Temp32;
- RCC_PERCLK_SetableEx(LCDCLK, ENABLE); //LCD时钟使能
- /* LCD COM0~3输出使能控制*/
- Temp32 = (
- LCD_COM_EN_COMEN0_Msk |
- LCD_COM_EN_COMEN1_Msk |
- LCD_COM_EN_COMEN2_Msk |
- LCD_COM_EN_COMEN3_Msk
- );
- LCD_COM_EN_Write(Temp32);
- /* LCD SEG0~31输出使能控制*/
- Temp32 = (LCD_SEG_EN0_SEGEN0_Msk |
- LCD_SEG_EN0_SEGEN1_Msk |
- LCD_SEG_EN0_SEGEN2_Msk |
- LCD_SEG_EN0_SEGEN3_Msk |
- LCD_SEG_EN0_SEGEN4_Msk |
- LCD_SEG_EN0_SEGEN5_Msk |
- LCD_SEG_EN0_SEGEN6_Msk |
- LCD_SEG_EN0_SEGEN7_Msk |
- LCD_SEG_EN0_SEGEN8_Msk |
- LCD_SEG_EN0_SEGEN9_Msk |
- LCD_SEG_EN0_SEGEN10_Msk |
- LCD_SEG_EN0_SEGEN11_Msk |
- LCD_SEG_EN0_SEGEN12_Msk |
- LCD_SEG_EN0_SEGEN13_Msk |
- LCD_SEG_EN0_SEGEN14_Msk |
- LCD_SEG_EN0_SEGEN15_Msk |
- LCD_SEG_EN0_SEGEN16_Msk |
- LCD_SEG_EN0_SEGEN17_Msk |
- LCD_SEG_EN0_SEGEN18_Msk |
- LCD_SEG_EN0_SEGEN19_Msk
- );
- LCD_SEG_EN0_Write(Temp32);
- /* LCD SEG32~43,COM4~7输出使能控制*/
- Temp32 = (
- LCD_SEG_EN1_COM4ENo8COM_Msk |
- LCD_SEG_EN1_COM5ENo8COM_Msk |
- LCD_SEG_EN1_COM6ENo8COM_Msk |
- LCD_SEG_EN1_COM7ENo8COM_Msk
- );
- LCD_SEG_EN1_Write(Temp32);
- }
- /*显示频率寄存器计算
- 输入
- uint32_t LMUX COM数量:LCD_LCDSET_LMUX_4COM,LCD_LCDSET_LMUX_6COM,LCD_LCDSET_LMUX_8COM
- uint32_t WFT 驱动波形:LCD_LCDSET_WFT_ATYPE,LCD_LCDSET_WFT_BTYPE
- uint32_t FreqWanted 刷新频率:1~100
- 输出
- 显示频率寄存器配置值
- */
- uint32_t LCD_DF_Calc(uint32_t LMUX, uint32_t WFT, uint32_t FreqWanted)
- {
- uint8_t DivWFT;
- uint32_t DFResult;
- if(LCD_LCDSET_WFT_ATYPE == WFT)
- DivWFT = 2;
- else
- DivWFT = 4;
- if((FreqWanted > 0)&&(FreqWanted <= 100))
- {
- DFResult = (uint32_t)(32768.0/(float)((LMUX*2+4)*FreqWanted*DivWFT) + 0.5);
- }
- else
- {
- DFResult = 32;
- }
- return DFResult;
- }
- /*Lcd模块初始化*/
- void Init_LCD(void)
- {
- uint32_t DispBuf[10];
- LCD_InitTypeDef LCD_InitStruct;
- LCD_Boost_InitTypeDef Boost_InitStruct;
- LCD_IO_Init();
- LCD_COMSEGEN_Init();
- RCC_PERCLK_SetableEx(LCDCLK, ENABLE); //LCD时钟使能
- m_memset(DispBuf, 0xFF, 10*4);
- LCD_DISPDATAx_Refresh(DispBuf);//全屏显示
- //lcd初始化配置
- LCD_InitStruct.LMUX = LCD_LCDSET_LMUX_8COM; /*!<COM数量选择*/
- LCD_InitStruct.ENMODE = LCD_LCDDRV_ENMODE_INNERRESISTER; /*!<驱动模式选择*/
- LCD_InitStruct.WFT = LCD_LCDSET_WFT_ATYPE; /*!<驱动波形选择*/
- LCD_InitStruct.DF = LCD_DF_Calc(LCD_InitStruct.LMUX, LCD_InitStruct.WFT, 0); /*!<显示频率控制寄存器*/
- LCD_InitStruct.BIASMD = LCD_LCDSET_BIASMD_3BIAS; /*!<偏置类型控制*/
- LCD_InitStruct.SCFSEL = LCD_LCDDRV_SCFSEL_X1; /*!<SC频率选择*/ //仅在片外电容模式下有效
- LCD_InitStruct.SC_CTRL = LCD_LCDDRV_SC_CTRL_ONE; /*!<片外电容驱动模式下,驱动方式控制*/
- LCD_InitStruct.IC_CTRL = LCD_LCDDRV_IC_CTRL_L3; /*!<片内电阻模式下,驱动电流大小*/
- LCD_InitStruct.LCDBIAS = 15; /*!<显示灰度设置*/
- LCD_InitStruct.ANTIPOLAR = ENABLE; /*!<防极化使能控制*/
- LCD_InitStruct.TEST = DISABLE; /*!<测试模式使能控制,仅在DISPMD=1的情况下有效*/
- LCD_InitStruct.DISPMD = DISABLE; /*!<测试模式使能控制*/
- LCD_InitStruct.LCCTRL = LCD_LCDTEST_LCCTRL_0; /*!<保持为0*/
- LCD_InitStruct.TESTEN = DISABLE; /*!<保持关闭*/
- LCD_InitStruct.FLICK = DISABLE; /*!<显示闪烁使能控制*/
- LCD_InitStruct.TON = 0; /*!<闪烁显示时的点亮时间=TON×0.25秒*/
- LCD_InitStruct.TOFF = 0; /*!<闪烁显示时的熄灭时间=TOFF×0.25秒*/
- LCD_InitStruct.DONIE = DISABLE; /*!<显示点亮中断使能控制*/
- LCD_InitStruct.DOFFIE = DISABLE; /*!<显示熄灭中断使能控制*/
- LCD_InitStruct.LCDEN = ENABLE; /*!<LCD显示使能控制*/
- LCD_Init(&LCD_InitStruct);
- //boost初始化配置
- Boost_InitStruct.OSC_CFG = LCD_LCDBSTCON_OSC_CFG_GRADE2; /*!<BOOST环振频率配置信号,值越大频率越高,驱动越强,功耗越高*/ //推荐使用GRADE1
- Boost_InitStruct.VLCDCFG = LCD_LCDBSTCON_VLCDCFG_3P0V; /*!<VLCD输出电压配置*/
- Boost_InitStruct.BUFENB = ENABLE; /*!<基准源Buffer使能控制*/ //需要打开
- Boost_InitStruct.BUFBYP = DISABLE; /*!<基准源Buffer Bypass使能控制*/ //需要关闭
- Boost_InitStruct.VLCDPD = DISABLE; /*!<VLCD下拉使能控制*/ //需要关闭
- Boost_InitStruct.BOOST_TEN = DISABLE; /*!<Booster测试信号*/ //保持关闭即可
- Boost_InitStruct.BOOST_EN = DISABLE; /*!<Booster使能控制*/
- LCD_Boost_Init(&Boost_InitStruct);
- }
复制代码 原理图
FM33A0x.pdf
(334.31 KB, 下载次数: 2560)
|
|