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第二行的首地址,以此类推。