跳过主要内容

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

内容

术语和定义

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

参考

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

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

下载我们的免费格林帕克软件设计师(1]以打开。gp文件[2],并查看所提出的电路设计。使用格林帕克开发工具(3.可以在几分钟内将设计冻结到您自己定制的集成电路中。雷竞技电竞平台Dialog Semiconductor提供完整的申请资料库[4],包括设计实例,以及对Dialog IC的功能和模块的解释。

  1. GreenPAK设计软件,《软件下载及用户指南》,Dialog Semiconductor雷竞技电竞平台
  2. 带有I2C接口的AN-CM-256静态LCD驱动程序格林帕克设计文件,Dialog半导雷竞技电竞平台体
  3. GreenPAK开发工具格林帕克开发工具网页,对话半导体雷竞技电竞平台
  4. GreenPAK应用笔记格林帕克应用笔记网页,Dialog半导体雷竞技电竞平台
  5. AN-001 - LCD技术基础,日立
  6. 应用笔记AN-005 -显示模式,日立
  7. 应用说明AN-1090带SLG46531V的简单I2C IO控制器,Dialog Semiconductor雷竞技电竞平台

介绍

液晶显示器(LCD)由于其良好的视觉性能、低成本和低功耗而广泛应用于商业和工业应用。雷竞技安卓下载这些特性使液晶显示器成为电池操作设备的标准解决方案,如便携式仪器,计算器,手表,收音机等。

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

存在两种类型的LCD,静态的,只有一个底板和一个管脚用于单独的管段控制;多路复用的,有多个底板和多个管脚连接的管段。

本应用说明将介绍一个带有SLG46537V的静态LCD驱动器的设计GreenPAK™设备。设计的LCD驱动器可以驱动多达15个LCD段,使用来自电源的几微安电流,并提供I2C接口进行控制。

在以下部分将显示:

  • lcd的基本知识;
  • SLG46537V格林帕克详细的LCD驱动设计;
  • 如何驾驶七个段,带有两个的七位静态液晶显示屏格林帕克设备;

液晶显示器的基础知识

液晶显示器(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材料中几乎没有电流。液晶显示器的电极形成一个小电容,这是驱动器的唯一负载。这就是为什么液晶显示器是显示视觉信息的低功耗设备。

然而,重要的是要注意液晶显示器不能在直流电压源下工作太长时间。直流电压的应用会在LC材料中引起化学反应,对其造成永久性的损害[5].解决方案是在液晶屏电极上施加交流电压。

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

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

LCD的背板和段的时钟信号通常在30到100hz的范围内,这是为了避免LCD上的视觉闪烁效应的最小频率。避免高频,降低整机功耗。由液晶显示器和驱动器组成的系统将消耗很少的电流,在微安的顺序。这使得他们非常适合低功耗和电池电源的应用。雷竞技安卓下载

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

在下面几节中,设计一个液晶静态驱动与格林帕克详细介绍了一种用于商用液晶显示器的可产生背板时钟信号和单段时钟信号的器件。

GreenPAK设计基本框图

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

图3:GreenPAK设计的基本框图

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

当内部段控制线设置(高电平)各自的LCD段是暗不透明的。当内部段控制线复位(低电平)时,各自的LCD段是透明的。

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

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

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

不止一个格林帕克设备可用于同一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
SCL.
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)

设计电流消耗

此设计中的一个重要问题是电流消耗,该消耗应尽可能低格林帕克对于3.3 V电源操作,设备估计静态电流为0.75µA,对于5 V电源操作,设备估计静态电流为1.12µA。对于3.3 V和5 V电源操作,内部振荡器的电流消耗分别为7.6µA和8.68µA。由于开关损耗,预计电流消耗不会显著增加is设计在低时钟频率下运行。当内部振荡器打开时,该设计消耗的估计最大电流低于15µa,当内部振荡器关闭时,该设计消耗的估计最大电流低于10µa。两种情况下消耗的测量电流如第1710节所示-测试结果

GreenPAK装置示意图

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

图4:GreenPAK设计方案的俯视图

I2C接口

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

图5:I2C接口块的近视图

这个模块连接到pin8和pin9,分别是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:背板时钟源选择和振荡器控制

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

只有当BCKP_源信号与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操作控制

液晶显示系统原型

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

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

图中显示了组装的原型图10

图9:系统原型的原理图
图10:系统原型图。IC1在左侧,IC2在右侧

LCD控制I2C命令

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

表2:段和设备驱动程序
IO数量
设计功能
(U1)显示连接
(U2)显示器连接
1
VDD
2
0
背板时钟输入
COM
3.
1
段输出1
1G
3F
4
2
段输出2
1F
3A
5
3.
段输出3
1
3B
6
4
段输出4
1 b
4G
7
5
段输出5
2G
4F
8
6
SCL.
9
7
SDA
10
8
段输出6
2F
4A
11
接地
12
9
段输出7
2A
4B
13
10
段输出8
2B
4C
14
11
段输出9
2C
4D
15
12
段输出10
二维
4E
16
13
段输出11
2E
3C
17
14
段输出12
1C
三维
18
15
段输出13
1D
3E
19
16
段输出14
1E
上校
20
17
背板时钟输出或段输出
COM
3G

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

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

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

所有I2C写命令都由Word地址0xF4(I2C虚拟输入)和0xD0(对于状态0的ASM输出)进行。在IC1和控制LCD数字1和2中写入的命令总结在表3.在命令序列表示法中,左括号“[”表示开始信号,右括号“]”表示停止信号。

表3:IC1的I2C命令序列描述
I2C写命令
描述
[0 x00 0 xf4, Byte0]
给分段1到7赋一个状态值。它也配置了背板振荡器(最有效位,MSB)。在IC1中,MSB总是设置的。这样,配置IC1为背板时钟信号的源。Byte0值描述如下。
[0 x00 0 xd0, Byte1]
将状态值赋给段8到15。Byte1值描述如下。

上面的两个字节一起控制LCD数字1和数字2的段。这里,方法是在软件中为每个数字使用一个单独的查找表(LUT),考虑两个字节中的段。查找表中的字节值应该使用按位或操作混合,然后发送到IC表4显示了应该写入每个显示数字中的每个数值的Byte0和Byte1值。

表4:在LCD数字1和2上写数字和字母查找表
数字1
数字2
数字/字母
Byte0
Byte1
Byte0
Byte1
0 x8e
0 x70
0 xe0
0x0F
0
0 x88
0x10
0 x80
0x03
1
0 x8d
0 x60
0 xd0
0x0D
2
0 x8d
0 x30
0 xd0
0x07
3.
0 x8b
0x10
0 xb0
0x03
4
0 x87
0 x30
0 xf0
0x06
5
0 x87
0 x70
0 xf0
0x0E
6
0 x8c
0x10
0 xc0
0x03
7
0 x8f
0 x70
0 xf0
0x0F
8
0 x8f
0x10
0 xf0
0x03
9
0 x8f
0×50
0 xf0
0x0B
一个
0 x83
0 x70
0 xb0
0x0E
B
0 x86
0 x60
0 xe0
0x0C
C
0 x89
0 x70
0 x90
0x0F
D
0 x87
0 x60
0 xf0
0x0C
E
0 x87
0 x40
0 xf0
0x08
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)。Byte0值描述如下。
[0 x10, 0 xd0, Byte1]
将状态值赋给段8到15。Byte1值描述如下。

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

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

IC2的区别在于COL段。这个段由Byte1控制。要设置此段为暗段,应该在Byte1和值0x40之间进行按位或操作。

LCD测试I2C命令

针对液晶显示器的测试,用C语言开发了单片机板的固件。该固件将向面包板上的两个ic发送一系列命令。这个固件的源代码在附录部分。整个解决方案是使用Atollic TrueStudio for STM32 9.0.1 IDE开发的。

显示屏中显示的命令序列和相应值汇总在中表7在下面。

表7:LCD原型显示序列
显示文本(所有数字和列:)
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], [0x00, 0xD0, 0x1D], [0x10, 0xF4, 0x5E], [0x10, 0xD0, 0x99]
8765
[0x00, 0xF4, 0xCF], [0x00, 0xD0, 0x73], [0x10, 0xF4, 0x3B], [0x10, 0xD0, 0xBB]
EB9D
[0x00,0xF4,0xB7],[0x00,0xD0,0x6E],[0x10,0xF4,0x4F],[0x10,0xD0,0x8F]
12:00
[0x00, 0xF4, 0xD8], [0x00, 0xD0, 0x1D], [0x10, 0xF4, 0x77], [0x10, 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)。

结论与结果

低功耗静态液晶驱动器的设计格林帕克提出了设备。这个设计清楚地显示了它的最大特点之一格林帕克器件:低静态电流。因为格林帕克设备是基于硬件的解决方案,可以在低频工作,在本例中为48 Hz。基于MCU的解决方案需要更高的工作频率,即使是周期性的短时间,然后会消耗更多的功率。并且,比较格林帕克CPLD (Complex Programmable Logic device,复杂可编程逻辑器件)通常具有高于20µa的静态电流。

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

附录A
.源代码

/*

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

文件:stm32f1xx_it.c

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

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

*/

uint32_t TickCount = 0;

/**

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

Arunachal Pradesh,

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

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

*/

空白SysTick_Handler(空白)

TickCount++;

/*

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

文件:c

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

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

*/

/*包括*/

# include < stddef.h >

# include“stm32f10x.h”

# include“stm32f10x_conf.h”

# include“stm32f1xx_it.h”

/ /基本定义

#定义ON_BOARD_LED_PIN GPIO_Pin_13

#定义ON_BOARD_LED_PORT GPIOC

#定义ON_BOARD_I2C_PORTGPIOB

#定义SDA_I2C_PINGPIO_Pin_7

#定义SCL_I2C_PINGPIO_Pin_6

#定义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

#定义错误0

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

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

#定义CONTROL_BYTE_IC20x10//设备I2C地址

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

#定义BYTE_1_ADDRESS0 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 */

const 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

0x87, 0x40 // F

};

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

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, 0x03, // 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, 0x01, // 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

};

/**

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

Arunachal Pradesh,

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

Arunachal Pradesh,

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

*/

空白DelayMs (uint32_t delay_time)

uint32_t ReferenceTick;

uint32_t ExpectedTickCount;

ReferenceTick = TickCount;

ExpectedTickCount = ReferenceTick + delay_time;

如果(ExpectedTickCount < ReferenceTick)

而(TickCount > ExpectedTickCount)

返回;

而(TickCount < ExpectedTickCount)

/**

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

Arunachal Pradesh,

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

Arunachal Pradesh,

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

*/

空白BoardConfigInit(空白)

GPIO_InitTypeDef GPIO_InitStruct;

I2C_InitTypeDef I2C_InitStruct;

//启用时钟PORTC和PORTB

rcc_apb2peripheroccmd (rcc_apb2peripher_gpioc | rcc_apb2peripher_gpiob, ENABLE);

//时钟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;// 100khz 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触发一次**

SysTick_Config (SystemCoreClock / 1000);

/**

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

Arunachal Pradesh,

**摘要:I2C_WriteByteCmd是在GreenPAK中编写命令的函数

Arunachal Pradesh,该函数接收控制字节、字地址和

Arunachal Pradesh,数据字节。

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

*/

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

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

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//等待I2C总线不再繁忙

同时(I2C_GetFlagStatus(LCD_CONTROL_I2C,I2C_FLAG_BUSY)==设置)

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

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

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

返回错误;// quit quot

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

//生成启动条件

I2C_GenerateSTART (LCD_CONTROL_I2C,使);

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

//在I2C总线上释放

while(I2C_CheckEvent(LCD_CONTROL_I2C, I2C_EVENT_MASTER_MODE_SELECT) == ERROR)返回错误

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

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

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

返回错误;// quit quot

//发送控制字节(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,则

返回错误;// quit quot

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,则

返回错误;// quit quot

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,则

返回错误;// quit quot

TimeoutCount = I2C_TIMEOUT_VALUE;//设置超时值

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

I2C_GenerateSTOP (LCD_CONTROL_I2C,使);

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

/**

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

Arunachal Pradesh,

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

Arunachal Pradesh,

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

*/

void FlashLed(uint32_t Ton, uint32_t Toff)

LED_TURN_ON ();

DelayMs(吨);

LED_关闭();

DelayMs(设备);

/**

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

Arunachal Pradesh,

**摘要:主程序

Arunachal Pradesh,

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

*/

内部主(空)

uint8_t温度;

uint16\u t显示值=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秒

(Temp = 0;临时< 5;临时+ +)//led短闪5次

FlashLed(500、500);

/*

*设置所有分段为不透明

*/

I2C_WriteByteCmd (CONTROL_BYTE_IC1 BYTE_0_ADDRESS 0 xff);

I2C_WriteByteCmd (CONTROL_BYTE_IC1 BYTE_1_ADDRESS 0 xff);

I2C_WriteByteCmd (CONTROL_BYTE_IC2 BYTE_0_ADDRESS 0 x7f);

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(控制字节_IC2,字节_1_地址,TestDisplayCMDList[Temp]);

FlashLed(100、1500);

/*

*闪光led快速完成代码

*/

而(1)

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

Digit1 = (uint8_t) Result;

Result = DisplayValue % 1000;//得到100位

结果/ = 100;

Digit2 = (uint8_t) Result;

//从数字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)结果;

结果=显示值%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 + +;