VFM202SDA1液晶显示模块驱动编程
1. 介绍
VFM202SDA1真空管荧光显示模块包括16字符*两行通过5*8的点阵显示,直流-直流/交流转换器和控制/驱动电路。
这个模块可以配置成Motorola M68并行接口,Intel I80并行接口,或同步串行接口。
字符产生器ROM提供240个5*8的字符和RAM为用户编程。VFD的亮度级可以通过功能设置指令的2位修改。
240个字形包括字母表,片假名,数字和其他符号。
这个模块有一个双端口RAM允许连续的数据和指令。因此,忙标志总是0,主机不需要读忙标志来判断模块是否忙。
2. 规格和性能
|
值 |
|
字符数 |
16字符*2行 |
|
字符规格 |
5*8点阵 |
|
显示区域 |
11.5*51.6mm |
|
字符大小 |
5.34*2.10mm |
|
字符间隔 |
6.16*3.30mm |
|
点大小 |
0.58*0.34mm |
|
点间隔 |
0.68*0.44mm |
|
光亮峰值波长 |
绿(波长=505nm) |
|
亮度 |
最小350cd/m*m |
最大500cd/m*m |
3. 摩托罗拉M68并行接口时序
图1.摩托罗拉M68并行接口写时序
图2.摩托罗拉M68并行接口读时序
本文是基于M68模式下的驱动控制,其他模式时序略。
4. M68模式
此模式中,用R/W和E控制信号来传送信息。指令/数据当R/W低时,E的下降沿写入;当R/W高时,E的上升沿后读出。
图3.M68典型4位接口时序
5. 指令
指令 |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
清屏 |
|
|
|
|
|
|
|
|
|
1 |
光标复位 |
|
|
|
|
|
|
|
|
1 |
* |
入口模式设置 |
|
|
|
|
|
|
|
|
I/D |
S |
显示开/关控制 |
|
|
|
|
|
|
1 |
D |
C |
B |
光标/显示移动 |
|
|
|
|
|
1 |
S/C |
R/L |
* |
* |
功能设置 |
|
|
|
|
1 |
DL |
N |
* |
BR1 |
BR0 |
CGRAM地址设置 |
|
|
|
1 |
CGRAM 地址 |
|||||
DDRAM地址设置 |
|
|
1 |
DDRAM 地址 |
||||||
地址记数器读 |
|
1 |
BF=0 |
AC |
||||||
DDRAM或CGRAM写 |
1 |
0 |
写数据 |
|||||||
DDRAM或CGRAM读 |
1 |
1 |
读数据 |
*为任意
6. 程序
//VFM202SDA1,LCM驱动程序
#include "REG52.h"
#include "LCD_Driver.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA_PORT P2 //LCD数据总线P2
//LCD,VFM202SDA1端口定义
sbit LCD_E = P1^7; //P1.7用于LCD使能控制
sbit LCD_RW = P1^6; //P1.6用于LCD读写控制
sbit LCD_RS = P1^5; //P1.5用于LCD数据指令控制
//==================================================
//函数:void LCD_RegWrite(unsigned char cmd)
//描述:发送一个控制命令到LCD
//参数:uchar cmd //指令
//返回:无
//作者:geoff 日期:2010/10/19
//修改:geoff 日期:2010/11/11
//版本:v1.2
//==================================================
void LCD_RegWrite(uchar cmd)
{
LCD_RS = 0; //RS置低,表示进行指令操作
LCD_RW = 0; //RW置低,表示进行写操作
LCD_E = 1; //E置高
LCD_DATA_PORT = cmd; //发送指令
LCD_E = 0; //E置低,产生下降沿跳变
}
//==================================================
//函数:void LCD_DataWrite(uchar dat)
//描述:写一个字节的显示数据至LCD中的显示缓冲RAM中
//参数:uchar dat //数据
//返回:无
//作者:geoff 日期:2010/10/19
//修改:geoff 日期:2010/11/11
//版本:v1.2
//==================================================
void LCD_DataWrite(uchar dat)
{
LCD_RS = 1; //RS置高,表示进行数据操作
LCD_RW = 0; //RW置低,表示进行写操作
LCD_E = 1; //E置高
LCD_DATA_PORT = dat; //发送数据
LCD_E = 0; //E置低,产生下降沿跳变
}
//==================================================
//函数:unsigned char LCD_DataRead(void)
//描述:从LCD中的显示缓冲RAM中读一个字节的数据
//参数:void
//返回:unsigned char
//作者:geoff 日期:2010/10/19
//修改:geoff 日期:2010/11/11
//版本:v1.2
//==================================================
uchar LCD_DataRead(void)
{
uchar dat; //存储从LCD缓冲区中读到的一个字节
LCD_DATA_PORT = 0xff; //数据输入到MCU端口前,要先给端口全置1
LCD_RS = 1; //RS置高,表示进行数据操作
LCD_RW = 1; //RW置高,表示进行读操作
// LCD_E = 0; //E置低
// LCD_E = 1; //E置高,产生上升沿跳变,即空读操作
LCD_E = 0; //E置低
LCD_E = 1; //E置高,产生上升沿跳变,数据载入总线
dat = LCD_DATA_PORT;//读数据
LCD_E = 0; //E置低
return dat;
}
//==================================================
//函数:void LCD_Init(void)
//描述:LCD初始化程序,设置模块中寄存器的初始状态
//参数:无
//返回:无
//作者:geoff 日期:2010/10/20
//修改:geoff 日期:2010/11/11
//版本:v1.2
//==================================================
void LCD_Init(void)
{
LCD_PortInit(); //LCD驱动所使用到的端口的初始化
LCD_RegWrite(0x01); //清屏
LCD_RegWrite(0x06); //显示移动禁用
LCD_RegWrite(0x0c); //显示开,光标关,字符闪烁关
LCD_RegWrite(0x38); //设置并口8位模式,显示行数2,亮度级100%
LCD_RegWrite(0x80); //DDRAM地址从0x80H开始
}
//==================================================
//函数:void TimeDelay(unsigned int time)
//描述:延时程序
//参数:unsigned int time
//返回:无
//作者:geoff 日期:2010/10/20
//修改:geoff 日期:2010/11/11
//版本:v1.2
//==================================================
void TimeDelay(uint time)
{
uint i;
do
{
for(i = 0;i < 1000;i++)
{
}
MCU_WDT = 1; //喂狗
MCU_WDT = 0;
time--;
}while(time > 0);
}
//==================================================
//函数:void LCD_PortInit(void)
//描述:与LCD连接的端口的初始化
//参数:无
//返回:无
//作者:geoff 日期:2010/10/20
//修改:geoff 日期:2010/11/11
//版本:v1.2
//==================================================
void LCD_PortInit(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 1;
}
//==================================================
//函数:void main(void)
//描述:主函数
//参数:无
//返回:无
//作者:geoff 日期:2010/11/08
//修改: 日期:
//版本:V1.1
//==================================================
void main(void)
{
LCD_Init(); //单片机LCD初始化
LCD_RegWrite(0x80); //发送指令指定显示地址
LCD_DataWrite(‘A’); //发送显示数据
}
主函数指定在LCD第一行的左边第一个位置显示字符A,0x80是LCD第一行的首地址,以此类推;0xc0是LCD第二行的首地址,以此类推。