lcddrive.c

来自「一个分选系统的软件:用SmallRtos操作系统」· C语言 代码 · 共 635 行 · 第 1/2 页

C
635
字号
/*********************************************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: LCDDRIVE.C
**创   建   人: 刘宝贵
**最后修改日期: 2004年12月8日
**描        述: LCD驱动
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 刘宝贵
** 版  本: V1.00
** 日 期: 2004年12月8日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 刘宝贵
** 日 期: 2004年4月20日
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"
sbit LCDLS = P1^0;
sbit LCDRS = P1^1;
sbit LCDDI = P3^5;
sbit LCDRW = P3^6;
sbit LCDE  = P3^7;

uint8 code lcd_lattice16_8[]={0};
uint8 code lcd_lattice16_16[]={9};
uint8 code lcd_lattice8_8[]={0};
uint8 code mb[]={0};

bit DotNot;
uint8 xdata DeepOne;
uint8 xdata DeepTwo;
uint8 xdata DeepThree;
uint8 xdata MenuDeep;
bit RedrawLcd;
bit RedrawLcdFocus;
void lcddelay()
{
 //   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
/******************************************************************************/
void change_bin_to_bcd(uint16 temp,uint8 dotplace)
{
/*
    int8 i;
    for(i=5;i>0;i--)
    {
        image[i-1] = temp%10;
        temp/=10;
    }
    for(i=5;i>dotplace;i--)
    {
        image[i]=image[i-1];
    }
    if(dotplace<7)image[dotplace]=10;
    if(dotplace>4) image[5]=0xff;
    else image[6]=0xff;
*/
}
/******************************************************************************/
void outsi(uint8 parameter)
{
    LCDRS = 1;lcddelay();
//    LCDLS = 0;
    LCDDI = 0;lcddelay();
    LCDRW = 0;lcddelay();
    LCDE  = 1;lcddelay();
    P2    = parameter;lcddelay();
    LCDE  = 0;lcddelay();
    LCDRW = 1;lcddelay();
    LCDRS = 0;lcddelay();
//    LCDLS = 1;
}
/******************************************************************************/
void outsd(uint8 parameter)
{
    LCDRS = 1;lcddelay();
//    LCDLS = 0;
    LCDDI = 1;lcddelay();
    LCDRW = 0;lcddelay();
    LCDE  = 1;lcddelay();
    P2    = parameter;lcddelay();
    LCDE  = 0;lcddelay();
    LCDRW = 1;lcddelay();
    LCDRS = 0;lcddelay();
//    LCDLS = 1;
}
/******************************************************************************/
void outmi(uint8 parameter)
{
    LCDLS = 1;lcddelay();
//    LCDRS = 0;
    LCDDI = 0;lcddelay();
    LCDRW = 0;lcddelay();
    LCDE  = 1;lcddelay();
    P2    = parameter;lcddelay();
    LCDE  = 0;lcddelay();
    LCDRW = 1;lcddelay();
    LCDLS = 0;lcddelay();
//    LCDRS = 1;
}
/******************************************************************************/
void outmd(uint8 parameter)
{
    LCDLS = 1;lcddelay();
//    LCDRS = 0;
    LCDDI = 1;lcddelay();
    LCDRW = 0;lcddelay();
    LCDE  = 1;lcddelay();
    P2    = parameter;lcddelay();
    LCDE  = 0;lcddelay();
    LCDRW = 1;lcddelay();
    LCDLS = 0;lcddelay();
//    LCDRS = 1;
}
/******************************************************************************/
void lcdinit()                              /*left and right show open*/
{
    outmi(0x3f);
    outsi(0x3f);                               /*display on*/
}
/******************************************************************************/
/******************************************************************************/
void displayword(uint8 lcdrow,uint8 lcdline,uint8 wordnumber)
{                                                 /*display 16x16 word*/
    uint8 data i;
    uint16  data j;
    lcdinit();//                                  /*left and right show open*/
    if(lcdline<64)
    {
        outmi(0xc0);
        outmi(0xb8|lcdrow);                       /*设置页地址*/
        outmi(0x40|lcdline);                      /*设置列地址*/
        j=wordnumber*32;
        for(i=0;i<32;i++)
        {
            if(DotNot)outmd(~lcd_lattice16_16 [i+j]);
            else      outmd( lcd_lattice16_16 [i+j]);
            if(i==15)
            {
                outmi(0xb8|(lcdrow+1));           /*设置页地址*/
                outmi(0x40|lcdline);              /*设置列地址*/
            }
        }
    }
    else if(lcdline<128)
    {
        outsi(0xc0);                              /*设置显示起始行*/
        outsi(0xb8|lcdrow);                       /*设置页地址*/
        outsi(0x40|(lcdline-64));                 /*设置列地址*/
        j=wordnumber*32;
        for(i=0;i<32;i++)
        {
            if(DotNot)outsd(~lcd_lattice16_16[i+j]);
            else      outsd( lcd_lattice16_16[i+j]);
            if(i==15)
            {
                outsi(0xb8|(lcdrow+1));           /*设置页地址*/
                outsi(0x40|(lcdline-64));         /*设置列地址*/
            }
        }
    }
    else
    {}
}
/******************************************************************************/
/******************************************************************************/
void displaydata(uint8 lcdrow,uint8 lcdline,uint8 datanumber) /* display 16x8 data */
{
    uint8 data i;
    uint16  data j;
    if(lcdline<64)
    {
           //  outmi(0xc0);
        outmi(0xb8|lcdrow);                       /*设置页地址*/
        outmi(0x40|lcdline);                      /*设置列地址*/
        j=datanumber*16;
        for(i=0;i<16;i++)
        {
            if(DotNot==1)
            {
                outmd(~lcd_lattice16_8[i+j]);
            }
            else
            {
                outmd(lcd_lattice16_8[i+j]);
            }
            if(i==7)
            {
                outmi(0xb8|(lcdrow+1));           /*设置页地址*/
                outmi(0x40|lcdline);              /*设置列地址*/
            }
         }
    }
    else if(lcdline<121)
    {
         //  outsi(0xc0);                         /*设置显示起始行*/
        outsi(0xb8|lcdrow);                       /*设置页地址*/
        if(lcdline<121)
        {
            outsi(0x40|(lcdline-64));             /*设置列地址*/
        }
        j=datanumber*16;
        for(i=0;i<16;i++)
        {
            if(DotNot==1)
            {
                outsd(~lcd_lattice16_8[i+j]);
            }
            else
            {
                outsd(lcd_lattice16_8[i+j]);
            }
            if(i==7)
            {
                outsi(0xb8|(lcdrow+1));           /*设置页地址*/
                outsi(0x40|(lcdline-64));         /*设置列地址*/
            }
        }
    }
}
/******************************************************************************/
/******************************************************************************/
void displaybyte(uint8 lcdrow,uint8 lcdline,uint8 datanumber) /*display 8x8 data*/
{
    uint8 data i;
    uint16  data j;
    outmi(0xc0);
    outsi(0xc0);                                  /*设置显示起始行*/
    if(lcdline<64)
    {
        outmi(0xb8|lcdrow);                       /*设置页地址*/
        outmi(0x40|lcdline);                      /*设置列地址*/
        j=datanumber*8;
        for(i=0;i<8;i++)
        {
            outmd(lcd_lattice8_8[i+j]);
        }
    }
    else
    {
        outsi(0xb8|lcdrow);                       /*设置页地址*/
        outsi(0x40|(lcdline-64));                 /*设置列地址*/
        j=datanumber*8;
        for(i=0;i<8;i++)
        {
            outsd(lcd_lattice8_8[i+j]);
        }
    }
}
/******************************************************************************/
/******************************************************************************/
void displaycls(void)
{
    uint8 data i;
    uint8 data j;
    lcdinit();
    outmi(0xc0);
    outsi(0xc0);                                  /*设置显示起始行*/
    for(i=0;i<8;i++)
    {
        outmi(0xb8|i);                            /*设置页地址*/
        outmi(0x40|0);                            /*设置列地址*/
        for(j=0;j<64;j++)
        {
            outmd(0);
        }
    }
    for(i=0;i<8;i++)
    {
        outsi(0xb8|i);                            /*设置页地址*/
        outsi(0x40|0);                            /*设置列地址*/
        for(j=0;j<64;j++)
        {
            outsd(0);
        }
    }
}
/******************************************************************************/
/******************************************************************************/
void display_word_item(uint8 dlcdrow,uint8 dlcdline,uint8 item)
{
    uint8 i=0;
//    do
//    {
//        displayword(dlcdrow,(dlcdline+i*16), mb[item][i]);
//        i++;
//    }while(mb[item][i]!=0xff);
}
/******************************************************************************/
/******************************************************************************/
void display_data_item(uint8 dlcdrow,uint8 dlcdline,uint8 dotplace,uint16 temp)
{
    if(dotplace==1||temp>9)
    {
        do
        {
            displaydata(dlcdrow,dlcdline, temp%10);
            dlcdline-=8;
            temp/=10;
            if(--dotplace==0)
            {
                displaydata(dlcdrow,dlcdline, 10);
                dlcdline-=8;
            }
        }while(temp>=10);
        displaydata(dlcdrow,dlcdline, temp%10);

⌨️ 快捷键说明

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