跳到主要内容

带有I2C接口的AN-CM-256静态LCD驱动程序

内容

术语和定义

交流交流电
ASIC专用集成电路
ASM异步状态机
CPLD复杂可编程逻辑器件
直流直流电
ICs集成电路
液晶显示器液晶显示器

参考文献

有关文件及软件,请浏览:

//www.xmece.com/configurable-mixed-signal

下载我们的免费GreenPAK软件设计师(1]打开.gp文件[2],并查看所提出的电路设计。使用GreenPAK开发工具(3.]在几分钟内将设计冻结到您自己的定制IC中。yabo国际娱乐对话框半导体提供完整的应用程序笔记库[4],包括设计实例,以及对Dialog IC的功能和模块的解释。

  1. GreenPak Designer软件,《软件下载及用户指南》,Dialog Semiconductoryabo国际娱乐
  2. 带有I2C接口的AN-CM-256静态LCD驱动程序GreenPAK设计文件,Dialog半导yabo国际娱乐体
  3. GreenPAK开发工具GreenPAK开发工具网页,对话半导体yabo国际娱乐
  4. GreenPAK应用笔记GreenPAK应用笔记网页,Dialog半导体yabo国际娱乐
  5. 应用笔记AN-001 - LCD技术的基础知识,日立
  6. 应用笔记AN-005 -显示模式,日立
  7. AN-1090 Simple I2C IO controller with SLG46531V, Dialog Semiconductyabo国际娱乐or

介绍

由于其良好的视觉性质,低成本和低功耗,液晶显示器(LCD)广泛用于商业和工业应用。亚博国际官网平台网址这些属性使LCD成为电池供电设备的标准解决方案,如便携式仪器,计算器,手表,无线电等。

然而,为了适当地控制LCD显示的内容,LCD的电子驱动器必须产生适当的电压波形到LCD引脚。波形应该是交流(交流电)的性质,因为直流(直流电)电压将永久性地损坏设备。适当的驱动器将这些信号以最小的功耗发送到LCD。

有两种类型的液晶显示器,静态的,只有一个背板和一个引脚用于单独的段控制,和复用的,有多个背板和多个段连接的每个引脚。

本应用笔记将介绍一种基于SLG46537V的静态液晶驱动程序的设计GreenPAK™设备。设计的LCD驱动器将使用电源的几个电流微量电流驱动最多15个LCD的段,并提供I2C接口进行控制。

在以下部分中将显示:

  • lcd的基本知识;
  • 的SLG46537VGreenPAKLCD驱动器详细设计;
  • 如何驱动一个7段,4位静态LCD与两个GreenPAK设备;

液晶显示器的基础知识

液晶显示器(LCD)是一种不发光的技术,它只控制外部光源通过的方式。这种外部光源可以是反射型的环境光,也可以是透射型的背光led或灯。

液晶显示器由两块玻璃板(上和下)构成,在它们之间有一薄层液晶(LC)和两个光偏振器[5] [6].的polarizer is a light filter for the light electromagnetic field. Only the light components in the right electromagnetic field direction pass through the polarizer, while the other components are blocked. The liquid crystal is an organic material that rotates the electromagnetic field of the light 90 degrees or more. However, when an electrical field is applied to the LC it does not rotate the light anymore. With the addition of transparent electrodes in the upper and bottom display glass, its possible to control when the light passes through, and when not, with an external source of the electrical field.图1下面说明这种操作控制。在图1当没有电场时,显示器是暗的。这是因为两个偏振镜都在相同方向过滤光。如果偏振器是正交的,那么当电场存在时显示将是暗的。这是反射显示最常见的情况。

图1:LCD的工作原理(来源[5]).

控制LCD的最小电场或电压被称为ON阈值。LC只受电压的影响,在LC材料中几乎没有电流。液晶显示器的电极形成一个小电容,这是驱动器的唯一负载。这就是为什么液晶显示器是显示视觉信息的低功耗设备。

但是,重要的是要注意,LCD无法使用直流(DC)电压源太长。直流电压的应用将导致LC材料中的化学反应,永久损坏它[5].解决方案是在液晶屏电极上施加交流电压。

在静态液晶中,一个背板电极被放置在一个玻璃中,单个液晶的片段或像素被放置在另一个玻璃中。这是一种最简单的液晶显示器类型和一个最好的对比度。然而,这种类型的显示通常需要太多的引脚来控制每个单独的片段。

通常,驱动控制器为背板提供方波时钟信号,并为前平面的各段提供时钟信号。当背板时钟与段时钟同相时,两个平面之间的均方根电压为零,段是透明的。否则,如果RMS电压高于LCD ON阈值,则段变暗。底板、通断段波形如图所示图2。如图所示,ON段与背板信号相异。关闭段与背板信号同相。应用电压可以在3到5伏之间的低成本,低功率显示。

用于LCD的背板和段时钟信号通常是在30至100赫兹的范围内,最小频率,以避免LCD上的视觉闪烁效应。更高的频率,避免降低整个系统的功耗。LCD和司机组成的系统将消耗小的电流,在微安的顺序。这使得它们非常适用于低功率和电池供电的应用源。亚博国际官网平台网址

图2:静态LCD驱动器的控制信号

在下面几节中,设计一个液晶静态驱动与GreenPAK详细介绍了可以产生背板时钟信号和用于商业LCD的各个段时钟信号的装置。

GreenPak设计基本框图

一个框图来说明GreenPAK设计见图3。该设计的基本模块是I2C接口、输出段驱动器、内部振荡器和背板时钟源选择器。

图3:GreenPAK设计基本框图

I2C接口块控制每个单独的段输出和LCD的背板时钟源。I2C接口块是段输出控制的唯一系统输入。

当内部区段控制线被设置(高电平)的各LCD段是深色不透明。当内部段控制线被复位(低电平)的各LCD段是透明的。

每个内部段控制线连接到一个输出驱动器。输出段驱动块将为透明段生成与背板时钟相关的同相时钟信号。对于暗段,该信号与背板时钟的关系不相位。

背板时钟源也选择了I2C接口。当选择内部背板时钟源时,打开内部振荡器。内部振荡器将产生48Hz的时钟频率。该信号将被输出段驱动块使用,并被寻址到背板时钟输出引脚(GreenPAK销20)。

当选择外部背板时钟源时,关闭内部振荡器。输出段驱动参考是外部背板时钟输入(GreenPAK在这种情况下,背板时钟输出引脚可以用作一个额外的段控制线,段OUT15。

不止一个GreenPAK设备可用于同一I2C线路。要做到这一点,每个设备必须用不同的I2C地址编程。这样就有可能扩大液晶驱动段的数量。其中一个设备配置为生成背板时钟源,驱动14个分段,其他设备配置为使用外部背板时钟源。每增加一台设备就可以以这种方式驱动15个分段。它可以连接到16个设备在同一I2C线,然后是可能控制多达239段LCD。

在本应用笔记中,这个想法被用来控制一个LCD的29段与2个GreenPAK设备。设备引脚功能概述在表1

表1:LCD驱动设计的Pinout描述
别针
设计功能
1
电力供应
2
背板时钟输入
3.
段输出1 (SEG_OUT_1)
4
段输出2(SEG_OUT_2)
5
段输出3 (SEG_OUT_3)
6
段输出4 (SEG_OUT_4)
7
段输出5 (SEG_OUT_5)
8
sci
9
SDA
10
段输出6(SEG_OUT_6)
11
地面
12
段输出如图7(SEG_OUT_7)
13
段输出8(SEG_OUT_8)
14
段输出9(SEG_OUT_9)
15
段输出10 (SEG_OUT_10)
16
段输出11 (SEG_OUT_11)
17
段输出12 (SEG_OUT_12)
18
段输出13 (SEG_OUT_13)
19
段输出14 (SEG_OUT_14)
20.
背板时钟输出或段输出15(SEG_OUT_15)

设计电流消耗

在这个设计中一个重要的关注点是当前的消耗,它应该尽可能的低。的GreenPAK3.3 V供电时,估计静态电流为0.75µA; 5v供电时,估计静态电流为1.12µA。3.3 V和5v供电时,内部振荡器的电流消耗分别为7.6µA和8.68µA。由于这种设计在低时钟频率下工作,因此预计开关损耗不会显著增加电流消耗。当内部振荡器打开时,估计的最大消耗电流小于15µA,当内部振荡器关闭时,估计的最大消耗电流小于10µA。两种情况下所消耗的测量电流见第1710 -节测试结果

GreenPAK装置示意图

设计于GreenPAK软件见图4。本原理图将以基本模块图作为参考来描述。

图4:GreenPAK设计原理图的顶视图

I2C接口

I2C接口块作为设备运行控制的主控块。块连接和配置属性的详细视图显示在图5

图5:关闭视图到I2C接口块

该块连接到引脚8和引脚9,分别是I2C SCL和SDA引脚。在设备内部,I2C块提供8个虚拟输入。每个虚拟输入的初始值显示在“属性”窗口中(参见图5).从OUT0到OUT6的虚拟输入被用作段控制线。这些控制线对应于段输出1到段输出7,并连接到段输出驱动器。虚拟输入OUT7用作背板时钟源选择线控制,网名为BCKP_SOURCE。这个网将被设计中的其他区块使用。I2C控制代码为项目中的每个IC配置了不同的值。

在异步状态机(ASM)输出中还有8个内部段控制线可用,如下面的图6所示。段输出第8行(SEG_OUT_8在属性窗口)到段输出第15行(SEG_OUT_15)由状态0的ASM输出控制。ASM块中没有任何状态转换,它始终处于状态0。ASM的输出连接到分段输出驱动器。

段输出驱动器将产生设备的输出信号。

图6:ASM输出用作内部段控制

输出部分司机

输出段驱动程序本质上是一个Lookup表(LUT),配置为XOR逻辑端口。对于每个输出段,它必须是一个XOR端口,连接到段控制线和背板时钟(BCKP_CLOCK)。异或端口负责产生同相和异相信号到输出段。当段控制线处于高电平时,异或端口输出将使背板时钟信号反相,并产生一个同相信号到段引脚。LCD背板和LCD段之间的电压差,在这种情况下,将LCD段设置为暗段。当段控制线处于低电平时,异或端口输出将跟随背板时钟信号,然后产生同相信号到段引脚。因为在这种情况下液晶背板和线段之间没有施加电压,线段对光线是透明的。

内部振荡器和背板时钟源控制

当I2C接口的信号BCKP_CLOCK设置为高电平时,使用内部振荡器。中显示了时钟源控制图的近视图图7下面。

图7:背板时钟源选择和振荡器控制

振荡器配置为25khz RC频率,最高输出除数可在振荡器OUT0(8/64)。在属性窗口中可以看到整个配置图7。这样,内部振荡器将产生一个48hz的时钟频率。

只有当BCKP_SOURCE信号和POR信号都处于高电平时,振荡器才有效。这个控制是通过将这两个信号连接到4-L1 LUT的NAND端口来完成的。NAND的输出然后连接到振荡器的电源下降控制引脚的输入。

Signal BCKP_SOURCE控制MUX内置3-L10 LUT。当BCKP_SOURCE信号处于低电平时,背板时钟源来自PIN2。当此信号处于高电平时,背板时钟源来自内部振荡器。

背板时钟输出或段15输出引脚控制

销20在此设计中具有双重功能,这取决于所选择的背板时钟源上。这个销的操作被控制与一种4输入LUT,如图图8。使用4位LUT,可以将异或端口的操作与输出MUX相关联。当BCKP_SOURCE信号处于高电平时,LUT输出将跟随内部振荡器时钟。然后引脚20作为一个背板时钟输出。当BCKP_SOURCE信号处于低电平时,LUT输出将是来自ASM输出的SEG_OUT_15与背板时钟信号之间的异或操作。执行此操作的4位LUT配置如下所示图8

图8:PIN 20操作控制

液晶系统原型

的用法GreenPAK设计解决方案,一个LCD系统原型组装在一个面包板上。对于原型,一个7段,4位静态LCD是由两个驱动GreenPAKDIP板上的设备。一个设备(IC1)使用内部振荡器驱动LCD背板,另一个设备(IC2)使用这个信号作为背板输入参考。这两种芯片都是在最小开发板上通过STM32F103C8T6单片机(MCU)的I2C接口进行控制的。

图9显示了两者之间的连接示意图GreenPAK集成电路,液晶显示器和MCU板。在示意图中,GreenPAK设备与U1(IC1)参考驱动LCD数字一和二(LCD左侧)。的GreenPAK设备U2 (IC2)参考驱动器LCD数字3和4,加上COL段(LCD右侧)。两个设备的电源都来自微控制器开发板中的调节器。两个可拆卸的跳线之间的电源和每个VDD引脚GreenPAK增加了万用表电流测量装置。

已显示组装原型的图片图10

图9:系统原型的原理图
图10:系统原型的图片。IC1是左侧和IC2为右侧

LCD控制I2C命令

这两个GreenPAK除控制字节值外,面包板上的设备均采用相同的设计进行编程。IC1的控制字节为0 (I2C地址0x00), I2C的控制字节为1 (I2C地址0x10)。下表总结了显示段和设备驱动程序之间的连接。

表2:段和设备驱动程序
别针
IO号码
设计功能
(U1)显示连接
(U2)显示连接
1
VDD
2
0
背板时钟输入
com
3.
1
段输出1
1克
3 f
4
2
段输出2
1 f
3
5
3.
段输出3
1
3 b
6
4
段输出4
1 b
4 g
7
5
段输出5
2 g
4 f
8
6
sci
9
7
SDA
10
8
段输出6
2 f
4
11
接地
12
9
段输出7
2
4 b
13
10
段输出8
2 b
4摄氏度
14
11
段输出9
2摄氏度
4 d
15
12
段输出10
二维
4 e
16
13
段输出11
2 e
3 c
17
14
段输出12
1 c
3 d
18
15
段输出13
1 d
3 e
19
16
段输出14
1 e
col
20.
17
背板时钟输出或段输出
com
3 g

以这种方式选择连接是为了创建更清晰的原理图,并简化接线板连接的组装。

段输出的控制是通过I2C写命令到I2C虚拟输入和ASM输出寄存器来完成的。如应用说明AN-1090 Simple I2C IO Controllers with SLG46531V [7],I2C Write命令结构如下:

  • 开始;
  • 控制字节(R / W位为0);
  • 字地址;
  • 数据;
  • 停止。

所有I2C写命令都被发送到Word Address 0xF4 (I2C Virtual Inputs)和0xD0 (ASM Output for state 0)。写入IC1和控制LCD数字1和2的命令汇总在表3.。在命令序列表示法中,左括号“[”表示开始信号,右括号“]”表示停止信号。

表3:IC1的I2C命令序列描述
I2C写命令
描述
[0x00,0xf4,byte0]
分配的状态值,以区段1至7它配置背板振荡器(最高有效位,MSB)太。在IC1的MSB总是设置。以这种方式,在IC1被配置为源背板时钟信号。yyte0值如下所述。
[0x00时,0xD0,字节1]
将状态值赋给段8到15。Byte1值描述如下。

两个字节以上LCD数字1和数字2一起的控制段。这里,该方法是在软件中使用的单个查找表(LUT),用于每个数字,考虑到两个字节的段。从查找表中的字节值应该是混合使用按位或运算,然后发送给IC。的表4.显示应在每个显示数字中写入的每个数值的byte0和byte1值。

表4:查找表以写数字和字母在LCD数字1和2
数字1
数字2
数字/字母
Byte0
Byte1
Byte0
Byte1
为0x8E
0x70
0 xe0
0 x0f
0
0 x88
0 x10
0 x80
0 x03
1
0x8D
0x60.
0 xd0
0 x0d
2
0x8D
的0x30
0 xd0
0 x07
3.
0x8B
0 x10
0 xb0
0 x03
4
0 x87
的0x30
0 xf0
0 x06
5
0 x87
0x70
0 xf0
0 x0e
6
0x8C
0 x10
0 xc0
0 x03
7
值为0x8F
0x70
0 xf0
0 x0f
8
值为0x8F
0 x10
0 xf0
0 x03
9
值为0x8F
为0x50
0 xf0
0 x0b
一个
0 x83
0x70
0 xb0
0 x0e
B
0 x86
0x60.
0 xe0
0 x0c
C
0 x89
0x70
0x90
0 x0f
D
0 x87
0x60.
0 xf0
0 x0c
E
0 x87
0x40.
0 xf0
(
F

例如,要在数字1中写入数字3,在数字2中写入数字4,字节0是0xBD (0x8D与0xB0按位或),字节1是0x33 (0x30与0x03按位或)。

写入IC2和控制数字3和4的命令描述在表5.

表5:IC2的I2C命令序列描述
I2C写命令
描述
[0 x10, 0 xf4, Byte0]
将状态值分配给段1到7.它配置背板振荡器(最高有效位,MSB)。在IC2中,MSB始终重置。以这种方式,IC2被配置为使用背板时钟的外部源。该配置使得能够输出到该IC(段输出15)。yyte0值如下所述。
[0x10的,0xD0,字节1]
将状态值赋给段8到15。Byte1值描述如下。

数字3和4的控制逻辑类似于数字1和2的控制。表6.显示了这两位数字的LUT。

表6:查找表,用于在LCD数字3和4上写入数字和字母
数字3
数字4
数字/字母
Byte0
Byte1
Byte0
Byte1
0 x07
0x38
0x70
0 x07
0
0 x04
0x8中
0x40.
0 x01
1
0 x06
0 xb0
0x68
0 x06
2
0 x06
0 x98
0x68
0 x03
3.
0 x05
0 x88
将0x58
0 x01
4
0 x03
0 x98
0x38
0 x03
5
0 x03
0 xb8
0x38
0 x07
6
0 x06
0x8中
0x60.
0 x01
7
0 x07
0 xb8
0x78
0 x07
8
0 x07
0 x88
0x78
0 x01
9
0 x07
0 xa8
0x78
0 x05
一个
0 x01
0 xb8
0 x18
0 x07
B
0 x03
的0x30
的0x30
0 x06
C
0 x04
0 xb8
0x48
0 x07
D
0 x03
0 xb0
0x38
0 x06
E
0 x03
0 xa0
0x38
0 x04
F

在IC2的区别是COL段。这个段是由字节1来控制。要设置这部分黑暗,字节1之间的按位或运算和0x40的应该做的值。

I2C命令用于LCD测试

对于LCD测试,在MCU板上以C语言开发固件。此固件将向面包板上的ICS发送一系列命令。此固件的源代码在附录部分中。整个解决方案是使用与STM32 9.0.1 IDE的与地点真实的溶液开发。

显示的命令序列和相应的值汇总为表7.下面。

表7:LCD原型显示序列
显示文本(所有数字和COL:)
I2C写命令顺序(4条)。
88:88
[0x00, 0xF4, 0xFF], [0x00, 0xD0, 0x7F], [0x10, 0xF4, 0xFF], [0x10, 0xD0, 0xFF]
0000
[0x00, 0xF4, 0xEE], [0x00, 0xD0, 0x7F], [0x10, 0xF4, 0x77], [0x10, 0xD0, 0x3F]
1234
[0x00时,0xF4中,0xD8],[0×00,0xD0,0x1D],[0×10,0xF4中,0x5E],[0×10,0xD0,0x99]
8765
[0x00时,0xF4中,0xCF],[0×00,0xD0(0x73)的],[0×10,0xF4中,0x3B],[0×10,0xD0,为0xBB]
EB9D
[0x00, 0xF4, 0xB7], [0x00, 0xD0, 0x6E], [0x10, 0xF4, 0x4F], [0x10, 0xD0, 0x8F]
12:00
[0x00时,0xF4中,0xD8],[0×00,0xD0,0x1D],[0×10,0xF4中,0x77],[0×10,0xD0,0x7F的]
1200
[0x00, 0xF4, 0xD8], [0x00, 0xD0, 0x1D], [0x10, 0xF4, 0x77], [0x10, 0xD0, 0x3F]

测试结果

原型测试包括验证一个MCU命令后的显示值和在运行过程中测量每个IC的电流接收器。

每个命令值的LCD图片显示在表8.下面。

表8:MCU命令到GreenPAK设备后的LCD显示图片
预计显示文本。
显示图片
88:88
0000
1234
8765
EB9D
12:00
1200

每个设备的电流汇用万用表测量,其最低电流范围为200µa。图中显示了每个设备在启动和正常运行时的测量电流表9.下面。

表9:每个GreenPAK设备的当前测量值
图片
测量IC(电源始终在3.3 v)
启动时IC1电流(内部振荡器关闭,没有任何外部背板时钟源)
IC1电流正常运行(内部振荡器打开并为LCD显示提供背板信号)。
IC1电流正常运行(内部振荡器打开并为LCD显示提供背板信号)。
正常操作中IC2电流(内部振荡器关闭,背板时钟信号来自IC1)。

结论和结果探讨

设计了一种低功耗的静态液晶显示器驱动器GreenPAK提供了设备。这种设计清楚地显示了最大的特色之一GreenPAK器件:低静态电流。因为GreenPAK设备是一种基于硬件的解决方案,它可以在低频操作下工作,在这种情况下,48hz。基于单片机的解决方案需要更高的工作频率,即使是周期性的短时间,也会消耗更多的功率。而且,比较GreenPAK与CPLD(复杂可编程逻辑器件)装置中,可以清楚地看到,通常为CPLD具有静态电流高于20μA。

有趣的是,这种设计可以很容易地进行修改,以更好地适应特定项目的需求。一个很好的例子是段控制pinout。它们可以很容易地改变,以简化印刷电路板,同时软件开发。与现成的专用集成电路(ASIC)相比,这是一个有趣的特性。通常,asic的设计是为了适应广泛的应用,应该在操作之前编写一个初始的软件例程来正确配置IC。亚博国际官网平台网址一个可配置的设备可以被设计成在通电后开始准备使用。通过这种方式,可以减少IC初始配置的软件开发时间。

附录A
.源代码

/*

******************************************************************************

文件:stm32f1xx_it.c

信息:主要中断服务程序。

******************************************************************************

* /

uint32_t TickCount = 0;

/**

**===========================================================================

**

**抽象:这个函数处理SysTick Handler.**

**===========================================================================

* /

空白SysTick_Handler(空白)

TickCount + +;

/*

******************************************************************************

文件:c

演示代码的静态LCD驱动与SLG46537V

******************************************************************************

* /

/ *包括* /

#include

# include“stm32f10x.h”

# include“stm32f10x_conf.h”

# include“stm32f1xx_it.h”

/ /基本定义

#定义ON_BOARD_LED_PIN GPIO_Pin_13

#定义ON_BOARD_LED_PORT GPIOC

#define on_board_i2c_port.GPIOB

#定义SDA_I2C_PINGPIO_Pin_7

#定义SCL_I2C_PINGPIO_Pin_6

#define led_turn_on()GPIO_ResetBits (ON_BOARD_LED_PORT ON_BOARD_LED_PIN)

#定义LED_TURN_OFF ()GPIO_SetBits (ON_BOARD_LED_PORT ON_BOARD_LED_PIN)

#定义LCD_CONTROL_I2CI2C1

#定义I2C_TIMEOUT_VALUE0 xff000000

#定义真正的1

的#define FALSE0

#定义BCKP_SOURCE_CTRL_BIT_MASK0 x80//背板源控制位掩码

#定义CONTROL_BYTE_IC10 x00//设备IC的I2C地址1

#定义CONTROL_BYTE_IC20 x10//设备IC 2的I2C地址2

#定义BYTE_0_ADDRESS0 xf4//字节0配置字地址

#define byte_1_address.0 xd0//字节1个配置字地址

/*显示要写入的测试序列命令列表*/

const uint8_t TestDisplayCMDList[] =

{0xEE, 0x7F, 0x77, 0x3F},/ *上显示写入 “0000” * /

{0xD8, 0x1D, 0x5E, 0x99},/*显示“1234”

{0xCF, 0x73, 0x3B, 0xBB},/ *在显示时写“8765”* /

{0xb7,0x6e,0x4f,0x8f},/*在显示中写入“EB9D”

{0xD8,0x1D,0x77,0x7F的},/*显示“12:00”

{0xD8,0x1D,0x77,0x3F的}/*在显示中写入“1200”

};

/* LCD数字1控制的LUT */

常量uint8_t Digit1ByteLUT [] =

0x8E, 0x70, // 0

0x88, 0x10, // 1

0x8D, 0x60, // 2

0x8D, 0x30, // 3

0x8b,0x10,// 4

0x87, 0x30, // 5

0x87, 0x70, // 6

0x8C, 0x10, // 7

0x8F, 0x70, // 8

0x8F, 0x10, // 9

0x8F, 0x50, // A

0x83, 0x70, // B

0x86,0x60,// c

0x89, 0x70, // D

0x87, 0x60, // E

0×87,0×40 //˚F

};

/ * LUT用于LCD的Digit2控制* /

const uint8_t digit2bytelut [] =

0xE0, 0x0F, // 0

0x80, 0x03, // 1

0xD0,0X0D,// 2

0xD0, 0x07, // 3

0xB0, 0x03, // 4

0xf0,0x06,// 5

0xF0, 0x0E, // 6

0xc0,0x03,// 7

0xF0, 0x0F, // 8

0XF0,0×03,// 9

0xF0, 0x0B, // A

0xB0, 0x0E, // B

0xE0, 0x0C, // C

0x90, 0x0F, // D

0xF0, 0x0C, // E

0XF0,0x08的//˚F

};

/* LCD数字3控制的LUT */

const uint8_t Digit3ByteLUT[] =

0x07, 0x38, // 0

0x04, 0x08, // 1

0x06, 0xB0, // 2

0x06,0x98,// 3

0x05, 0x88, // 4

0x03, 0x98, // 5

0x03,0xb8,// 6

0x06, 0x08, // 7

0x07, 0xB8, // 8

0x07,0x88,// 9

0x07, 0xA8, // A

0x01, 0xB8, // B

0x03, 0x30, // C

0x04, 0xB8, // D

0x03, 0xB0, // E

0x03,0xA0 // f

};

/* LCD数字4控制的LUT */

const uint8_t Digit4ByteLUT[] =

0x70,0x07,// 0

0x40, 0x01, // 1

0x68, 0x06, // 2

0x68, 0x03, // 3

0x58, 0x01, // 4

0x38,0x03时,// 5

0x38, 0x07, // 6

0x60的,0×01,// 7

0x78,0x07,// 8

0x78, 0x01, // 9

0x78,0x05,// a

为0x18,0x07的,// B

0x30, 0x06, // C

0x48, 0x07, // D

0x38, 0x06, // E

0x38,0x04访问//˚F

};

/**

**===========================================================================

**

**摘要:DelayMs函数等待指定的延迟时间。

**

**===========================================================================

* /

空白DelayMs (uint32_t delay_time)

uint32_t ReferenceTick;

uint32_t ExpectedTickCount;

引用rick = tickcount;

ExpectedTickCount = ReferenceTick + delay_time;

如果(ExpectedTickCount

而(计时单元计数> ExpectedTickCount)

返回;

而(计时单元计数

/**

**===========================================================================

**

**摘要:BoardConfigInit函数用于初始化dev板

**

**===========================================================================

* /

空白BoardConfigInit(空白)

GPIO_InitTypeDef GPIO_InitStruct;

I2C_InitTypeDef I2C_InitStruct;

//时钟PORTC和PORTB启用

rcc_apb2periphclockcmd(rcc_apb2periph_gpioc | rcc_apb2periph_gpiob,启用);

//时钟I2C1使能

RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C1,使);

//配置LED (PC13)的GPIO管脚

GPIO_InitStruct。GPIO_Pin = ON_BOARD_LED_PIN;//配置LED引脚

GPIO_InitStruct。GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStruct。GPIO_Mode = GPIO_Mode_Out_PP;//设置输出Push-Pull

GPIO_Init (ON_BOARD_LED_PORT &GPIO_InitStruct);

//配置I2C接口(PB6和PB7)的GPIO管脚

GPIO_InitStruct。GPIO_Pin = SDA_I2C_PIN | SCL_I2C_PIN;//配置SDA和SCL引脚

GPIO_InitStruct。GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStruct。GPIO_Mode = GPIO_Mode_AF_OD;//设置备用函数open drain

GPIO_Init (ON_BOARD_I2C_PORT &GPIO_InitStruct);

//配置I2C1外设

I2C_InitStruct。I2C_ClockSpeed = 20000;// 100 kHz I2C时钟速度

I2C_InitStruct。I2C_Ack = I2C_Ack_Disable;

I2C_InitStruct。I2C_AcknowledgedAddress = 0 x00;

i2c_initstruct.i2c_dutycycle = i2c_dutycycle_2;

i2c_initstruct.i2c_mode = i2c_mode_i2c;//设置为I2C接口

I2C_InitStruct。I2C_OwnAddress1 = 0 x00;

i2c_init(lcd_control_i2c,&i2c_initstruct);//设置I2C外设

I2C_Cmd (LCD_CONTROL_I2C,使);/ /启用I2C

// **将Systick事件配置每1ms **配置每1ms **

systick_config(systemcoreclock / 1000);

/**

**===========================================================================

**

**摘要:I2C_WRITEBYTECMD是在GreenPak中写入命令的函数

**设备。函数接收ControlByte、Word地址和

**数据字节。

**===========================================================================

* /

uint32_t I2C_WriteByteCmd(uint8_t ControlByte, uint8_t ByteAddress, uint8_t ByteData)

uint32_t的TimeoutCount;//用于超时例程可变

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//等到I2C总线不再忙碌了

while(I2C_GetFlagStatus(LCD_CONTROL_I2C, I2C_FLAG_BUSY) == SET)

TimeoutCount——;//递减超时计数器

如果(TimeoutCount = = 0)//触发超时条件

//超时计数器达到0,则

返回false;//退出函数

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//生成启动条件

I2C_GenerateSTART(LCD_CONTROL_I2C,ENABLE);

//等待EV5被触发->启动条件正确

//在I2C总线上发布

而(I2C_CheckEvent(LCD_CONTROL_I2C,I2C_EVENT_MASTER_MODE_SELECT)== ERROR)

TimeoutCount——;//递减超时计数器

如果(TimeoutCount = = 0)//触发超时条件

//超时计数器达到0,则

返回false;//退出函数

//发送控制字节(I2C地址)

I2C_Send7bitAddress (LCD_CONTROL_I2C ControlByte I2C_Direction_Transmitter);

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//等待EV6触发->从设备ACK

while(i2c_checkevent(lcd_control_i2c,i2c_event_master_transmitter_mode_selected)==错误)

TimeoutCount——;//递减超时计数器

如果(TimeoutCount = = 0)//触发超时条件

//超时计数器达到0,则

返回false;//退出函数

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//发送单词/字节地址到CMIC

I2C_SendData (LCD_CONTROL_I2C ByteAddress);

//等到EV8_2触发 - >数据在I2C总线上移出

while(I2C_CheckEvent(LCD_CONTROL_I2C, i2c_event_master_byte_transmission) ==错误)

TimeoutCount——;//递减超时计数器

如果(TimeoutCount = = 0)//触发超时条件

//超时计数器达到0,则

返回false;//退出函数

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//发送字节的数据给CMIC

I2C_SendData (LCD_CONTROL_I2C ByteData);

//等到EV8_2触发 - >数据在I2C总线上移出

while(I2C_CheckEvent(LCD_CONTROL_I2C, i2c_event_master_byte_transmission) ==错误)

TimeoutCount——;//递减超时计数器

如果(TimeoutCount = = 0)//触发超时条件

//超时计数器达到0,则

返回false;//退出函数

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//在总线上生成停止条件

I2C_GenerateSTOP (LCD_CONTROL_I2C,使);

返回真;//发送TRUE,当命令完成

/**

**===========================================================================

**

**摘要:FlashLed ->产生板上led定时闪光

**

**===========================================================================

* /

void FlashLed(uint32_t Ton, uint32_t Toff)

LED_TURN_ON();

DelayMs(吨);

LED_TURN_OFF ();

DelayMs(设备);

/**

**===========================================================================

**

**摘要:主程序

**

**===========================================================================

* /

int主要(空白)

uint8_t温度;

uint16_t DisplayValue = 1200;

uint16_t结果;

uint8_t Digit1;

uint8_t digit2;

uint8_t digit3;

uint8_t digit4;

uint8_t tempbyte0;

uint8_t tempbyte1;

BoardConfigInit();//初始化主板外围设备

/ /提示demo开始*/

FlashLed(3000、1000);//保持3秒

for(temp = 0; temp <5; temp ++)//短闪led 5次

FlashLed(500、500);

/*

*将所有段设置为不透明

* /

I2C_WriteByteCmd (CONTROL_BYTE_IC1 BYTE_0_ADDRESS 0 xff);

I2C_WriteByteCmd(CONTROL_BYTE_IC1,BYTE_1_ADDRESS,为0xFF);

I2C_WRITEBYTECMD(CONTROL_BYTE_IC2,BYTE_0_ADDRESS,0x7F);

I2C_WriteByteCmd (CONTROL_BYTE_IC2 BYTE_1_ADDRESS 0 xff);

/*

* 3个led闪光灯

* /

(Temp = 0;临时< 3;临时+ +)

FlashLed(250、500);

/*

*发送演示命令列表来控制显示行为

* /

(Temp = 0;临时< (sizeof (TestDisplayCMDList) / sizeof (uint8_t *));临时+ +)

I2C_WriteByteCmd(CONTROL_BYTE_IC1,BYTE_0_ADDRESS,TestDisplayCMDList [温度] [0]);

I2C_WriteByteCmd (CONTROL_BYTE_IC1、BYTE_1_ADDRESS TestDisplayCMDList(临时));

I2C_WriteByteCmd (CONTROL_BYTE_IC2、BYTE_0_ADDRESS TestDisplayCMDList(临时));

I2C_WriteByteCmd (CONTROL_BYTE_IC2、BYTE_1_ADDRESS TestDisplayCMDList(临时));

FlashLed(100,1500);

/*

*闪光led快速完成代码

* /

而(1)

Result = DisplayValue / 1000;//得到千位

Digit1 = (uint8_t) Result;

Result = DisplayValue % 1000;//获得百位数

结果/ = 100;

Digit2 =(uint8_t)结果;

//从数字1和2的值挂载字节0值

TempByte0 = Digit1ByteLUT [Digit1] [0];

TempByte0 | = Digit2ByteLUT [Digit2] [0];

//从数字1和2的值装入字节1倍的值

TempByte1 = Digit1ByteLUT [Digit1];

TempByte1 | = Digit2ByteLUT [Digit2];

//写入新的字节值IC1 - 更新显示

I2C_WriteByteCmd(CONTROL_BYTE_IC1,BYTE_0_ADDRESS,TempByte0);

I2C_WriteByteCmd (CONTROL_BYTE_IC1 BYTE_1_ADDRESS TempByte1);

Result = DisplayValue % 100;

结果/ = 10;

Digit3 = (uint8_t) Result;

Result = DisplayValue % 10;

Digit4 = (uint8_t) Result;

//从数字3和3的值挂载字节0值

TempByte0 = Digit3ByteLUT [Digit3] [0];

TempByte0 | = Digit4ByteLUT [Digit4] [0];

//从数字3和4的值装入字节1的值

tempbyte1 = digit3bytelut [digit3];

TempByte1 | = Digit4ByteLUT [Digit4];

//将新字节值写入IC2 - 更新显示

I2C_WriteByteCmd (CONTROL_BYTE_IC2 BYTE_0_ADDRESS TempByte0);

I2C_WriteByteCmd (CONTROL_BYTE_IC2 BYTE_1_ADDRESS TempByte1);

//快速led闪光

FlashLed(250,250);

TempByte1 | = 0 x40;//设置col段

//写入命令集山口段

I2C_WriteByteCmd (CONTROL_BYTE_IC2 BYTE_1_ADDRESS TempByte1);

//快速led闪光

FlashLed(250,250);

//自增显示值

DisplayValue + +;