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

VFD的实现原理和驱动设计

点击数:7354 次   录入时间:03-04 11:53:39   整理:http://www.55dianzi.com   51单片机
{
.............
dwDesiredPort = (dwDesiredPort << 8);
.............
REG_PLAT_GPA_IO_DIR_CONTROL &= ~(dwDesiredPort);
............
}
// 909S: define GPIO registers
#define REG_PLATFORM_GPIO_BASE (IO_START+0x330)
// 80000330
#define REG_PLAT_GPA_CLEAR (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x00))) //
0330 (909S)
#define REG_PLAT_GPA_SET (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x04))) //
0334 (909S)
#define REG_PLAT_GPA_IO_DIR_CONTROL (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x08))) //
0338 (909S)
#define REG_PLAT_GPIO_INT_CONFIGURATION (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x0c))) //
033c
#define REG_PLAT_GPCDE_CLEAR (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x10))) //
0340 (909S)
#define REG_PLAT_GPCDE_SET (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x14))) //
0344 (909S)
#define REG_PLAT_GPCDE_IO_DIR_CONTROL (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x18))) //
0348 (909S)
#define REG_PLAT_GPF_CLEAR (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x1c))) //
034c (909S)
#define REG_PLAT_GPF_SET (*((volatile DWORD *) (REG_PLATFORM_GPIO_BASE+0x20))) //
0360 (909S)
通过上面的了解,假设现在用的是 ALI的平台,我们就可以定义如下的宏来操作GPIO的状态

#Define ALI_SET_GPIO_HEIGHT(GPIO) \
HAL_GPIO_BIT_SET(GPIO,1)
#Define ALI_SET_GPIO_LOW(GPIO) \
HAL_GPIO_BIT_SET(GPIO,0)
接下来我们就可以测试上面的代码了,可以分别对三个GPIO分别输出高低电位,然后用示波器观察波形,是否正确。如果工作正常,接下来就可以根据串行协议实现数据传输了。其中主要实现两个函数,一次传输一个二进制位即一个BIT和一次传输一个字节。

电路图

从图中可以看出,根据串行协议,在传输开始要用STB选通,让STB进入低电位状态,说明串口数据传输开始,CLK有效,SDA上的数据有效果,为高电位,传输终止SDA,SDA无效,当STB从一个低电位到一个高电位的过程中,SDA传输一个或多字节,SCK为高电位时即上升沿时,SDA接收数据即CPU向VFD Chip DRIVER写入数据,SDA传输一个BIT。STB控制信号控制字节的传输,SCK时钟信号控制位的传输,一个STB周期,传输一个或多个字节,一个CLK周期为一个BIT的读写信号。根据上面的分析,我们可以写出如下代码:

写一个位:
ALI_SET_GPIO_LOW(GPIO_VFD_CLK);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_SDA);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_CLK);

写入一个字节:

void Write_OneByte(BYTE bValue)
{
BYTE i=0;
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //传输多个字节,STB控制移到函数外,即传输

//没有终止。
for(i=0;i<8;i++)
{
ALI_SET_GPIO_LOW(GPIO_VFD_CLK);
if(bValue & 0x01)
ALI_SET_GPIO_HEIGHT(GPIO_VFD_SDA);
else
ALI_SET_GPIO_Low(GPIO_VFD_SDA);

ALI_SET_GPIO_HEIGHT(GPIO_VFD_CLK);
bValue>>=1;
}
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB); //传输多个字节,STB控制移到函数外。

}

一次传输多个字节:
void Write_Datas(BYTE bcount,BYTE *pBValue)
{
BYTE i;
ALI_SET_GPIO_LOW(GPIO_VFD_STB);
for(i=0;i {
Write_OneByte(pBValue[bcount]);

}
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
}
上面的代码实现了如何根据串口协议传输数据即向串口发送数据的过程,但这还不是一个完整的传输过程,一个完整的数据传输过程应该是,一个具体的数据块从一个地方传输到一个指定的地方,一般数据的传输都是从一个芯片中的一个寄存器传输到另一个寄存器或从RAM的一个地方到另一个地方,和从不同芯片中的不同寄存器互相传输,通信协议用的最多的是 I2C协议这里重点是串口协议,无论用什么协议,多需要知道目地地址,这些都可以从相关芯片SPEC中得到,在串行协议中,一个STB的上升或下降沿初始化串行接口,当STB为低电位后,CLK有效,SDA开始接收数据并且第一个字节为指令。有关16312的个指令定义如下:

#define COMMAND_WRITEDISPLAY 0x40

#define COMMAND_READKEY 0x42

#define COMMAND_ADDRESS 0xc0

#define COMMAND_DISP_MODE 0x02

#define COMMAND_CTRL_MODE 0x8f

//重写上面的函数
void Write_Datas(BYTE *pSour,BYTE *pDest,BYTE bcount)
{
BYTE i;
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已经在下降沿,移去
Write_OneByte(COMMAND_WRITEDISPLAY);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已经在下降沿,移去
Write_OneByte(COMMAND_ADDRESS); //参数也可以由pDest取得
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}
ALI_SET_GPIO_LOW(GPIO_VFD_STB);
for(i=0;i {
Write_OneByte(pBValue[bcount]);

}
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}
}
//设置VFD工作模式,和开启VFD。
void Start_VFD(void)
{
BYTE i;
ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已经在下降沿,移去
Write_OneByte(COMMAND_DISP_MODE);
ALI_SET_GPIO_HEIGHT(GPIO_VFD_STB);
for(i=0;i<4;i++){}

ALI_SET_GPIO_LOW(GPIO_VFD_STB); //如果已经在下降沿,移去
Write_OneByte(COMMAND_DISP_MODE);
ALI_SET_GPIO_HEIGHT(COMMAND_CTRL_MODE);
for(i=0;i<4;i++){}

}
到现在我们已基本实现了串行通信的部分基本功能主要是向串口发送数据,接下来将实现如何从串行总线上接收数据另外有关VFD的各种显示功能将在第二部分实现。

VFD驱动的完整代码文件
详见 单片机 音响技术网TOPAV-2008配套程序(51汇编代码)

一些常用VFD驱动IC的SPEC请在本站首页下载
VFD串行通信的其他扩展功能



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


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

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