基于ARM7 STM32控制点阵液晶屏的设计
2015-11-21吕鹏栾童童
吕鹏,栾童童
(天津赛象科技股份有限公司,天津 300384)
基于ARM7 STM32控制点阵液晶屏的设计
ARM7 based design of STM32 controlled dot matrix LCD screen
吕鹏,栾童童
(天津赛象科技股份有限公司,天津 300384)
采用STM32 驱动的点阵液晶屏具有显示速度快、成本低廉、便于维护等特点;采用LM16080型号点阵屏,文中详述此屏的功能和原理,以及它的初始化和控制程序编写。叙述了静态图形和动画的显示方法。
STM32;点阵液晶屏;动画显示
使用STM32F103RBT6单片机驱动TOPWAY LM16080型号点阵屏完成控制器动画设计,形象显示出设备工作情况及运行情况而且具有人机交互界面和设备参数设置功能。
1 STM32开发平台简介
STM32开发软件Keil μVision4是由美国Keil Software公司出品,2005年由ARM公司收购。该软件具有程序下载、工程编译、在线调试等功能。开发STM32 常采用固件库和寄存器两种方法。
固件库ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库能让使用者根据官方说明进行操作,使其编程十分方便,因此得到广泛应用。另一种方法是用了寄存直接操作,就是直接对STM32内部寄存器操作,这种操作效率非常高,尤其是对时间要求苛刻的时候更能体现其优点;但是由于STM32内部资源丰富,寄存器数量十分庞大,记忆起来十分麻烦,因此,除特殊工程需要外,基本不建议采用。
2 TOPWAY LM16080点阵屏功能和原理
图1 并行接口时序关系(适配INTEL8080时序)
TOPWAY LM16080液晶屏内部采用UC1610控制器控制,其功能如下:工作电压3.3 V,显示功能为4级灰度,温度补偿,驱动玻璃熔值,对比设置,刷屏速度等。数据接口方式采用 8位并行接口,传输数据量大。图1为并行接口时序图,表1为时序关系表。
使用STM32编写驱动程序操作TOPWAY LM16080液晶屏,首先需要了解液晶屏管脚功能,参见手册。
详细操作说明及STM32连接情况:
(1)VSS 电源地;
(2)VDD 电源正极电压为+3.3 V;
表1 时序关系表
(3)并行总线IO口,连接STM32->PC0;
(4)并行总线IO口,连接STM32->PC1;
(5)并行总线IO口,连接STM32-> PC2;
(6)并行总线IO口,连接STM32-> PC3;
(7)并行总线IO口,连接STM32-> PC4;
(8)并行总线IO口,连接STM32-> PC5;
(9)并行总线IO口,连接STM32-> PC6;
(10)并行总线IO口,连接STM32-> PC7;
(11)/RD 使用并行接口时,为读信号/RD,低电平有效。连接STM32->PB10;
(12)/WR使用并行接口时,为写信号/WR,低电平有效。连接STM32->PB11;
(13)CD 通道选择信号,当CD=0时选择指令通通道,当CD=2时选择数据通通道。连接STM32->PB1;
(14)/RST 复位信号。连接STM32->PB0;
(15)/CS1 片选信号当/CS1=0时选通模块,/ CS1=1时封锁模块。连接STM32->PA7;
(16)BLA 背光连接。
3 TOPWAY LM16080初始化和控制程序编写
必须了解TOPWAY LM16080 寄存器的功能,才能正确编写驱动程序。下面是液晶屏寄存器表通过程序写入数值,正确操作液晶屏。首先需要把液晶屏进行初始化设置(对比参数、灰度值、扫描速度、显示方向),设置结束行和起始行等。
下面是部分初始化代码:
SdCmd(0x24); //温度补偿-0.05%/℃
SdCmd(0x23); //驱动玻璃容值16~21 nf
SdCmd(0x2f); //启用内部DC-DC电路8X
SdCmd(0xe9); //Bias=1/10
SdCmd(0x81);
SdCmd(ContrastLevel); // 对比度设置
SdCmd(0xaf); //开显示
SdCmd(0xD3); // 灰度差24%
SdCmd(0xa3); //行扫描速度16.1 Kips
SdCmd(0x84); //禁用部分区域显示效果功能
SdCmd(0xc6); //显示方向,IC在上方,MY=0,MX=0,LC0=0
SdCmd(0xf1);
SdCmd(0x4f); //设置显示结束行80
SdCmd(0xf2);
SdCmd(0x00); //设置显示起始行0
SdCmd(0xf3);
SdCmd(0x4f); //设置行输出范围最大80
Clear_Lcd();
delay_ms(500);
需要注意的是,初始化中的对比参数设置是保证上电后能够获得较好的显示效果,但也不是一成不变的,每个批次产品电压偏差、系统的电源波动以及使用环境的不一致,都会影响到显示效果,所以要求对比参数是可调整和可设置的。上电后执行初始化,在模块显示屏上应该能看到有一定对比的“稳定花瓶”。这是因为在初始化中没用对RAM进行清“0”,所以在屏幕上显示出来的都是ARM在电脑上的随机数。这是正常的。由此我们可以把初始化函数作为接口的调试程序,如果没出现上述现象则需重新检查电路和接口时序关系。
使用KEIL编写 STM32 程序,搭建好STM32工程后(详细搭建工程请参考网络),操作TOPWAY LM16080液晶屏其实只用到了 STM32 IO口功能,但必须要按照说明书编写。首先开启STM32 IO口时钟,由于STM32时钟结构非常复杂,这里只介绍ABP2。ABP2是外设复位寄存器控制STM32 IO口时钟,如图2所示。
首先开启时钟。本项目用到的IO口共三组:GPIOC、 GPIOB 、GPIOA(本项目采用寄存器,没有采用固件库)。
RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
RCC->APB2ENR|=1<<6; //使能 PORTE 时钟
图2 ABP2外设复位寄存器(RCC_APB2RSTR)
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
这样三组IO口时钟开启完毕。然后配置IO口输入、输出模式。 STM32 一共有8种模式:模拟输入、浮空输入、下拉输入、上拉输入、开漏输出、通用推挽输出、复用开漏输出、复用推挽。本项目采用通用推挽输出。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_ Out_PP; //推挽输出
还需要配置IO口速度。STM32一共有3种速度:2 MHz、10 MHz、50 MHz 。本项目设置为50 MHz。
GPIO_InitStructure.GPIO_Speed=GPIO_ Speed_50 MHz;//速度 50 MHz
然后初始化这组IO口就可以了。
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化 GPIOC
4 显示静态图形方法
通过使用软件制作图形库。利用copyleft by horse2000制作液晶屏图片和字模,自动生成图形数组和字库数组。通过程序调用这些数组就可以了。参见图3。
下面是显示图片主函数:
图3 公司LOGO效果图
void LOGO_BMP(uchar x,uchar y,uchar width,uchar high) //描述公司图标函数
// 坐标(x,y),x为水平方向像素列;y为垂直方向页(8点像素/页)
//width:图形水平像素点数;high:图形垂直页数;bmp[]:图形数组名
{uchar i,j,k,Dtemp;
uint m,Ddata;
// 启动窗口操作
SdCmd(0xf4);
SdCmd(x); //设置工作区起始像素列
SdCmd(0xf6);
SdCmd(x+width-1); //设置工作区结束像素列
SdCmd(0xf5);
SdCmd(y); //设置工作区起始页0
SdCmd(0xf7);
SdCmd(y+high*2-1); //设置工作区结束页
SdCmd(0x8b); // 先页地址再列地址
SdCmd(0xf9); // 窗口操作使能//设置起始地址
SdCmd(0x60|(y&0x1f)); // 设置5位页地址
SdCmd(0x00|(x&0x0f)); // 设置低4位列地址
SdCmd(0x10|(x>>4)); // 设置高4位列地址
for(i=x;i { for(j=0;j { m = i+width*j; Dtemp = LCD_LOGO[m]; Ddata = 0x0000; for(k=0;k<8;k++) { Ddata = Ddata>>2; if ((Dtemp&0x01)==0x01) { Ddata = Ddata+0xc000; } Dtemp=Dtemp>>1; } SdData(Ddata); // 写图形数据 SdData(Ddata>>8); // 写图形数据 } } SdCmd(0x88); // 先列地址再页地址 SdCmd(0xf8); // 关闭窗口操作 通过该程序就可以调用图形数组,显示提前设计好的图形。 文字图形显示由于TOPWAY LM16080型号屏不带字库芯片,需要自己设计字库。依然使用copyleft by horse2000 软件来完成此项工作,程序不再详述。 动画显示在理论上是十分简单的,一次循环加载一张图片,利用软件把画面做成帧。例如:实现一个人的跳舞动画,可利用截图软件,每100 ms生成一张图片(亦即帧),然后通过程序让这些图片按照100 ms时间逐个显示出来就变成动画了。不过这种方法在这里并不适用,因为STM32 内核最快速度只有72 MHz,而且普通IO口速度才2 MHz ,这种液晶屏RAM显存空间非常少。这种方法会造成屏幕闪烁,容易造成花屏甚至死机。 我在这里采用一种像素操作法控制像素显示。再复杂的图形都是由像素组成的,利用像素的变化直接变成想要的图形和动画,这种方法效率高,但是程序相对较复杂,不过比起直接操作图片显示可以节省大量的程序空间,合理使用芯片内部程序存储空间是重中之重。因为单片机的资源是有限的,绝对不可以超过存储空间。 下面是控制像素程序: void Draw_Dot(uchar x,uchar y) //绘制点 // 坐标(x,y),x为水平方向像素列;y为垂直方向像素行(4像素行/页) { uchar k,m; k=y/4; SdCmd(0x60|(k&0x1f)); // 设置低4位页地址 SdCmd(0x00|(x&0x0f)); // 设置低4位列地址 SdCmd(0x10|(x>>4)); // 设置高4位列地址 k=y%4; m=3; k=m<<(k*2); m=RdData(); // 空读操作 m=RdData(); // 读数据 m=m|k; k=y/4; SdCmd(0x60|(k&0x1f)); // 设置5位页地址 SdCmd(0x00|(x&0x0f)); // 设置低4位列地址 SdCmd(0x10|(x>>4)); // 设置高4位列地址 SdData(m); // 写数据 } 只需要知道液晶屏X,Y的坐标即可。图4是动画显示效果图。 利用上述方法,便可以随心所欲地做成想要的图形或文字。这种屏幕主要应用在中低端工业设备上,具有抗干扰能力强、不受外界光线干扰影响、价格低廉等特点。 气动纠偏操作面板就是采用这种液晶屏,可以形象地反映设备工作状态、物料当前位置、气缸位置、设备运行参数等。而且STM32系列单片机具有价格低、开发周期短、抗干扰能力强等优势,因此被工业仪器仪表大量使用。 (R-01) 图4 动画显示效果图 TQ330.493 1009-797X (2015) 24-0186-05 B 10.13520/j.cnki.rpte.2015.24.076 吕鹏,男,主要从事工业自动化系统的设计工作。 2015-08-185 文字显示方法
6 动画显示方法
7 结论