📄 futaba.c
字号:
#include "includes.h"
#define GB_StartAddr 0x801C0000
#define VFD_CHIP_EN() {IO0CLR_bit.P0_12 = 1;} //芯片使能,
#define VFD_CHIP_DIS() {IO0SET_bit.P0_12 = 1;} //芯片禁能
#define VFD_CMD_EN() {IO0SET_bit.P0_11 = 1;} //写命令
#define VFD_DATA_EN() {IO0CLR_bit.P0_11 = 1;} //写数据
#define VFD_RST() IO0CLR_bit.P0_13 = 1;IO0SET_bit.P0_13 = 1
#define VFD_READ_SET() {IO0DIR &= ~(0xFF << 10);} //设置命令数据端口为读模式
#define VFD_READ_PORT (INT8U)(IO0PIN >> 10)
#define SCREEN1AND2_OFF 0x00 //屏1屏2关显示
#define SCREEN1_ON 0x01 //显示屏1
#define SCREEN2_ON 0x02 //显示屏2
#define SCREEN1AND2_ON 0x03 //屏1屏2开显示
#define ADDRESS_ADD 0x04 //读写地址自增
#define ADDRESS_HOLD 0x05 //读写地址保持
#define DATA_IN 0x08 //写数据
#define DATA_OUT 0x09 //读数据
#define SCREEN1_L 0x0A //设置屏1的起始地址低位字节
#define SCREEN1_H 0x0B //设置屏1的起始地址高位字节
#define SCREEN2_L 0x0C //设置屏2的起始地址低位字节
#define SCREEN2_H 0x0D //设置屏2的起始地址高位字节
#define ADDRESS_L 0x0E //读写地址的低位字节
#define ADDRESS_H 0x0F //读写地址的高位字节
#define OR_MODE 0x10 //或显示模式
#define EXOR_MODE 0x11 //异或显示模式
#define AND_MODE 0x12 //与显示模式
#define BRIGHTNESS 0x13 //亮度调节
#define RESET 0x14 //内部复位
/***********************************************************************
* 名称:VFD_WriteCommand()
* 功能:写命令子程序
* 入口参数:v_Command 要写入VFD的命令字
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
VFD_WriteCommand(v_Command)
{
VFD_CMD_EN();
VFD_CHIP_EN();
*(INT8U *)0x82000000 = v_Command;
VFD_CHIP_DIS();
}
/***********************************************************************
* 名称:VFD_WriteData()
* 功能:写数据子程序。
* 入口参数:v_Data 要写入VFD的数据
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
VFD_WriteData(v_Data)
{
VFD_DATA_EN();
VFD_CHIP_EN();
*(INT8U *)0x82000000 = v_Data;
VFD_CHIP_DIS();
}
void VFD_SetAddr(INT16U addr)
{
if (addr>2319)
addr-=2320;
VFD_WriteCommand(ADDRESS_L); VFD_WriteData(addr&0x00ff);
VFD_WriteCommand(ADDRESS_H); VFD_WriteData(addr>>8);
}
void VFD_SetDisp1(INT16U addr)
{
if (addr>2319)
addr-=2320;
VFD_WriteCommand(SCREEN1_L); VFD_WriteData(addr&0x00ff);
VFD_WriteCommand(SCREEN1_H); VFD_WriteData(addr>>8);
}
void VFD_SetDisp2(INT16U addr)
{
if (addr>2319)
addr-=2320;
VFD_WriteCommand(SCREEN2_L); VFD_WriteData(addr&0x00ff);
VFD_WriteCommand(SCREEN2_H); VFD_WriteData(addr>>8);
}
void VFD_Clear(void)
{
INT16U i=2320;
VFD_SetAddr(0x0000);
VFD_WriteCommand(DATA_IN);
while(i--)
{
VFD_WriteData(0x00);
}
VFD_SetAddr(0x0000);
}
void VFD_Init(void)
{
VFD_RST();
VFD_WriteCommand(RESET); VFD_WriteData(0x20);//!!!!
VFD_WriteCommand(SCREEN1AND2_OFF);//display 0ff
VFD_WriteCommand(BRIGHTNESS); VFD_WriteData(0x00);//100%
VFD_SetDisp1(0x0000);
VFD_Clear();
VFD_WriteCommand(SCREEN1_ON);//display on
}
/********************************************************************
* 名称:VFD_Dischar
* 功能:VFD显示一个16*16字符
* 输入: INT8U *Char,INT8U Row,INT8U Col
* 返回值: 无
* 说明:Row(1-4),Col(1-8)
***********************************************************************/
void VFD_Dischar(INT8U *Char,INT8U Row,INT8U Col)
{
INT16U * GB_Addr,addr;
INT8U i,j;
i = *(Char++);
j = *Char;
GB_Addr = (INT16U *)(30+GB_StartAddr+((i-0xA1)*94+j-0xA1)*32);
VFD_WriteCommand(ADDRESS_ADD);
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
addr = (8-Col)*8*16+(4-Row)*2+j*16+i;
VFD_SetAddr(addr);
VFD_WriteCommand(DATA_IN);
VFD_WriteData((*(GB_Addr)>>8)&0xFF);
VFD_SetAddr(addr+8);
VFD_WriteCommand(DATA_IN);
VFD_WriteData((*(GB_Addr--))&0xFF);
}
}
}
/********************************************************************
* 名称:VFD_DisLine
* 功能:VFD显示一行汉字,每行必须8个汉字,如不满8个用空白填充,空白字符ASCII(A1,A1)
* 调用: 无
* 输入: INT8U * Char,INT8U Row
* 返回值: 无
***********************************************************************/
void VFD_DisLine(INT8U * Char,INT8U Row)
{
INT16U Col;
for(Col=1;Col<9;Col++)
{
VFD_Dischar(Char,Row,Col);
Char++;Char++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -