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

📄 lcd.c

📁 MCU为LPC2220,FLASH为39FV1601(地址0x80000000),外部一个SRAM(地址0x81000000)
💻 C
字号:
/***********************************************************************************
**液晶驱动V1.0
**8*8点阵为一个单元,而不区分汉字或字母
**y_pos行:0~7
**x_pos列:0~15
***********************************************************************************/
#include "config.h" 
#define di 29
#define rw 28
#define en 30
#define bl 31
#define csa 24
#define csb 25

#define di_down IO2CLR|=(1<<di)
#define di_up IO2SET|=(1<<di)
#define rw_down IO2CLR|=(1<<rw)
#define rw_up IO2SET|=(1<<rw)
#define en_down IO2CLR|=(1<<en)
#define en_up IO2SET|=(1<<en)
#define bl_down IO2CLR|=(1<<bl)
#define bl_up IO2SET|=(1<<bl)
#define csa_down IO2CLR|=(1<<csa)
#define csa_up IO2SET|=(1<<csa)
#define csb_down IO2CLR|=(1<<csb)
#define csb_up IO2SET|=(1<<csb)

//#define CONSOLE_ENGLISH 0x00
//#define CONSOLE_CHINESE 0x01 
#define  system_base 0x80000000
#define  GB2132_base 0x9000//汉字库放置的起始位置
#define  Acs_base    0x8000//ASCII码字库放置的起始位置 

uint8 LCD_CONSOLE;//语言设置保存
uint8 x_pos;//当前列号0~31,
uint8 y_pos;//行号0~7
uint8 menu_disp;//菜单选中项,0为无选择,1~4为选项
uint8 inversed_save;//记录已经反显的行号,0~7,偶数行有效,如2、3行为一行文字,反显的话,bit2=1,bit3无意义 
//#define  inversed_disp(menu)	inversed_save|=(1<<menu)
//#define  normal_disp(menu)	inversed_save&=(~(1<<menu))

/*--基本函数源程序------------------------------------------------------------------------------------*/
/*void inversed_disp(uint8 menu)	
{
    inversed_save|=(1<<menu);
}
void normal_disp(uint8 menu)	
{
    inversed_save&=(~(1<<menu));
}
//延时
void Lcdnop(void)
{
 int i;   
}*/
//开关背景光,TRUE开,FALSE关
void LCDBlackOn(uint8 onoff)
{
    if(onoff==TRUE)
        bl_up;    
    else
        bl_down;
}
uint8 LCDPinR(void) 
{
    uint32 tmp;
//输入
    IO2DIR&=0xff00ffff;
//读取
    //Lcdnop();
    tmp=IO2PIN;
    tmp=(tmp>>16)&0xff;
//输出0
    IO2DIR|=0x00ff0000;
    IO2CLR|=0x00ff0000;
    return tmp;
}
void LCDPinW(uint8 dat)
{
    uint32 tmp;
//输出    
    IO2DIR|=0x00ff0000;
    IO2CLR|=0x00ff0000;
    //Lcdnop();
    tmp=dat;
    tmp=(tmp<<16)&0x00ff0000;
    IO2CLR|=0x00ff0000;    
    IO2SET|=tmp;
}
/*----------------------------------------------------------------------------------------------------*/
//状态检查
void LCDCheckState()
{
    uint8 dat;
    di_down;
    rw_up;
    do{
        en_up;//Lcdnop(); 
        dat=LCDPinR(); en_down;
        dat=0x90 & dat; //仅当第4,7位为0时才可操作
    }while(!(dat==0x00));

}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void LCDWriteByte(uint8 dat)
{
    LCDCheckState();
    di_up; rw_down;
    LCDPinW(dat);
    en_up;//Lcdnop(); 
    en_down;
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
void LCDSendCommand(uint8 command)
{
    LCDCheckState();
    di_down;
    rw_down;
    LCDPinW(command);
    en_up;//Lcdnop(); 
    en_down;
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void LCDSetLine(uint8 line)
{
    line=line & 0x07; // 0<=line<=7
    line=line|0xb8; //1011 1xxx
    LCDSendCommand(line);
}
//设定列地址--Y 0-63
void LCDSetColumn(uint8 column)
{
    column=column &0x3f; // 0=<column<=63
    column=column | 0x40; //01xx xxxx
    LCDSendCommand(column);
}
//设定显示开始行--XX
void LCDSetStartLine(uint8 startline) //0--63
{
    startline=startline & 0x07;
    startline=startline|0xc0; //1100 0000
    LCDSendCommand(startline);
}

/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void LCDSelectScreen(uint8 screen)
{ //显示器:负有效 cs1: 0--左; cs2: 0--右
    switch(screen)
    { 
        case 0: csa_down;//全屏
            //Lcdnop();
            csb_down;
            //Lcdnop(); 
            break; 
        case 1: csa_down;//左屏
            //Lcdnop(); 
            csb_up;
            //Lcdnop();
            break;
        case 2: csa_up;//右屏
            //Lcdnop(); 
            csb_down;
            //Lcdnop(); 
            break;
        }
}
//开关显示
void LCDSetOnOff(uint8 onoff)
{
    LCDSelectScreen(0);
    onoff=0x3e | onoff; //0011 111x
    LCDSendCommand(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void LCDClearScreen(uint8 screen)
{ 
    uint8 i,j;
    LCDSelectScreen(screen);
    for(i=0;i<8;i++)
    { 
        LCDSetLine(i);
        for(j=0;j<64;j++)
            LCDWriteByte(0x00);
    }
}
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void LCDShow88(uint8 lin,uint8 column,const uint8 *dat)
{ 
    uint8 i;
    //uint8 *tmp;//=dat;
    //tmp=dat;
    if(column>16) {return;}
    if(column<8) 
        LCDSelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
    else
    {
        LCDSelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上
        column=column & 0x07; //防止越界
    }
    LCDSetLine(lin);
    LCDSetColumn(column<<3);
    for(i=0;i<8;i++) 
        LCDWriteByte( *dat++ );
}
//显示8*16点阵
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void LCDShowChar(uint8 lin,uint8 column,const uint8 * dat)
{
    /*const uint8 *da=dat;
    const uint8 *daa=dat+8;
    LCDShow88(lin<<1,column,da);
    LCDShow88((lin<<1)+1,column,daa);*/
    LCDShow88(lin<<1,column,dat);
    LCDShow88((lin<<1)+1,column,dat+8);    
}
void LCDShowHc(uint8 lin,uint8 column,const uint8 *dat)
{
   LCDShow88(lin<<1,column,dat);
    LCDShow88(lin<<1,column+1,dat+8);
    LCDShow88((lin<<1)+1,column,dat+16);
    LCDShow88((lin<<1)+1,column+1,dat+24);
}
//显示图片
//旋转90度 :字模被竖着切分
//startline :开始行
//startcolumn:开始列
//linechar :图片行点除8(图片以8*8点阵为单位)
//columnchar :图片列点除8(图片以8*8点阵为单位)
void LCDShowPicture(uint8 startline,uint8 startcolumn,uint8 linechar,uint8 columnchar,uint8 * dat)
{ 
   /* uint8 i,j;
    for(j=0;j<linechar;j++)
        for(i=0;i<columnchar;i++)
            LCDShow88(startline+j , startcolumn+i , dat+(j*columnchar+i)*8 );
*/}
/*********************
**液晶初始化
**清屏、重设光标到(0,0),无反显,菜单选项为0(无选项)。
**********************/
void LCDInit(void) //初始化LCD
{ 
    uint16 i=2500; //延时
    while(i--);
    IO2DIR|=0xf3ff0000;
    LCDSelectScreen(0);
    LCDSetOnOff(0); //关显示

    LCDClearScreen(1);//清屏
    LCDClearScreen(2);

    LCDSelectScreen(0);
    LCDSetOnOff(1); //开显示
    LCDSelectScreen(0);
    LCDSetStartLine(0); //开始行:0

    LCDSelectScreen(1);
    LCDSetLine(0);
    LCDSetColumn(0);
    LCDSelectScreen(2);
    LCDSetLine(0);
    LCDSetColumn(0);
}


⌨️ 快捷键说明

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