1、液晶显示模块简介
开发板上使用的LCM046 液晶显示模块是4 位多功能通用型8 段(8.8.8.8)液晶显示模块,
内含看门狗(WDT)定时器,2 种频率的蜂鸣驱动电路,内置显示RAM,可显示任意字段笔划,
3-4 线串行接口,工作电压2.4~5.2V,如图2.1 所示。
图2.1 LCM046 液晶显示模块
显示模块的引脚说明如表2.1 所示。
表2.1 显示模块引脚说明
引脚 功能 方向 说 明 引脚 功能 方向 说 明
1 /CS 输入 片选,内部上拉 2 /RD 输入 读,内部上拉
3 /WR 输入 写,内部上拉 4 DA 双向 数据,内部上拉
5 GND - 地 6 VLCD 输入 对比度调整
7 VDD 输入 电源 8 IRQ 输出 定时器
9 BZ 输出 蜂鸣器正极 10 /BZ 输入 蜂鸣器负极
显示模块的写操作时序如图2.2 所示。
图2.2 显示模块写操作时序
DA 1 0 C/D 命令代码/地址数据
/CS
/WR
·8·
写命令格式为:100 命令代码(C7-C0:8 位)0,共12 位
写数据格式为:101 地址(A5-A0:6 位)数据(D0-D3:4 位),共13 位
101 地址(A5-A0:6 位)数据(n*4 位)(n=1-8),共13-41 位
常用命令代码如表2.2 所示,地址数据如表2.3 所示。
表2.2 显示模块常用命令代码
命令代码 功 能 命令代码 功 能
0000 0000 关振荡器 0000 0001 开振荡器
0000 0010 关显示器 0000 0011 开显示器
0001 0100 定义外部晶体振荡器工作 0001 1000 定义内部RC 振荡器工作
0010 1001 模块初始化
表2.3 显示模块地址数据
地 址 数 据 数 据
A5-A0 D3 D2 D1 D0
地 址
A5-A0 D3 D2 D1 D0
000000 COL 1E 1F 1A 000001 1D 1C 1G 1B
000010 DP1 2E 2F 2A 000011 2D 2C 2G 2B
000100 DP2 3E 3F 3A 000101 3D 3C 3G 3B
000110 DP3 4E 4F 4A 000111 4D 4C 4G 4B
模块上电后软件应延时200ms以上再初始化模块,初始化模块的步骤是:
(1)写模块初始化命令 100 0010 1001
(2)定义内部RC振荡器工作 100 0001 1000
(3)开振荡器 100 0000 0001
(4)开显示器 100 0000 0011
为了实现低功耗工作,每次读写操作后应将/CS、/RD、/WR 和DA 置高电平。
2、液晶显示模块程序设计
液晶显示模块程序设计的基础是写子程序:
// LCD写子程序
// 入口参数:data-写数据,bit-数据位数
void Lcd_Write(int data, int bit)
{
int m, n;
GPIOC_BRR = 0x1000; // LCD_CS = 0
for(m=bit-1; m>=0; m--)
{
for(n=0; n<10; n++); // 延时
GPIOC_BRR = 0x0800; // LCD_WR = 0
for(n=0; n<10; n++);
if(data & (1<<m))
GPIOC_BSRR = 0x0400; // LCD_DA = 1
else
GPIOC_BRR = 0x0400; // LCD_DA = 0
·9·
for(n=0; n<10; n++);
GPIOC_BSRR = 0x0800; // LCD_WR = 1
}
GPIOC_BSRR = 0x1400; // LCD_CS = 1, LCD_DA = 1
}
LCD初始化子程序如下:
// LCD初始化
void Lcd_Init(void)
{
RCC_APB2ENA |= 0x10; // 允许GPIOC时钟
GPIOC_CRH |= 0x00055500; // PC12-10通用开漏输出
GPIOC_ODR |= 0x1C00; // PC12-10输出高电平
Lcd_Write(0x42a<<1, 12); // 模块初始化
Lcd_Write(0x418<<1, 12); // 内部振荡器
Lcd_Write(0x401<<1, 12); // 开振荡器
Lcd_Write(0x403<<1, 12); // 开显示器
}
LCD显示处理子程序如下:
// LCD显示处理
// 入口参数:*data-数据指针
void Lcd_Proc(char *data)
{
char lcd_code[16]= // 显示编码
{ // AFE.BGCD
0xeb, // 11101011 0
0x0a, // 00001010 1
0xad, // 10101101 2
0x8f, // 10001111 3
0x4e, // 01001110 4
0xc7, // 11000111 5
0xe7, // 11100111 6
0x8a, // 10001010 7
0xef, // 11101111 8
0xcf, // 11001111 9
0xee, // 11101110 A
0x67, // 01100111 B
0xe1, // 11100001 C
0x2f, // 00101111 D
0xe5, // 11100101 E
0xe4 // 11100100 F
};
·10·
Lcd_Write((5<<10)+(0<<4)+(lcd_code[data[0]]>>4)+data[1], 13);
Lcd_Write((5<<10)+(1<<4)+(lcd_code[data[0]]&0xf), 13);
Lcd_Write((5<<10)+(2<<4)+(lcd_code[data[2]]>>4)+data[3], 13);
Lcd_Write((5<<10)+(3<<4)+(lcd_code[data[2]]&0xf), 13);
Lcd_Write((5<<10)+(4<<4)+(lcd_code[data[4]]>>4)+data[5], 13);
Lcd_Write((5<<10)+(5<<4)+(lcd_code[data[4]]&0xf), 13);
Lcd_Write((5<<10)+(6<<4)+(lcd_code[data[6]]>>4)+data[7], 13);
Lcd_Write((5<<10)+(7<<4)+(lcd_code[data[6]]&0xf), 13);
}
LCD显示处理子程序的调用方法如下:
// 定义显示数据数组 COL DP1 DP2 DP3
char lcd_data[8] = {1, 0, 2, 0, 3, 0, 4, 0};
Lcd_Proc(lcd_data); // LCD显示处理
计时程序段如下:
if((++sec & 0xf) == 0xa) // 2-10进制调整
sec += 6;
if(sec == 0x60) // 1分钟时间到
{
sec = 0;
if((++min & 0xf) == 0xa) // 2-10进制调整
min += 6;
if(min == 0x60) // 1小时时间到
min = 0;
}
|