📄 lcdcmd.c
字号:
//LcdCmd.c
#include "LcdCmd.h"
#include "BasicOperation.h"
unsigned char page;
unsigned char column;
//写指令
void write_injunction(unsigned char lr,unsigned char inj)
{
//P2=lr;
if(lr==right)
{
RightSet;
LeftNotSet;
}
else
{
RightNotSet;
LeftSet;
}
//r_w=0;
WriteSelect;
//d_i=0;
InsBusSelet;
//data_port=inj;
DataPortDIR=0xff;
DataPortOut=inj;
//_e=1;
LcdEnable;
//_e=0;
LcdDisable;
}
//读状态
unsigned char read_state(unsigned char lr)
{
unsigned char read_data;
if(lr==right)
{
RightSet;
LeftNotSet;
}
else
{
RightNotSet;
LeftSet;
}
//r_w=1;
ReadSelect;
DataPortDIR=0x00;//跟在他后面比较合理
//d_i=0;
InsBusSelet;
//_e=1;
LcdEnable;
read_data=DataPortIn;
//_e=0;
LcdDisable;
return(read_data);
}
//写显示数据
void write_display(unsigned char lr,unsigned char dat)
{
//P2=lr;
if(lr==right)
{
RightSet;
LeftNotSet;
}
else
{
RightNotSet;
LeftSet;
}
//r_w=0;
WriteSelect;
//d_i=1;
DataBusSelet;
//data_port=dat;
DataPortDIR=0xff;
DataPortOut=dat;
//_e=1;
LcdEnable;
//_e=0;
LcdDisable;
}
//读显示数据
unsigned char read_display(unsigned char lr)
{
unsigned char read_data;
//P2=lr;
if(lr==right)
{
RightSet;
LeftNotSet;
}
else
{
RightNotSet;
LeftSet;
}
//r_w=1;
ReadSelect;
//d_i=1;
DataBusSelet;
//_e=1;
LcdEnable;
//read_data=data_port;
DataPortDIR=0x00;
read_data=DataPortIn;
//_e=0;
LcdDisable;
return(read_data);
}
//忙判断
void inquire_busy(unsigned char lr)
{
while(read_state(lr)&0x80);
}
//初始化
void InitLcd(void)
{
//_e=0;
LcdDisable;
//添加
P2DIR=0xf8;
P2SEL=0x00;
P6SEL=0x00;
//r_w=1;
ReadSelect;
//d_i=1;
DataBusSelet;
inquire_busy(left);
write_injunction(left,0x3f); //开显示
inquire_busy(right);
write_injunction(right,0x3f);
inquire_busy(left);
write_injunction(left,0xb8); //设置起始行
inquire_busy(right);
write_injunction(right,0xb8);
inquire_busy(left);
write_injunction(left,0x40); //设置起始列
inquire_busy(right);
write_injunction(right,0x40);
inquire_busy(left);
write_injunction(left,0xc0); //设
inquire_busy(right);
write_injunction(right,0xc0);
}
//清屏
void ClearScreen()
{
unsigned char i,l;
for(i=0;i<8;i++)
{
page=i;
page|=0xb8;
inquire_busy(left);
write_injunction(left,page); //设页地址
inquire_busy(left);
write_injunction(left,0x40); //设置列地址
for(l=0;l<64;l++)
write_display(left,0x00);
}
for(i=0;i<8;i++)
{
page=i;
page|=0xb8;
inquire_busy(right);
write_injunction(right,page); //设页地址
inquire_busy(right);
write_injunction(right,0x40); //设置列地址
for(l=0;l<64;l++)
write_display(right,0x00);
}
}
//图片显示
void image_display(unsigned char *ch)
{
unsigned char j,l;
page=0xb8;
column=0x40;
inquire_busy(left);
write_injunction(left,page);
inquire_busy(right);
write_injunction(right,page);
inquire_busy(left);
write_injunction(left,column);
inquire_busy(right);
write_injunction(right,column);
for(j=0;j<8;j++)
{
for(l=0;l<64;l++)
{
write_display(left,*ch);
ch++;
}
for(l=0;l<64;l++)
{
write_display(right,*ch);
ch++;
}
inquire_busy(left);
write_injunction(left,++page);
inquire_busy(right);
write_injunction(right,page);
inquire_busy(left);
write_injunction(left,column);
inquire_busy(right);
write_injunction(right,column);
}
}
//滚动显示
void roll(void)
{
unsigned char i;
while(1)
{
for(i=0xc0;i!=0;i++)
{
inquire_busy(left);
write_injunction(left,i);
inquire_busy(right);
write_injunction(right,i);
delay(5);
}
}
}
//读出数据并回写
void re_write(void)
{
unsigned char ch[64];
unsigned char i,l;
for(i=0;i<8;i++) //左屏
{
page=i;
page|=0xb8;
inquire_busy(left);
write_injunction(left,page); //设页地址
inquire_busy(left);
write_injunction(left,0x40); //设列地址
inquire_busy(left); //假读
read_display(left);
for(l=0;l<64;l++)
{
inquire_busy(left);
ch[l]=read_display(left);
}
inquire_busy(left);
write_injunction(left,0x40); //设列地址,必须设,否则会从最后一个地址向第一个地址回写
for(l=0;l<64;l++)
{
inquire_busy(left);
write_display(left,ch[l]); //回写
}
}
for(i=0;i<8;i++) //右屏
{
page=i;
page|=0xb8;
inquire_busy(right);
write_injunction(right,page); //设页地址
inquire_busy(right);
write_injunction(right,0x40); //设列地址,必须设
inquire_busy(right);
read_display(right); //假读
for(l=0;l<64;l++)
{
inquire_busy(right);
ch[l]=read_display(right);
}
inquire_busy(right);
write_injunction(right,0x40); //设列地址
for(l=0;l<64;l++)
{
inquire_busy(right);
write_display(right,ch[l]); //回写
}
}
}
void TitleDisplay(unsigned char row,unsigned char* RowData,unsigned char number,unsigned char m_bReverse)//显示一行的数据
{
//row 为行号(一共有4行),RowData为一行数据的起始地址
unsigned char i;
page=0xb8|row<<1;
column=0x40;
for(i=0;i<number;i++)
{
if(i==4)
column=0x40;
if(i<4)
WriteOneChar(RowData,left,column,m_bReverse);//写一个汉字
else
WriteOneChar(RowData,right,column,m_bReverse);//写一个汉字
column+=16;
RowData+=32;
}
}
void WriteOneChar(unsigned char* CharData,unsigned char lr,unsigned char columnTmp,unsigned char m_bReverse)//写一个汉字
{
//unsigned char m_bReverse指是否反显
unsigned char i;
inquire_busy(lr);
write_injunction(lr,columnTmp);
inquire_busy(lr);
write_injunction(lr,page); //设页地址
for(i=0;i<16;i++)
{
inquire_busy(lr);
if(m_bReverse==0)
write_display(lr,*(CharData++));
else
write_display(lr,~(*(CharData++)));
}
inquire_busy(lr);
write_injunction(lr,columnTmp);
inquire_busy(lr);
write_injunction(lr,page+1); //设页地址
for(i=0;i<16;i++)
{
inquire_busy(lr);
if(m_bReverse==0)
write_display(lr,*(CharData++));
else
write_display(lr,~(*(CharData++)));
}
}
void WriteTitleScreen(LCD_DISPLAY_XFER* level)//写一层带有标题的屏幕
{
unsigned char i;
unsigned char m_bReverse;
for(i=0;i<level->TitleNumber;i++)
{
if(i==level->SelectedTitle)
m_bReverse=1;
else
m_bReverse=0;
TitleDisplay(i,level->pTiltle[i],7,m_bReverse);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -