您当前的位置:五五电子网电子知识单片机-工控设备51单片机VFD的实现原理和驱动设计 正文
VFD的实现原理和驱动设计

VFD的实现原理和驱动设计

点击数:7354 次   录入时间:03-04 11:53:39   整理:http://www.55dianzi.com   51单片机

透过CPU控制VFD驱动芯片,VFD驱动芯片(16312)的内部框图如下:

电路图

在上面的框图中,可以看到一个显示存储器(Display RAM)正是通过这个显示寄存器来实现显示功能的,显示寄存器中的一个字节可以描述一个字符,显示寄存器中的一位映射到VFD显示屏中的一个亮点,也就是说如果向显示寄存器中的一个被映射的位写 1,那么在VFD显示屏中的相应的亮点就会被点亮,相反写 0 VFD显示屏中的相应的亮点就会被熄灭。通过向显示寄存器中写入一个字节,来显示一个基本字符,写入若干个字节可以显示一个字符串。显示寄存器透过段位在芯片外引出引脚然后连到VFD上,显示寄存器到VFD的映射就是这样通过硬件连接来实现的,通常由于驱动芯片的各个引脚可以根据自己的需要有选择的选用,线路的连接会有细微的变化,使得VFD的各个亮点映射到显示寄存器的具体的地址也会有一些细微差别,想要在VFD上任意位置为开始显示一个任意一个字符串,和点亮VFD上面的任意一点,程序员必须就必须知道和计算出在一块确定的VFD驱动板上,VFD上的每个亮点映射到了显示寄存器中的什么地址位,从而决定向显示寄存器的什么地址写数据,所以定义VFD上面的每个亮点在DISPLAY RAM中的地址,从右往左,VFD上面的所有亮点由若干个8段和icon组成:例如:

下面 N1_ 代表第一个8段

#define N1_SEG_A_ADDR 0x02
#define N1_SEG_A_DATA 0x04
//上面定义的意思是:
//1. 8段中 A 段在显示寄存器中的字节地址即这个亮点映射到了显示存储器中的第几个字// 节 (例如 0x02 第二个字节).

//2. A段映射到显示寄存器的某个字节的第几位(例如:0x04 即 0000 0100 8位中的第//
三位,也就是有置 1 的位)
//上面的定义描述了,从左往右,VFD第一个8段中的
A段映射到显示寄存器中第2个字节中的//第三位,也就说,如果把显示寄存器中的第二个字节中的第三位置
1,那么VFD第一个8段中//的 A段就会被点亮,即向显示寄存器中的 N1_SEG_A_ADDR 地址处 写入N1_SEG_A_DATA。

//下面可以依次定义VFD上面的各个亮点和ICON。
//注意:关于宏定义的值(如:0x02,0x04)从哪里来,将会在后面讲到,其实是要再写程序//来测试出各个亮点对应的地址,或从相关SPEC中得到。驱动完成以后,对于不不同的VFD只//要添上值就可以了。

#define N1_SEG_B_ADDR 0x02
#define N1_SEG_B_DATA 0x08

#define N1_SEG_C_ADDR 0x02
#define N1_SEG_C_DATA 0x40

#define N1_SEG_D_ADDR 0x03
#define N1_SEG_D_DATA 0x08

#define N1_SEG_E_ADDR 0x03
#define N1_SEG_E_DATA 0x04

#define N1_SEG_F_ADDR 0x03
#define N1_SEG_F_DATA 0x40

#define N1_SEG_G_ADDR 0x03
#define N1_SEG_G_DATA 0x30

#define N1_SEG_H_ADDR 0x00
#define N1_SEG_H_DATA 0x00

............................

// Icon Define
#define VFD_TITLE_ADDR 0x00
#define VFD_TITLE 0x00

#define VFD_CHAPTER_ADDR 0x00
#define VFD_CHAPTER 0x00

#define VFD_HOUR_ADDR 0x00
#define VFD_HOUR 0x00
#define VFD_HOUR_COL_ADDR 0x02
#define VFD_HOUR_COL 0x01

...............................

上面对VFD上的各个亮点做了定义,但我们还需要建立一个映射表方便在调用各个段定义。

BYTE ADDRESS_MAPPING[] =

{ N1_SEG_A_ADDR, N1_SEG_B_ADDR, N1_SEG_C_ADDR, N1_SEG_D_ADDR,N1_SEG_E_ADDR,
N1_SEG_F_ADDR,N1_SEG_G_ADDR,0,
N1_SEG_A_DATA, N1_SEG_B_DATA, N1_SEG_C_DATA, N1_SEG_D_DATA,N1_SEG_E_DATA,
N1_SEG_F_DATA,N1_SEG_G_DATA,0,

.................
.................
};
根据三部分的驱动设计思想,我们把VFD驱动芯片通过串行接口与CPU的通信划分到整个驱动设计的第三部分,第一步所要做的是建立一个逻辑上与硬件无关公共接口。根据上面对显示寄存器的分析,我们可以建立一个数组用来映射驱动芯片中的显示寄存器,上面的 16 X 11 显示存储器可以显示 22 个字节,所以我们可以做如下定义:

BYTE 16312_DisplayRam[22];

第二步:中间层 :VFD各种显示功能的的实现,用于满足显示需求。
在这部分主要根据第一层的公共接口和在第三层的驱动的基础上来实现VFD的各种显示功能,所以这部分主要是调用第三层的驱动函数来处理第一层的数据,或着说是将第一层的信息根据显示需求通过第三层发送给VFD驱动芯片中去。对于一个VFD首先要具备对一个条信息的基本显示功能,下面将介绍如何显示一个字符串”Hello world”,要想同时完全显示这个字符串,首先VFD上面必须要有11个8段,就是硬件支持同时显示11个字符的VFD,如果不够后面的字符就回丢失。

实现一个过程将字符串解析到 16312_DisplayRam 中。

void ParseStringToRamMapping(char *Str,BYTE Strcount)
{
BYTE i,j;
for(i=0;i {
for(j=0;j<8;j++)
{
if(Str[i+1] & (0x01 << j))
16312_DisplayRam[ ADDRESS_MAPPING[i*16+j] ] |= ADDRESS_MAPPING[i*16+8+j];
else
16312_DisplayRam[ ADDRESS_MAPPING[i*16+j] ] &= ~ADDRESS_MAPPING[i*16+8+j];
}
}
}

//得到当前在VFD上正在显示的信息
void ParseRamMappingToString()
{

}
//将"Hello world"解析到16312_DisplayRam中。
ParseStringToRamMapping(str_hw,11);

//将 16312_DisplayRam 写到 VFD的RAM中去。
Write_Datas(16312_DisplayRam,NULL,22);
在主程序 polling的时候 呼叫Write_Datas方法将16312_DisplayRam最终写到VFD驱动芯片的显示RAM中之后,在调用 Start_VFD();VFD上就会显示出 “Hello world” 了。

在第二层中的内容主要是显示功能的实现和逻辑控制,程序写起来可以根据实际需求灵活多变,而第一部分和第三部分的内容则相对稳定。所以也可以实现类似下面的函数来实时控制VFD的显示:

void ShowMessagesOnVFD(char *Str,BYTE Strcount)
{
ParseStringToRamMapping(Str, Strcount);
Write_Datas(16312_DisplayRam,NULL,22);
Start_VFD();
}
或者
void PrintMessagesOnVFD(char *Str,BYTE Strcount)
{
ParseStringToRamMapping(Str, Strcount);
Write_Datas(16312_DisplayRam,NULL,22);
Start_VFD();
}

电路图

第三步:平台接口:用于实现和各个平台之间的接口,主要是和CPU的通信。
在第三部分主要实现CPU与VFD驱动芯片通过串行接口通信的问题。
CPU通过串行接口控制VFD的关闭和显示,VFD的亮度,显示存储器的读写,按键扫描等。在上面的图中可以看到,串口有四线,STB,CLK,Din,Dout但在实际电路中 Din和Dout连接在一起使用,所有又叫三线串口。

STB :片选信号线 在上升或下降沿初始化串行接口随后等待接收
指令STB 为低后的第一个字节作为指令,当处
理指令时当前其它处理被终止,当STB 为高
时CLK被忽略。

CLK :时钟信号线。在上升沿读取串行数据下降沿输出数据。
Din :数据输入。
Dout :数据输出。
串口通信 和 GPIO

了解VFD 用到的 IO 口,通过一台整机的电路图,或从PCB板上用万能表测出VFD串行接口连接到CPU上的引脚,然后根据CPU的SPEC得到映射到的IO接口,完整的说应该是GPIO(General Purpose Input/Output的缩写即通用输入输出接口,支持 I2C, 串行总线等协议 )。

如:Ali 3330
#define GPIO_VFD_STB 17
#define GPIO_VFD_SDA 22 //Din 和 Dout
#define GPIO_VFD_CLK 16

上面的定义可以理解为:VFD STB 连接到了 主板CPU 上的IO 17
VFD SDA 连接到了 主板CPU 上的IO 22
VFD CLK 连接到了 主板CPU 上的IO 16
知道了连接所用的IO后,就可以同过VFD串行接口向VFD驱动芯片发送收据和控制信息,向显示寄存器,键扫寄存器读写数据但,但首先要能够通过软件控制各个IO接口,也就是可以通过软件设置各个GIO的电位,例如:把 GPIO 17 拉高到+5伏,或拉低到-5伏,如果有确定的平台系统,则相应的平台会提供相应的GPIO操作接口

例如 Cheertek909
HAL_WriteGPIO(GPIO_VFD_STB,1); //向PGIO 17 写 1 输出高电位
HAL_WriteGPIO(GPIO_VFD_STB,0); //向PGIO 17 写 0 输出低电位
HAL_ReadGPIO(GPIO_VFD_SDA)?1:0; //读GPIO

Ali3330

#define HAL_GPIO_BIT_SET(pos, val) \
do {osal_interrupt_dISAble(); \
((pos < 32) \
? HAL_GPIO_WRITE((HAL_GPIO_READ() & ~(1 << (pos))) | ((val) << (pos))) \
: HAL_GPIO1_WRITE((HAL_GPIO1_READ() & ~(1 << (pos - 32))) | ((val) << (pos - 32)))); \
osal_interrupt_enable(); \
} while (0)

如没有完成的平台系统,没有GPIO接口,就需要首先根据CPU的SPEC,实现GPIO的输入输出子程序,这部分程序因主IC不同而不同,也不是本文讨论的重点。

例如: Cheertek909

void HAL_WriteGPIO(BYTE bGroup, DWORD dwPort, BYTE bValue)

上一页  [1] [2] [3]  下一页


本文关键字:暂无联系方式51单片机单片机-工控设备 - 51单片机

《VFD的实现原理和驱动设计》相关文章>>>