#define CHAR_0 LCDSEG_A+LCDSEG_B+LCDSEG_C+LCDSEG_D+LCDSEG_E+LCDSEG_F
#define CHAR_1 LCDSEG_B+LCDSEG_C
#define CHAR_2 LCDSEG_A+LCDSEG_B+LCDSEG_D+LCDSEG_E+LCDSEG_G
#define CHAR_3 LCDSEG_A+LCDSEG_B+LCDSEG_C+LCDSEG_D+LCDSEG_G
#define CHAR_4 LCDSEG_B+LCDSEG_C+LCDSEG_F+LCDSEG_G
#define CHAR_5 LCDSEG_A+LCDSEG_C+LCDSEG_D+LCDSEG_F+LCDSEG_G
#define CHAR_6 LCDSEG_A+LCDSEG_C+LCDSEG_D+LCDSEG_E+LCDSEG_F+LCDSEG_G
#define CHAR_7 LCDSEG_A+LCDSEG_B+LCDSEG_C
#define CHAR_8 LCDSEG_A+LCDSEG_B+LCDSEG_C+LCDSEG_D+LCDSEG_E+LCDSEG_F+LCDSEG_G
#define CHAR_9 LCDSEG_A+LCDSEG_B+LCDSEG_C+LCDSEG_D+LCDSEG_F+LCDSEG_G
#define CHAR_A LCDSEG_A+LCDSEG_B+LCDSEG_C+LCDSEG_E+LCDSEG_F+LCDSEG_G
#define CHAR_b LCDSEG_C+LCDSEG_D+LCDSEG_E+LCDSEG_F+LCDSEG_G
#define CHAR_C LCDSEG_A+LCDSEG_D+LCDSEG_E+LCDSEG_F
#define CHAR_d LCDSEG_B+LCDSEG_C+LCDSEG_D+LCDSEG_E+LCDSEG_G
#define CHAR_E LCDSEG_A+LCDSEG_D+LCDSEG_E+LCDSEG_F+LCDSEG_G
#define CHAR_F LCDSEG_A+LCDSEG_E+LCDSEG_F+LCDSEG_G 建立MCU LCD模块映射表。 通过上面的图我们可以知道,我们选择LCD 显示模式 0 (MODE = 0)时,要在LCD屏1的位置显示数字0,需要把装有PIN5和PIN6组成的一个字节数据按高4位和低4位拆成两个字节,分别装入MCU的LCDRAM中才可以显示 ,其它位置的显示道理相同,因此我们可以做出如下的映射数组
const uint16_t u16DisTable[] = {
((CHAR_0 & 0xf0) <<4 | (CHAR_0 & 0x0f)),//0
((CHAR_1 & 0xf0) <<4 | (CHAR_1 & 0x0f)),//1
((CHAR_2 & 0xf0) <<4 | (CHAR_2 & 0x0f)),//2
((CHAR_3 & 0xf0) <<4 | (CHAR_3 & 0x0f)),//3
((CHAR_4 & 0xf0) <<4 | (CHAR_4 & 0x0f)),//4
((CHAR_5 & 0xf0) <<4 | (CHAR_5 & 0x0f)),//5
((CHAR_6 & 0xf0) <<4 | (CHAR_6 & 0x0f)),//6
((CHAR_7 & 0xf0) <<4 | (CHAR_7 & 0x0f)),//7
((CHAR_8 & 0xf0) <<4 | (CHAR_8 & 0x0f)),//8
((CHAR_9 & 0xf0) <<4 | (CHAR_9 & 0x0f)),//9
((CHAR_A & 0xf0) <<4 | (CHAR_A & 0x0f)),//A
((CHAR_b & 0xf0) <<4 | (CHAR_b & 0x0f)),//b
((CHAR_C & 0xf0) <<4 | (CHAR_C & 0x0f)),//C
((CHAR_d & 0xf0) <<4 | (CHAR_d & 0x0f)),//d
((CHAR_E & 0xf0) <<4 | (CHAR_E & 0x0f)),//E
((CHAR_F & 0xf0) <<4 | (CHAR_F & 0x0f)),//F
}; 定义数据类型。由于每个LCDRAM都是32位的的寄存器,里面装的是LCD中两个位置的数据 ,要是直接改变其中的显示数据不是很方便,我们使用共用体来定义成我们方便操作的数据类型,定义如下:
/******************************************************************************
** \brief LCDRAM
*****************************************************************************/
typedef union{
uint8_tu8_dis;
uint16_t u16_dis;
uint32_t u32_dis;
}un_Ram_Data; 我们之前做的只是数字和字母的映射,特殊点我们并没有映射,现在我们可以做下特殊点的定义如下
/******************************************************************************
** \brief LCD特殊点
*****************************************************************************/
typedef union{
uint32_t LcdSegTotle;
struct{
uint8_t LcdSeg_1P:1;
uint8_t LcdSeg_2P:1;
uint8_t LcdSeg_3P:1;
uint8_t LcdSeg_4P:1;
}stc_Lcd_SP;
}un_Lcd_SP; LCD显示。上面的工作都做完后只要写个简单的LCD显示函数就可以完成LCD的显示工作了。显示代码如下:
void App_LcdDis(uint8_t *u8LcdDisData , un_Lcd_SP *punLcdSp)
{
un_Ram_Data unRamData;
un_Lcd_SP unLcdSP;
unLcdSP = *punLcdSp;
unRamData.u16_dis = u16DisTable[*u8LcdDisData++]; //取LCD屏第一个位置显示内容
unRamData.u16_dis = u16DisTable[*u8LcdDisData++]; //取LCD屏第二个位置显示内容
unRamData.u16_dis = u16DisTable[*u8LcdDisData++]; //取LCD屏第三个位置显示内容
unRamData.u16_dis = u16DisTable[*u8LcdDisData]; //取LCD屏第四个位置显示内容
if ( unLcdSP.LcdSegTotle ) //检查是否要显示特殊点
{
if(unLcdSP.stc_Lcd_SP.LcdSeg_1P)
{
unRamData.u8_dis |= LCDPOINT1P ; //显示第一个位置的特殊点
}
if(unLcdSP.stc_Lcd_SP.LcdSeg_2P)
{
unRamData.u8_dis |= LCDPOINT2P ; //显示第二个位置的特殊点
}
if(unLcdSP.stc_Lcd_SP.LcdSeg_3P)
{
unRamData.u8_dis |= LCDPOINT3P ; //显示第三个位置的特殊点
}
if(unLcdSP.stc_Lcd_SP.LcdSeg_4P)
{
unRamData.u8_dis |= LCDPOINT4P ; //显示第四个位置的特殊点
}
}
Lcd_WriteRam(0,unRamData.u32_dis);///< 赋值寄存器LCDRAM0 调用官方的库
Lcd_WriteRam(1,unRamData.u32_dis);///< 赋值寄存器LCDRAM1
} 主程序如下:
int32_t main(void)
{
uint8_t u8LcdData = {0x00};
un_Lcd_SP unLcdSP;
Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE); ///< 使能RCL时钟
Sysctrl_SetRCLTrim(SysctrlRclFreq32768); ///< 配置内部低速时钟频率为32.768kHz
Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE); ///< 开启LCD时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);///< 开启GPIO时钟
DDL_ZERO_STRUCT(unLcdSP);
App_PortCfg(); ///< LCD端口配置
App_LcdCfg(); ///< LCD模块配置
Lcd_ClearDisp(); ///< 清屏 调用官方库清屏
u8LcdData = 9; //显示 9527
u8LcdData = 5;
u8LcdData = 2;
u8LcdData = 7;
unLcdSP.stc_Lcd_SP.LcdSeg_1P = 0;
unLcdSP.stc_Lcd_SP.LcdSeg_2P = 0;
unLcdSP.stc_Lcd_SP.LcdSeg_3P = 0;
unLcdSP.stc_Lcd_SP.LcdSeg_4P = 0;
App_LcdDis(u8LcdData , &unLcdSP);
while(1);
} 程序运行结果如下图 结尾
就我们自己来说,使用最多的屏就是1/4duty和1/3bias的LCD屏,自己在做产品的时候不同的产品使用的屏真值表会不同,我们用几分钟更改下笔段的宏定义,LCD屏直接显示成功。当然,现在我们自己家的产品在做笔段宏定义时按屏的类型做条件编译来定义,使用屏的时候只要做下屏的类型宏定义就可以直接使用,这样更方便。 欢迎讨论 LCD驱动器才5毛钱。。。。3个IO和MCU通信。而带LCD驱动的MCU价格增加不只1元。。。。。
除非体积不够,一般还是用驱动IC便宜。
页:
1
[2]