切换到宽版
  • 15524阅读
  • 41回复

[C51]受坛友启发,点亮手里的VFD屏幕,简单讲解并分享代码 [复制链接]

上一主题 下一主题
离线氢氟酸
 

发帖
4330
M币
9869
专家
29
粉丝
157
— 本帖被 發騷友 设置为精华,作者+3000M币+5专家(2018-02-28) —
刚过年还没开学,看到坛友@毛栗子 点亮了DVD的VFD屏幕,恰好手里也有一块,折腾了一晚上也点亮了,最后分享代码。。。。
坛友的 :http://bbs.mydigit.cn/read.php?tid=2353651


先来一张全部点亮的图。。。漂亮吧。。


桌子比较乱,VFD供电比较麻烦,这里使用的是原来自带的电源模块


变压器,多组电压


新茂的51单片机


接口,取原来的 STB,CLK,Dout用


前一段时间拆了一个车机,拆出来一个收音模组(tda7705),
等研究懂了和这个组合,做个VFD收音机。


反面主控,ET16311,去百度下载下来资料


找到PDF资料就好说了,慢慢研究,详细列出了管脚排布和管脚功能


具体怎样分辨管脚一看pcb走线便知,不再累赘




然后就要写通讯程序了,标准的串口通讯,根据时序写程序,
在STB拉低后开始传输数据,在时钟线上升沿读取数据。
  1. /*发送一个字节的数据*/
  2. void Send_One_Data(uchar Data)
  3. {
  4. char i;
  5.     for(i=0;i<8;i++)
  6.     {
  7.         if(Data & 0x01)
  8.             Dout=1;
  9.         else
  10.             Dout=0;
  11.         CLK=0;
  12.         Data>>=1;
  13.         CLK=1;
  14.     }
  15. }
  16. /*发送一个命令*/
  17. void Transfer_Command(uchar CMD)
  18. {
  19. STB=0;
  20.     Send_One_Data(CMD);
  21.     STB=1;
  22. }





然后直接看应用部分,上电之后首先发送两条命令,
每条命令发送完成后释放STB(低有效),
命令一命令二对vfd进行基本的设置,
然后命令三为缓存地址,传输完成后,不释放STB !!!
紧跟着的就是缓存数据,这个屏幕有米子屏,8位数据
不够,猜想应该是16位,后面验证的确如此,此时就要
再写一个发送16位的函数。
  1. /*发送两个个字节的数据*/
  2. void Send_Two_Data(unsigned int Data)
  3. {
  4.     char i;
  5.     for(i=0;i<16;i++)
  6.     {
  7.         if(Data & 0x01)
  8.             Dout=1;
  9.         else
  10.             Dout=0;
  11.         CLK=0;
  12.         Data>>=1;
  13.         CLK=1;
  14.     }
  15. }



首先看命令一
这是个8位数据,只设置段和位,有多个对应关系,
我的是15段x13位,所以八个位由高到低为00001100,
这里提一下,windows 10 带的计算器非常好用,调到程序员
模式,各种进制灵活转换,00001100转换为16进制后为0X0C,
所以发送的第一个命令应为0x0c。


接下来看命令2,这一个命令也是对驱动芯片进行基本设置,
b3设置为通常的工作模式,所以为1;
为了方便,希望地址自动加,所以b2设置为0;
b1,b0共同决定数据的传输模式,我们要点亮vfd,
就要选择为写数据到显示模式,所以为00;
即这8个为由高到低为01001000,转换为16进制为0x40;


接下来是地址设置命令,也就是第三个命令 ,
两部分组成,最高的两位都为1,和其余六位组成地址,
数据组成应该为(11000000)+(b5 b4 b3 b2 b1 b0)
即(0xc0+地址)为要写入的命令,需要注意的是这个命令
发送完成后不能释放,紧跟着的是一个int型数据,这
也是屏幕显示的数据,后面介绍如何推算这个数据。


这里是缓存地址,没仔细看,试了试就试出来了,我的是
第一列的数据。




接下来是命令4 ,这个命令设置显示开关和亮度,比如说我要设置
成显示开启,脉宽为14/16,那么数据为10000111,因为高四位为定值,
所以数据组成为(10001000)+(b2 b1 b0),000到111对应数值为0~7
10001000转换为16进制后为0x88,即这个命令为0x88+x, x的取值为0~7,
x越大,亮度越高。




当执行完命令4后,屏幕就有显示了,前提是程序没有错误的情况下。

go on
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖提到的人: @毛栗子
本帖最近打赏记录:共5条打赏M币+43专家+1
关键词: VFDET16311
离线氢氟酸

发帖
4330
M币
9869
专家
29
粉丝
157
只看该作者 1楼 发表于: 02-26
这一楼教给大家一个方便获取数字码的方法,之前已经确定是16位数据,而且段码是按照位来点亮的,那么00000000 00000000就为全部熄灭,11111111 11111111就是全部点亮,当然一些位是没有用到的,把每一位转换为十进制,为1 2 4 8 16 32 ~65536,每一个数值对应一个位,首先测试出来点亮每一个位的段码值,如下图。


给缓存写对应的数值,对应段就会点亮,假如要显示0,则最外面一圈要点亮,写入数据为
2+4+8192+16384+512+64=25158=0x6246
即数字0的段码值就为0x6246,其他的以此类推,存储到数组中就可以了。
大家有不明白的就跟帖,刚开始玩单片机半年多,能力有限,一起学习,一起进步。

附件下载里的工程为MDK5编译,mdk4打不开。
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共3条打赏M币+35
离线氢氟酸

发帖
4330
M币
9869
专家
29
粉丝
157
只看该作者 2楼 发表于: 02-26
占楼编辑,未完待续

发帖
2516
M币
9734
专家
16
粉丝
101
只看该作者 3楼 发表于: 02-26
等待中!排排坐
在线liumiao73

发帖
33780
M币
8044
专家
9
粉丝
140
只看该作者 4楼 发表于: 02-26
点亮了,然后呢?
离线worldlyguest

发帖
1949
M币
6486
专家
5
粉丝
38
只看该作者 5楼 发表于: 02-26
等待中!排排坐2
红尘一客
离线木慕

发帖
537
M币
486
专家
0
粉丝
5
只看该作者 6楼 发表于: 02-26
等了好几天了,加油

内容来自Android手机客户端

离线yylvls

发帖
6102
M币
10074
专家
9
粉丝
190
只看该作者 7楼 发表于: 02-26
羡慕会单片机的技术流
离线ta89520

发帖
1643
M币
4278
专家
6
粉丝
90
只看该作者 8楼 发表于: 02-26
羡慕会单片机的技术牛人
离线mygodson

发帖
2062
M币
3485
专家
2
粉丝
30
只看该作者 9楼 发表于: 02-26
真羡慕你们这些技术性人才