📄 lcd.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 + -