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

📄 vfd.c

📁 客显驱动程序,HT1621字码表 根据编码规则编制
💻 C
字号:
/***
*   vfd.c   - 客显驱动程序
*           - added by syj 2006/06/27
***/
#include "PublHead.h"

//HT1621编码规则
/***************************************************
 *
 *    -A
 *  F| |B
 *    -G         相对应的字节顺序为FGEDABCP 如:'0'字节码为0xbe
 *  E| |C
 *    -D  .P
 *
 ****************************************************/

#define VFD618_MAX_SIZE  12  //VFD最多可显示的字符

static BOOL IsOpenTime;     //是否显示时间
static U8 bakhour,bakmin,baksec;

//HT1621字码表 根据编码规则编制
//提供字码为'01234567890.1.2.3.4.5.6.7.8.9..-空格',共13字码
static U8 const VfdCodeTable[23] =
{
    0xbe,0x06,0x7c,0x5e,0xc6,0xda,0xfa,0x0e,0xfe,0xde,
    0xbf,0x07,0x7d,0x5f,0xc7,0xdb,0xfb,0x0f,0xff,0xdf,
    0x01,0x40,0x00
};

/*
 *函数  打开vfd显示时间开关
 */
extern void OpenVFDTime(void)
{
    IsOpenTime = TRUE;
    bakhour = 0xff;
    bakmin = 0xff;
    baksec = 0xff;
}

/*
 *函数  延时
 */
static void VFDDelay(Uchar i)
{
    while(i--);
}

static void VFDSendBit(Uchar bitcnt,Uchar dt)
{
    for( ; bitcnt ; bitcnt--)
    {
        if(dt & 0x80)
        {
            IO2SET = VFD_DAT;
        }
        else
        {
            IO2CLR = VFD_DAT;
        }
        dt <<= 1;
        IO2CLR = VFD_CLK;
        VFDDelay(1);
        IO2SET = VFD_CLK;
    }
}

/*
 *函数  写入指令
 */
static void VFDComm(Uchar comm)
{
    IO2CLR = VFD_CS;
    VFDSendBit(3,0x80);             // 100
    VFDSendBit(8,comm);
    IO2CLR = VFD_CLK;
    VFDDelay(1);
    IO2SET = VFD_CLK;
    IO2SET = VFD_CS;
}

/*
 *函数  写入数据
 */
static void VFDData(Uchar addr,Uchar value)
{
    IO2CLR = VFD_CS;
    VFDSendBit(3,0xA0);             // 101
    addr <<= 2;
    VFDSendBit(6,addr);
    VFDSendBit(8,value);
    IO2SET = VFD_CS;
}

/*
 *函数  客显清屏
 */
static void VFDClear(void)
{
    Uchar i;

    for(i=0 ; i<(VFD618_MAX_SIZE*2) ; i+=2)
    {
        VFDData(i,0x00);
    }
}

/*
 *函数  客显初始化
 */
static void Init_VFD618(void)
{
    VFDComm(0x00);  //00000000    System Disable
    VFDComm(0x01);  //00000001    System Enable
    VFDComm(0x03);  //00000011    LCD On
    VFDComm(0x04);  //00000100    Timer Disable
    VFDComm(0x05);  //00000101    WDT Disable
    VFDComm(0x08);  //00000101    Tone Off
    VFDComm(0x18);  //00011000    RC 256K
    VFDComm(0x29);  //00101001    Bias 1/3
    VFDComm(0x10);  //00011000    IRQ Disable
    VFDComm(0xe3);  //00011000    Normal Mode
    VFDClear();     //清屏
}

extern void Init_Vfd(void)
{
    if( IsUseVfd918() )
    {
        Init_VFD918();
    }
    else
    {
        Init_VFD618();
    }
    OpenVFDTime();  //显示时间
}

/*
 *函数  显示系统当前时间
 */
static void PutTimeToVFD618(void)
{
    DATETIME dttm;

    GetCurDateTime(&dttm);
    if(bakhour != dttm.Hour)
    {
        bakhour = dttm.Hour;
        VFDData( 0,VfdCodeTable[22]);
        VFDData( 2,VfdCodeTable[dttm.Hour / 0x10]);
        VFDData( 4,VfdCodeTable[dttm.Hour % 0x10]);
        VFDData( 6,VfdCodeTable[21]);
    }
    if(bakmin != dttm.Minute)
    {
        bakmin = dttm.Minute;
        VFDData( 8,VfdCodeTable[dttm.Minute / 0x10]);
        VFDData(10,VfdCodeTable[dttm.Minute % 0x10]);
        VFDData(12,VfdCodeTable[21]);
    }
    if(baksec != dttm.Second)
    {
       baksec = dttm.Second;
       VFDData(14,VfdCodeTable[dttm.Second / 0x10]);
       VFDData(16,VfdCodeTable[dttm.Second % 0x10]);
       VFDData(18,VfdCodeTable[22]);
       VFDData(20,VfdCodeTable[22]);
       VFDData(22,VfdCodeTable[22]);
    }
}

extern void PutTimeToVfd(void)
{
    if(IsOpenTime)
    {
        if(IsUseVfd918())
        {
            PutTimeToVFD918(&baksec);
        }
        else
        {
            PutTimeToVFD618();
        }
    }
}

/*
 *函数  显示结算金额
 *输入  buf 指针, len 长度,允许最多10字符
 */
static void PutCashToVFD618(S32 amt)
{
    String str[0x100];
    String * buf;
    Uchar i,len;

    len = sprintf(str,"%*ld.%02lu   ",VFD618_MAX_SIZE-5,(amt/100),(labs(amt))%100);
    buf = str;
    VFDClear();
    for(i=0 ; i<(VFD618_MAX_SIZE*2) ; i+=2)
    {
        Uchar idx;

        idx = 22;
        if(len)
        {
            Uchar ch;

            ch = *buf;
            buf++;
            len--;
            if((ch >= '0') && (ch <= '9'))
            {
                idx = ch - '0';
                if(len && (*buf == '.'))
                {
                    buf++;
                    len--;
                    idx += 10;
                }
            }
            else if(ch == '.')
            {
                idx = 20;
            }
            else if(ch == '-')
            {
                idx = 21;
            }
        }
        VFDData(i,VfdCodeTable[idx]);
    }
}

/*
 *函数  关闭vfd显示时间开关
 */
static void CloseVFDTime(void)
{
    IsOpenTime = FALSE;
}

extern void PutCashToVfd(S32 amt)
{
    if( IsUseVfd918() )
    {
        PutCashToVFD918(amt);
    }
    else
    {
        PutCashToVFD618(amt);
    }
    CloseVFDTime();
}

/*
 *函数  客显测试程序,供系统测试调用
 */
static void VFDTest(Uchar idx)
{
    Uchar i;

    idx %= 23;
    for(i=0 ; i<(VFD618_MAX_SIZE*2) ; i+=2)
    {
        VFDData(i,VfdCodeTable[idx]);
    }
}

static void SelfTest_VFD618(void)
{
    Uchar i;

    VFDClear();
    for(i=0 ; i<23 ; i++)
    {
        VFDTest(i);
        if(WaitTimeout(1000,KEY_CLR))
        {
            break;
        }
    }
}

extern void SelfTest_Vfd(void)
{
    CloseVFDTime();
    if(IsUseVfd918())
    {
        SelfTest_VFD918();
    }
    else
    {
        SelfTest_VFD618();
    }
    OpenVFDTime();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -