📄 lcd12864.c
字号:
#include <reg51.h>
#include <Text.h>
#include <intrins.h>
#define Dataport P0 //LCD数据线
sbit RS=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit EN=P2^0; // 读\写使能
sbit cs1=P2^4; // 片选1
sbit cs2=P2^3; // 片选2
void CheckState() //状态检查,LCD是否忙?
{
unsigned char dat;
RS=0;
RW=1;
do{
Dataport=0x00;
EN=1;
dat=Dataport;
EN=0;
dat=0x80&dat; //仅当第7位为0时才可操作(判别busy信号)
}while(!(dat==0x00));
}
SendCommandToLCD(unsigned char command) //写命令到LCD中
{
CheckState();
RS=0; //向LCD发送命令
RW=0;
Dataport=command; //command :命令
EN=1;
EN=0;
}
void SetLine(unsigned char page) //设置页 0xb8是页的首地址////////
{
page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
SendCommandToLCD(page);
}
void SetStartLine(unsigned char startline)//设定显示开始行,0xc0是行的首地址//////////
{
startline=0xc0|startline; //1100 0000
SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
}
void SetColumn(unsigned char column) //设定列地址--Y 0-63 ,0x40是列的首地址/////////
{
column=column &0x3f; //column最大值为64,越出 0=<column<=63
column= 0x40|column; //01xx xxxx
SendCommandToLCD(column);
}
void SetOnOff(unsigned char onoff) //开关显示,0x3f是开显示,0x3e是关显示
{
onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
SendCommandToLCD(onoff);
}
void WriteByte(unsigned char dat) //写显示数据
{
CheckState();
RS=1;
RW=0;
Dataport=dat;//dat:显示数据
EN=1;
EN=0;
}
void SelectScreen(unsigned char screen) //选择屏幕screen: 0-全屏,1-左屏,2-右屏
{
switch(screen)
{ case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左屏
_nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
}
}
void ClearScreen(unsigned char screen) //清屏screen: 0-全屏,1-左屏,2-右
{
unsigned char i,j;
SelectScreen(screen);
for(i=0;i<8;i++) //控制页数0-7,共8页
{
SetLine(i); //页
SetColumn(0); //开始列数
for(j=0;j<64;j++) //控制列数0-63,共64列
{
WriteByte(0x00); //写入 0,列地址自动加1
}
}
}
void InitLCD() //初始化LCD
{
CheckState();//检查LCD是否忙
SelectScreen(0);//选择全屏
SetOnOff(0); //关显示
SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(0);
ClearScreen(0);//清屏
SetStartLine(0); //开始行:0
}
//显示汉字
void Display(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
{
int i; //选屏参数,page选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
}
SetLine(page+1); //写下半页
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
}
}
void delay1()
{unsigned int i,j;
for(i=0;i<1000;i++)
for(j=0;j<100;j++)
;
}
void main()
{ int i;
InitLCD();
{ for(i=0;i<4;i++)
{
Display(2,0,i*16,i); //显示右半屏,第一页和第二页 ,
Display(1,0,i*16,i+4); //显示左半屏,第一页和第二页 ,
Display(2,0+2,i*16,i+8); //显示右半屏,第三页和第四页 ,
Display(1,0+2,i*16,i+12); //显示左半屏,第三页和第四页 ,
Display(2,0+2+2,i*16,i+16);
Display(1,0+2+2,i*16,i+20);
Display(2,0+2+2+2,i*16,i+24);
Display(1,0+2+2+2,i*16,i+28);
}
while(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -