基于单工SPI的GUI开发*

 

 基于单工SPI的GUI开发*

李 园1+

1(广东海洋大学 软件学院 嵌入1061,湛江 524088)

The Development of GUI Base on Simplex SPI*

LI Yuan1+

1(Class Embedded 1061, Software Institute, Guang Dong Ocean University, Zhanjiang 524088, China)

+ Corresponding author: Phone: +86-13763074402, E-mail:liyuanempire@163.com, http://www.gdou.edu.cn

 

 

Abstract:   There are parallel interface and serial interface in the mainstream interface of the current LCM. Parallel interface has disadvantages such as many chip pins, crosstalk producing while the serial interface has not these problems. As one of the members of the serial interface family, SPI has merits such as high speed synchronism, few chip pins, no crosstalk producingtherefore, more and more developers would like to use it. However, the LCM with SPI is not really without any shortcoming. LCM encapsulation with COG (chip on glass) mostly transferred by simplex on the marketplace,which would bring about a very big trouble during the development. Based on the GUI developments programmes with simplex SPI and the detail analyse of GUI development platform on the simplex SPI, this dissertation aims at discussing and analysing the problems during the developing to finally put forward a scheme of increasing virtual LCD to resolve this problem.

Key words: simplex ; SPI ; GUI ; virtual LCD ; parallel interface ; serial interface

  :      当前LCM的主流接口有并口和串口。并口引脚多,产生串扰,串口则没有诸如此类的缺点。SPI作为串口家族的一员,具有高速同步、芯片管脚少和信号稳定不产生串扰等优点,越来越受到开发人员的青睐。但是,具有SPILCM并不是毫无缺点的,市场上以COG(chip on glass)方式封装的LCM大都是基于单工方式传输的,这将给开发带来了非常大的麻烦。本文主要论述基于单工SPIGUI开发方案,详细地分析了基于单工SPIGUI的开发开台,论述并分析在GUI开发过程中遇到的问题,最后提出增加虚拟LCD的方案解决这个问题。

 

关键词: 单工 ;SPI GUI ; 虚拟LCD ; 并口 ; 串口


 

 

1  引言 

人机对话的界面种类有很多比如LED、数码管、LCD等,其中后者是单片机、嵌入式系统开发时非常重要的一项技术,它通过计算机技术处理声音图像视频文字动画等信息并在这此信息间建立一定的逻辑关系,使之成为能交互地进行信息存取和输出的集成系统 LCD符合简便经济高效的原则关于GUI的通用设计已经有很多文章论述在此不再详述而基于单工SPIGUI的开发少有人提起单工的SPI具有高速同步、芯片管脚少和信号稳定不产生串扰等优点,但市场上以COG(Chip on glass)方式封装的LCM当中,提供的SPILCM控制器大都是基于单工传输,这样将给开发带来很大的麻烦。

本文提供了完整的基于SPIGUI软硬件设计方案,涵盖了基于单工SPIGUI设计方案的硬件设计和软件实现。其中在软件实现上增加了虚拟LCD的算法,尽可能少地减少MCU的运算负担,提高LCD的显示速度,提高系统运行效率,有效地弥补了单工传输能写不能读的缺陷。

2  GUI设计方案的硬件设计

2.1       LCM介绍

液晶模块是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起的组件.英文名称叫Liquid Crystal Module,简称“LCM”,本GUI开发平台使用的是北京铭正同创科技有限公司[1]MzL05-12864模组[2](如图1所示)。

1 MzL05-12864模组

2.1.1      MzL05-12864模组引脚说明

MzL05-12864模组只有7个引脚(如图2和表1所示),电路连接简单,不易产生串扰。

2 MzL05-12864模组引脚图样

 

 

 

表1模块接口引脚说明

序号

接口引脚名

说明

1

/CS1

片选(低电平有效)

2

/RES

复位脚(低电平复位)

3

A0

数据命令选择脚

4

SCK

串行时钟输入引脚

5

SDI

串行数据输入引脚

6

VDD

模组供电(推荐3.0V,实际3.3V

7

VSS

2.1.2      显示RAM区映射情况

MzL05-12864液晶显示模组的LCD上的每一个点都对应有控制器片内的显示缓存RAM中的一个位,显示屏上64×128个点分别对应着显示RAM8Page,每一个Page128Byte的空间对应。因此可知显示RAM 区中的一个Page空间对应8行的点,而该Page中的一个byte数据则对应一列(8个点)。

2 显示RAM 区与显示屏的点映射

 

LCD显示器横向坐标(从左到右)

0

1

2

3

……

……

125

126

127

LCD显示器纵向坐标(从上到下)

Page0

8bit

数据

0

1

2

……

6

7

bit0

bit0

bit0

bit0

……

……

bit0

bit0

bit0

bit1

bit1

bit1

bit1

……

……

bit1

bit1

bit1

bit2

bit2

bit2

bit2

……

……

bit2

bit2

bit2

……

……

……

……

……

……

……

……

……

bit6

bit6

bit6

bit6

……

……

bit6

bit6

bit6

bit7

bit7

bit7

bit7

……

……

bit7

bit7

bit7

Page1

8bit

数据

8

9

……

15

bit0

bit0

bit0

bit0

……

……

bit0

bit0

bit0

bit1

bit1

bit1

bit1

……

……

bit1

bit1

bit1

……

……

……

……

……

……

……

……

……

bit7

bit7

bit7

bit7

……

……

bit7

bit7

bit7

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

……

Page7

8bit

数据

56

……

59

60

61

62

63

bit0

bit0

bit0

bit0

……

……

bit0

bit0

bit0

……

……

……

……

……

……

……

……

……

bit3

bit3

bit3

bit3

……

……

bit3

bit3

bit3

bit4

bit4

bit4

bit4

……

……

bit4

bit4

bit4

bit5

bit5

bit5

bit5

……

……

bit5

bit5

bit5

bit6

bit6

bit6

bit6

……

……

bit6

bit6

bit6

bit7

bit7

bit7

bit7

……

……

bit7

bit7

bit7

2.2    MCU分析

MCU(Micro Controller Unit)中文名称为微控制单元,是指随着大规模集成电路的出现及其发展,将计算机的CPURAMROM、定时数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。GUI开发平台使用的MCUNXP Semiconductor(恩智浦半导体) [3]LPC2148[4] [5] [6](如图3所示)。

3 LPC2148 MCU

2.2.1      LPC2148 SPI引脚描述

表3 LPC2148SPI引脚

引脚名称

符号

类型

功能描述

P0.4

SCK0

I/O

串行时钟,主机输出或从机输入的时钟

P0.5

MISO0

I/O

主机输入/从机输出,从机到主机的数据传输

P0.6

MOSI0

I/O

主机输出/从机输入,主机到从机的数据传输

P0.7

SSEL0

I/O

从机选择,选择SPI接口用作从机

2.3    MCULCM连接

2.3.1      软件连接分析

以下代码定义了MCULCM连接。

#define LCD_CS (1<<8);

#define LCD_A0 (1<<10);

#define LCD_CLK (1<<4);

#define LCD_SDI (1<<6);

#define LCD_RES (1<<9);

2.3.2      硬件连接分析

以下是MCULCM连接的电路图

4 MCULCM电路图

2.4       综合分析

从以上各小节的分析可知,虽然LPC2148SPI具备全双工传输的能力,但是MzL05-12864模组只提供单工传输,所以整个开发开台MCULCM之间数据的传输只能使用单工方式。

对于单工方式,开发相对于双工方式简单,同时当前市场上以COG方式封装的,并使用SPI接口的LCM当中,控制器基本上都不提供读LCD的功能,这就使得MCU无法从LCM中读取出RAM中的数据,而在GUI开发过程中,RAM的读取是至关重要的。

当在MCU运行GUI.line_draw(1,1,50,1); GUI.line_draw(1,4,50,4);这两行代码时,LCD上有且只有显示一条直线(即坐标为1,4,50,4的直线),如图5所示。

5 LCD只显示一条直线

线(1,1,50,1)与线(1,4,50,4)中的各个点都在同一个Page里,LCM的设计使得每次写入RAM必须写进一个Page的内容。因为无法对RAM数据的读取,所以当线(1,1,50,1)绘制完毕后,在画点(1,4)时,之前画好的线(1,1,50,1)中的点(1,1)就会被清除,如此下去,线 (1,1,50,1)在绘制完线(1,4,50,4)后就被清除了。

由此可见,对于RAM数据的读取是非常有必要的。可是,LCM并无法实现这个功能。因此,只能从MCU这里着手了,即在GUI软件的设计结构上增加虚拟LCD,这个方法可以有效地解决这个问题。具体方法将在下面章节加以论述。

3  GUI设计方案的软件实现

3.1       总体设计

GUI驱动程序使用的开发工具是ADS(ARM Developer Suite),开发语言为C++

设计中采用层次清晰的结构来组织系统的运行。主要分为四层,驱动程序架构如图6所示。首层为应用层,以窗口管理器和应用程序为主体。第二次为重要的绘图层,系统中的所有绘图功能几乎都集成在这一层当中。第三层为驱动层,包括LCD配置、LCD驱动和SPI驱动,它直接与底层打交道,屏蔽底层的细节,为上层提供与硬件无关的接口。最后一层为硬件层。

图6 驱动程序架构

 

3.2       SPI类的设计

SPI类主要有两个方法,对SPI进行初始化及通过SPI写数据或指令到LCM

//===========================================================

// 类 : MSPI

// 描述: SPI

// 函数: void MSPI_init(void)                                    SPI接口进行初始化

//         uint8 MSPI_SendData(uint8 data)         通过SPI传输数据

// 备注:

// 版本: 2008.7.10 V1.0

//===========================================================

class MSPI

{

         //===========================================================

         // 函数: void MSPI_init(void)

         // 描述: SPI接口进行初始化

         // 参数:

         // 返回:

         // 备注:

         // 版本: 2008.7.3 V1.0

         //===========================================================

         public:

         void MSPI_init(void)

         {

                   //初始化LPC2148SPI接口

                   PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;

                   IO0DIR|=7<<8;

                   SPCCR=0x52;

                   SPCR=(0<<3)|(1<<4)|(1<<5)|(0<<6)|(0<<7);

         }

          //===========================================================

         // 函数: uint8 MSPI_SendData(uint8 data)

         // 描述: 写一个字节的数据至LCM中的缓冲RAM当中

         // 参数: data 写入的数据

         // 返回:

         // 备注:

         // 版本: 2008.7.3 V1.0

         //===========================================================

         public:

         uint8 MSPI_SendData(uint8 data)

         {

                   SPI_SPDR=data;

                   while(0==(SPI_SPSR&0x80));

                   return(SPI_SPDR);

         }

};

3.3           虚拟LCD的设计

3.3.1      虚拟LCD数组的定义

虚拟LCD数组的定义分为两个,一个是其点阵数组,一个是其页数组,点阵数组每个元素是用来表示LCD上各个栅格的颜色,在对LCMRAM写入时,是以页为单位的,所以加上页数组是必要的。

uint8 bitmap[LCD_X_MAX][LCD_X_MAX];                                   //虚拟LCD点阵数组

uint8 page[LCD_X_MAX][LCD_Y_MAX/8];                                    //虚拟LCD点阵按页数组

3.3.2      虚拟LCD初始化

使用虚拟LCD前必须对其两个数组进行初始化,即对两个数组的每个元素作置0操作。

//========================================================================

// 函数: void bitmap_init(void)

// 描述: 虚拟LCD初始化

// 参数:

// 返回:

// 备注:

// 版本: 2008.7.10 V1.0

//========================================================================

public:

void bitmap_init(void)

{

          uint8 i,j;

          //初始化点阵数组

          for(i=0;i<128;i++)

                    for(j=0;j<64;j++)

                             bitmap[i][j]=0;

          //初始化页数组

          for(i=0;i<128;i++)

                    for(j=0;j<8;j++)

                             page[i][j]=0;

}

3.3.3      虚拟LCD的写入

下面以绘点为例,展示对虚拟LCD的写入过程。

//========================================================================

// 函数: void point_draw (uint8 x,uint8 y,uint8 Color)

// 描述: 根据参数x,y画点

// 参数: x为橫坐标 y为纵坐标 Color为颜色

// 返回:

// 备注:

// 版本: 2008.7.4 V1.0

//         2008.7.10 V1.01 改原来直接写入方式为先将数据写入虚拟的LCD

//========================================================================

public:

void point_draw (uint8 x,uint8 y,uint8 Color)

{

          bitmap[x][y]=Color;

}

绘点过程很简单,只需要短短的一行代码,如果改为直接写入LCMRAM,过程较为繁琐,而且要考虑到硬件层面上的东西,加上虚拟LCD以后,可以化繁琐为简单。

3.3.4      LCMRAM的写入

在对虚拟LCD的写入结束后,下一个步骤就是将数据和指令写入LCMRAM。在写入之前,有一个问题需要解决,那就是每次对RAM的写入是以Page为单位的,所以必须对点阵数组的元素进行处理,写入到页数组去,最后才写入RAM

//========================================================================

// 函数: void bmp_draw(void)

// 描述: 将虚拟LCD写入LCD 方向为从上到下 从左到右

// 参数:

// 返回:

// 备注:

// 版本: 2008.7.10 V1.0

//========================================================================

public:

void bmp_draw(void)

{

          uint8 x,y,z;

          //处理点阵数组的元素,写入到页数组

          for(x=0;x<128;x++)

          {

                    for(y=0;y<8;y++)

                    {

                             for(z=0;z<8;z++)                                                              

                             {

                                      page[x][y]+=(bitmap[x][z+8*y]<<z);

                             }      

                             if(page[x][y]!=0)

                             {

                                      LCD_RegWrite(y+0xb0);                                           //设置页面

                                      LCD_RegWrite(((x&0xf0) >> 4)|0x10);            //设置初始地址

                                     LCD_RegWrite(x&0x0f);                                            //设置列

                                      LCD_DataWrite(page[x][y]);                                     //设置页面内的行

                             }

                    }

          }

         //对页数组再次进行初始化

          for(x=0;x<128;x++)

                    for(y=0;y<8;y++)

                             page[x][y]=0;

}

         在每次对RAM写入结束后,必须再对页数组进行一次初始化。

在多次写入RAM时,bmp_draw将被多次调用。而每次调用,必然对点阵数组的元素多次叠加,这样将造成重复,造成了页数组数据错误。

4  结束语

本文主要论述基于单工SPIGUI开发,详细地分析了基于单工SPIGUI的开发开台,论述并分析在开发过程中遇到的问题,最后提出解决这个问题的方案。

对于本人设计的基于单工SPIGUI设计方案,本人总结了以下优缺点。

优点:

1.   有效地解决了基于SPIGUI开发平台不能读的问题。

2.   降低GUI开发的难度,使开发更为简单。

3.   可以协调好MCULCM驱动器之间的速度差,提高MCU的使用率。

4.   适应性强,同样适合并行接口的GUI开发平台。

5.   可移植性强,可以移植到其它不同的MCU

缺点:

1.    RAM空间消耗比直接写入较大。

2.    RAM空间浪费严重,LCD上还有很多栅格没有填充。

3.    在点阵数组向页数组转换时,时间花费比较多

         本人曾想过用压缩数组算法或者单向链表算法尽量去避免产生如上缺点,但是这些算法在遇到重复点时将会变得相对复杂,而且牵涉到排序算法,这将增加了MCU的负担。所以没有采用算法去解决这个问题。

         同时,该MCU目前的RAM空间足以应付GUI的开发,所以在时间和空间上,本人选择增加空间消耗,节省时间作为两者之间的平衡点。

 

致谢  至此,本人向邓锐老师致以诚挚的谢意,感谢老师一直以来的教导以及为本人提供了实验的条件和环境。同时,感谢北京铭正同创科技有限公司张新强先生对本人技术上的支持。

References:

[1].    http://www.mzdesign.com.cn/

[2].    http://www.mzdesign.com.cn/productshow.asp?id=1066

[3].    http://www.cn.nxp.com/ ,http://www.nxp.com/

[4].    http://www.zlgmcu.com/philips/arm/lpc2142.asp

[5].    周立功 张华等. 深入浅出ARM7――LPC213x/214x(上册) [M]. 北京:北京航空航天大学出版社,2005.6

[6].    周立功 张华等. 深入浅出ARM7――LPC213x/214x(下册) [M]. 北京:北京航空航天大学出版社,2005.6

 

                  

               

 李园 (1986) 广东海洋大学,软件学院,嵌入1061,研究方向为嵌入式的系统开发

 

 

以上文章属于原创,转载请注明来源.

 

 

 

           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值