⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 futaba.c

📁 FUTABA公司一款VFD显示屏的底层驱动
💻 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 + -