PT6311原理与应用分析
硬件结构
作为VFD显示控制及驱动器芯片,PT6311的核心功能仍然是实现VFD显示控制与驱动。芯片的硬件结构主要由扫描信号发生器、串行通信接口、控制模块、显示存储器、按键扫描值寄存器、通用输入寄存器、LED驱动器、VFD段/位驱动器等构成。PT6311内部电路原理框图如图1所示。
由图1及电路原理可知,SW输入端也可以作为四个单键的输入,即在按键数目不多于4个或者可以利用组合按键的情况下,这部分资源也可作为按键接口来利用。因此,PT6311实际提供两个键盘扫描的接口,一个是通常的矩阵式键盘接口,另一个就是开关信号输入端SW1~SW4。另外,PT6311还集成了外挂四个LED驱动功能。
图1 PT6311内部电路原理框图(略)
键盘接口
普通的键盘接法主要有两种:独立式和矩阵式。
(1)由通用开关量输入SW1~SW4构成四按键的独立式键盘。接法如图2(a)所示。
图2 键盘接法(略)
(2)由K1~K4与KS1~KS12所构成矩阵式键盘。键盘接法如图2(b)所示。
由图可见,PT6311的键盘接口所支持的最大键盘矩阵为4 12,即最大按键数目为48个。
PT6311的显存空间配置情况如图3所示。实际应用中,显存空间往往只是使用一部分,因为所使用的显存空间大小与设置的显示模式有关,图中的每一行对应一字,每一列对应八段即一个字节,相当于一段对应于一个字节的一位。另外,PT6311还有键扫描值寄存器、开关量输入寄存器和LED输出寄存器,这些寄存器的数据格式如图4所示。
图3 PT6311显存空间的地址配置(略)
图4 PT6311键值寄存器、SW输入及LED输出的格式(略)
片内的控制字
PT6311具有显示模式设置、数据设置、地址设置(针对显存)和显示控制等四种控制字。其中最高两位为指令特征位,由指令解码器来识别。
外部通信接口及信号时序
根据该芯片的电路结构,PT6311提供四线制串行接口与外部控制器通信,接口信号线分别为时钟CLK、输入数据DIN、输出数据DOUT和选通STB,通信的控制时序见后。接口电路连接如图5(a)所示。
图5 通信接口及信号时序(略)
根据PT6311与外部微控制器的接口协议,外部控制操作分为写入控制字、写入数据(包括显存及LED口)、读取数据(包括键值及通用输入SW口)。写入控制字/数据的时序如图5(b)所示,以地址自动增一方式连续写入显存数据的时序如图5(c)所示,读取数据的时序如图5(d)所示。
当然,键盘可根据需要选择挂接部分按键,但是,由前述内部键扫描存储器的对应关系,最好选择可以连续读取键值的区间,便于程序处理和减少读取时间和处理时间。
键扫描与VFD显示实用系统
结合键扫描与VFD显示控制等功能于一体的电子系统较常见,比如家庭影视音响系统、电梯等电子电器设备。一般而言,这些应用系统所采用的体系结构如图6所示。
图6 键扫描与VFD显示应用系统结构(略)
AC-3解码板的控制和面板显示系统的设计采用多键键盘和VFD显示器来作为人机接口,系统的原理框图与图6相似。
VFD显示与键扫描的编程实现
要使得PT6311应用系统能够正常、可靠地工作,在硬件体系基础上,PT6311还得通过编程来实现具体的功能。外部控制器控制PT6311实现预定的操作,实际上就是一种串口编程,这在编程实现时尤其要注意操作时序。当然,VFD显示与键扫描的具体编程还跟外部微控制器有关,这里给出AT89C52单片机的汇编编程实现的部分程序,并在程序中作了详细的注释以便读者更好地理解。
PT6311上电后,外接矩阵式键盘的键扫描和VFD显示均处于关闭状态,因此需要进行初始化设置,且至少要开启一次显示,则键扫描功能才能自动启动,此后若关闭显示键扫描仍会继续。
键扫描读取的编程实现
按键无论以独立式接入SW端口,还是以矩阵式接入键扫描专用端口,基于PT6311的键扫描编程都是类似的,故此处不再单独叙述。这里主要探讨PT6311外接矩阵式键盘的键扫描编程方法。
假设PT6311已启动,单片机从PT6311读取按键位置的编程(读取SW口只需修改指令,操作类似):
(1)、单键按键的编程实现
单键按键的键扫描无需把全部键扫描的结果读出,只要读到有键按下即可,因为不存在组合按键的情况则不可能有多键同时按下。于是,可以对键盘的按键进行编号,并按照PT6311键扫描寄存器的对应顺序及读取时序进行读取,只需检测是否有效按键并保存编号即可,而无需将全部键扫描值数据保存。具体程序段如下:
RD_KEYNUMBER:
MOV B,#RD_KEY_I;将键扫描值读取指令放入指令缓存,如读SW口,则只需修改指令
SETB RD_D
CLRADDR
CLR INCL_D;设置标志以调用单指令发送子程序
ACALL SEND_1BI_ND;调用单字节指令发送子程序,参见后面VFD显示控制的编程
MOV R6,#00H;R6保存按下键的单键编号
RDKEY_ON:
CPL CLK;指令发送完毕CLK=H,脉冲下降沿处PT6311输出数据DOUT
INC R6;键值取自然数
CPL CLK;脉冲上升沿后单片机读取数据可靠
JNB DOUT,NO_KEY;读取DOUT状态,判断有无键按下
SETB KEY_PRESSED;有键按下,则设置有效按键标志
AJMP EXIT
NO_KEY:
CJNE6,#KEYNUM_MAX,RDKEY_ON;是否扫描完毕所有按键,是则表示无键按下
CLR K_PRESSED
EXIT:
SETB STB
RET
退出该程序段后即可根据有无有效按键及键编号进行必要的按键响应处理。实际上,这个程序段就是实现一个逐位检测程序,判断是否有按键,有则记下按键编号,无则退出。
(2)、组合按键的编程实现
组合按键就是通常所称的“组合键”,即两个或者两个以上按键同时按下的按键方法。此时,按键的作用并不等于各个单键按下所代表的意思,而是一个由程序预先规定的新指令,常用于按键较少而需指令较多的场合。这种键值的读取一般要将全部键扫描值寄存器内容读出暂存并进行软件判决处理(查询是否有预定义的组合键),所以需要一定的暂存空间支持。
RD_MULTI_KEY:
……;这部分与单键扫描程序相同
MOV R0,#KEYNUM_MAX;R0作为键计数器,比如前面提到的系统KEYNUM_MAX=8
(……);此时根据键盘布局,增加避开无效数据的空操作
RDMKEY_ON:
CPL CLK; 指令发送完毕CLK=H,脉冲下降沿处PT6311输出数据DOUT
NOP
CPL CLK;脉冲上升沿后单片机读取数据可靠
MOVC,DOUT
RRC A
DJNZ R0,RDMKEY_ON
MOVKEY_VALUE,A
SETB STB
RET
……
ACALL MULTI_KEY_ID;组合键及单键的识别处理,根据按键情况作出相应处理以上程序是针对按键数据第一位输出即有效的情况,就是说按键布局对应于键值寄存器的开始端。如果不是这样,且按键布局对应键值寄存器的连续空间,则需要在程序读取数据开始时增加避开无效数据位的空操作。
从以上程序可知,其实单键扫描可以视为多键扫描的一种特殊情况。后面的按键识别处理程序要根据需要进行软件设计,比如最多的组合按键只有两个按键,则多于两个以上的按键组合就视为无效而无需作组合识别处理。
以上按键扫描程序一般放在定时中断服务程序中的,主要是为了方便延时去抖动。识别到有效单键或者组合键并作出响应后都需要处理重复按键问题,实际上我们一般都要作按键是否松开的识别处理或者按键间隔有效控制处理,主要是为了避免指令的过于频繁反复操作,尤其是大功率调整。
VFD显示控制的编程实现
假设显示内容已经放入DISPLAY_BUF_DATA,并且芯片已完成上电初始化设置,则单片机向PT6311发送指令与数据的通用程序段如下:(发送单字节指令可带有N(0≤N≤48)个字节数据的子程序)
SEND_1BI_ND:;发单字节指令可带N字节数据,用于初始化设置或修改显存内容
CLREA;发送过程禁止中断,确保发送过程完整
JNB ADDR,NO_ADDR;判断是否需要设置显存需要操作的始地址
CLR ADDR
MOV A,DISPLY_BUF_ADDR;取要操作的显存地址
OR A,#0C0H ;将要设置的地址与PT6311的指令特征位合并
MOV B,A;B作为发送字节缓存,也作为发送单字节指令的缓存
NO_ADDR:
CLR STB;启动发送过程
S_ON_D:
MOV A,B
MOV CNT,#08H ;用CNT作为位计数器,指示串行数据字节发送完毕与否
S_ON:
RRC A
CPL CLK;CLK初始化为H(高电平)
MOV DIN,C;按位将数据或指令的一位加载到串行数据线
CPL CLK;时钟上升沿发送
DEC CNT;发送的位计数器递减一
DJNZ CNT,S_ON;字节数据发送完否?否,则继续发送下一位
JNB INCL_D,S_OVER;发送完毕则判断是否后带数据,无则发送完毕
DJNZ R6,S_NEXT_BYTE
CLR INCL_D;清除后带数据的标志
MOV B,DISPLY_BUF_DATA;取得本次发送过程的最后一个字节
AJMP S_ON_D
S_NEXT_BYTE:
CLRC
MOV A,#DISPLY_BUF_DATA;单片机内的显存为DISPLAY_BUF_DATA开始的一段RAM空间
ADD A,R6
MOV R0,A
MOV B,@R0;这里的运算取得要发送的显示数据的下一个字节
AJMP S_ON_D
S_OVER:
JB RD_D,KEEP_STB;如果发送了读取数据指令,则保持STB为低,由读取程序置高
SETB STB
SETB EA;恢复允许中断设置
KEEP_STB:
RET
如果发送单字节的控制字,则设置ADDR=0,INCL_D=0,RD_D=0,B=指令,再调用该子程序即可。
|