1.驱动LCD注意点:
若有某点不亮,可能是PB23引脚RST功能开启导致,下载时不勾选使能RST即可,
如大部分点不亮,可能是开启仿真导致,PB14和PB15为com2和com3。
2.第一个参数选择使能的com,第二个参数选择驱动电压,2级分压对应VCC电压,3级分压对应2/3VCC电压。
LCD_Init(LCD_1_4_Duty, LCD_1_3_Bias); //LCD初始化
void LCD_Init(LCDDutyTypeDef duty, LCDBiasTypeDef bias)
{
R32_PIN_CONFIG2 = 0xfffeff3f; // 关闭使用的LCD引脚的数字输入
R16_PIN_ALTERNATE |= RB_DEBUG_EN; // 操作LCD时,需关闭debug
R32_LCD_CMD = 0x1ffff << 8;
R32_LCD_CMD |= RB_LCD_SYS_EN | RB_LCD_ON |
(LCD_CLK_128 << 5) |
(duty << 3) |
(bias << 2);
}
typedef enum
{
LCD_1_2_Duty = 0, // COM0-COM1
LCD_1_3_Duty, // COM0-COM2
LCD_1_4_Duty, // COM0-COM3
}LCDDutyTypeDef;
typedef enum
{
LCD_1_2_Bias = 0, // 2级分压
LCD_1_3_Bias, // 3级分压
}LCDBiasTypeDef;
3.下面的代码需要对应着芯片手册和LCD屏手册来看,
下面我们来举个例子:
芯片的SEG0和SEG1引脚接在LCD屏幕的PIN3和PIN4,PIN3和PIN4控制着第一个8,那么我们给R32_LCD_RAM0 低八位写入对应数据即可显示,例程传入的0x7d显示出来是数字0,数字0只有G段和CP1不需要亮,那对应的二进制是01111101(0x7d),1F对应最低位,CP1对应最高位。
芯片的SEG2和SEG3引脚接在LCD屏幕的PIN5和PIN6,PIN5和PIN6控制着第二个8,那么我们给R32_LCD_RAM0 低八位左移8位写入对应数据即可显示,例程传入的0x60显示出来是数字1,数字1只有B段和C段需要亮,那对应的二进制是01100000(0x60),2F对应最低位,CP2对应最高位。
芯片的SEG4和SEG5引脚接在LCD屏幕的PIN7和PIN8,PIN7和PIN8控制着第三个8,那么我们给R32_LCD_RAM0 低八位左移16位写入对应数据即可显示,例程传入的0x3e显示出来是数字2,数字2只有F段,C段和CP3不需要亮,那对应的二进制是00111110(0x3e),3F对应最低位,CP3对应最高位。
芯片的SEG6和SEG7引脚接在LCD屏幕的PIN9和PIN10,PIN9和PIN10控制着第四个8,那么我们给R32_LCD_RAM0 低八位左移24位写入对应数据即可显示,例程传入的0x7a显示出来是数字3,数字3只有F段,E段和CP4不需要亮,那对应的二进制是01111100(0x7a),4F对应最低位,CP4对应最高位。
芯片的SEG8和SEG9引脚接在LCD屏幕的PIN19和PIN18,PIN19和PIN18控制着第五个8,那么我们给R32_LCD_RAM1 低八位写入对应数据即可显示,例程传入的0x63显示出来是数字4,数字4只有B段,C段,F段和G段需要亮,那对应的二进制是01100011(0x63),5F对应最低位,CP7对应最高位。
芯片的SEG10和SEG11引脚接在LCD屏幕的PIN17和PIN16,PIN17和PIN16控制着第六个8,那么我们给R32_LCD_RAM1 低八位左移8位写入对应数据即可显示,例程传入的0x5b显示出来是数字5,数字5只有B段,E段和CP8不需要亮,那对应的二进制是01011011(0x5b),6F对应最低位,CP8对应最高位。
芯片的SEG12和SEG13引脚接在LCD屏幕的PIN15和PIN14,PIN15和PIN14控制着第七个8,那么我们给R32_LCD_RAM1 低八位左移16位写入对应数据即可显示,例程传入的0x5f显示出来是数字6,数字6只有B段和CP9不需要亮,那对应的二进制是01011111(0x5f),7F对应最低位,CP9对应最高位。
芯片的SEG14和SEG15引脚接在LCD屏幕的PIN17和PIN18,PIN17和PIN18控制着第八个8,那么我们给R32_LCD_RAM1 低八位左移24位写入对应数据即可显示,例程传入的0x70显示出来是数字7,数字7只有A段,B段和C段需要亮,那对应的二进制是01110000(0x70),8F对应最低位,最高位给0。
芯片的SEG16引脚接在LCD屏幕的PIN20,PIN20控制着CP5和CP6,那么我们给R32_LCD_RAM2 低八位写入对应数据即可显示,例程传入的0x03显示出来一个冒号,冒号只有CP5和CP6需要亮,那对应的二进制是00000011(0x03),CP6对应最低位,CP5对应最高位。
显示8传0x7F,显示9传7B.
unsigned char const lcd[11]={0x7d, 0x60, 0x3e, 0x7a, 0x63, 0x5b, 0x5f, 0x70, 0x03, 0x7f, 0x7b, };
LCD_WriteData0( lcd[0] ); LCD_WriteData1( lcd[1] ); LCD_WriteData2( lcd[2] ); LCD_WriteData3( lcd[3] ); LCD_WriteData4( lcd[4] ); LCD_WriteData5( lcd[5] ); LCD_WriteData6( lcd[6] ); LCD_WriteData7( lcd[7] ); LCD_WriteData8( lcd[8] );
#define LCD_WriteData0( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xffffff00) | ((UINT32)d)) /* 填充SEG0和SEG1驱动数值 */
#define LCD_WriteData1( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG2和SEG3驱动数值 */
#define LCD_WriteData2( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG4和SEG5驱动数值 */
#define LCD_WriteData3( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0x00ffffff) | ((UINT32)d<<24)) /* 填充SEG6和SEG7驱动数值 */
#define LCD_WriteData4( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xffffff00) | ((UINT32)d)) /* 填充SEG8和SEG9驱动数值 */
#define LCD_WriteData5( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG10和SEG11驱动数值 */
#define LCD_WriteData6( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG12和SEG13驱动数值 */
#define LCD_WriteData7( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0x00ffffff) | ((UINT32)d<<24)) /* 填充SEG14和SEG15驱动数值 */
#define LCD_WriteData8( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xffffff00) | ((UINT32)d)) /* 填充SEG16和SEG17驱动数值 */
4.驱动LCD低功耗需添加以下代码:
#if 1 /* 配置唤醒源为 GPIO - PB0 */ GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_PU); GPIOB_ITModeCfg(GPIO_Pin_0, GPIO_ITMode_FallEdge); // 下降沿唤醒 PFIC_EnableIRQ(GPIO_B_IRQn); PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); VER = (*((PUINT32)ROM_CFG_VERISON)); if((VER&0xFF000000) == 0xFF000000) { aux_power = R16_AUX_POWER_ADJ; sys_safe_access_enable(); R16_AUX_POWER_ADJ |= RB_ULPLDO_ADJ; //睡眠前必须加此代码 sys_safe_access_disable(); } // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。 LowPower_Sleep(RB_PWR_RAM24K | RB_PWR_RAM2K | RB_XT_PRE_EN); //只保留24+2K SRAM 供电 HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流) if((VER&0xFF000000) == 0xFF000000) { sys_safe_access_enable(); R16_AUX_POWER_ADJ = aux_power; sys_safe_access_disable(); } #endif