从图中可以看出,根据串行协议,在传输开始要用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串行通信的其他扩展功能
本文关键字:暂无联系方式51单片机,单片机-工控设备 - 51单片机
上一篇:51单片机红外遥控解码程序