📄 lcd2.c
字号:
/*
引脚连接
DATA=P0,RS=P2.0,RW=P2.1,E=P2.2,PSB=P2.3,RES=P2.4
*/
#include <reg51.h>
#include <intrins.h>
#include<lcdb.h>
#include<shuzi.h>
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit PSB = P2^3; //串并口选择
sbit RES = P2^4;
#define FIRST_ADDR 0 //定义字符/汉字显示起始位置
//延时子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//测忙
void chk_busy()
{ RS=0;
RW=1;
E=1;
while((P0&0x80)==0x80);
E=0;
}
//读数据
unsigned char lcdrd()
{ unsigned char i;
P3=0xFB;
_nop_();
E=1;
delay(5);
i=P0;
_nop_();
E=0;
return i;
}
//写数据
void lcdwd(unsigned char dispdata)
{ chk_busy();
_nop_();
RS=1;
RW=0;
E=1;
P0=dispdata;
delay(5);
_nop_();
E=0;
_nop_();
P0=0xff;
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{ chk_busy();
_nop_();
RS=0;
RW=0;
E=1;
P0=cmdcode;
delay(5);
_nop_();
E=0;
_nop_();
P0=0xff;
}
//初始化
void lcdreset()
{ delay(2000);
lcdwc(0x30); //选择基本指令集
lcdwc(0x30); //选择8bit数据流
delay(5);
lcdwc(0x0c); //开显示(无游标、不反白)
delay(5);
lcdwc(0x01); //清除显示,并且设定地址指针为00H
delay(5);
lcdwc(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzkdis(unsigned char code *s)
{ while(*s>0)
{ lcdwd(*s);
s++;
delay(500);
}
}
//整屏显示
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
void lcdfill(unsigned char disdata)
{ unsigned char x,y,ii;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y+0x80); //行地址
lcdwc(x+0x80+ii); //列地址
lcdwc(0x30);
lcdwd(disdata);
lcdwd(disdata);
}
}
//在任意位置显示任意图画 y1,x1,y2,x2为图画坐标,行数0-63,列数0-7, disdata为显示数据
void xiansi(unsigned char y1,unsigned char x1,unsigned char y2,unsigned char x2,unsigned char *disdata)
{ unsigned char x,y;
for(y=y1;y<=y2;y++)
for(x=x1;x<=x2;x++)
{ lcdwc(0x36);
if(y<32)
{ lcdwc(y+0x80); //行地址
lcdwc(x+0x80); //列地址
}
else //显示下半部分
{
lcdwc(y-32+0x80); //行地址
lcdwc(x+0x80+8); //列地址
}
lcdwc(0x30);
lcdwd(disdata[2*(x2-x1+1)*(y-y1)+2*(x-x1)]); //
lcdwd(disdata[2*(x2-x1+1)*(y-y1)+2*(x-x1)+1]); //
}
}
//y为显示的行,x为显示的列,x1,x2为显示的数字
void shuzi(unsigned char y,unsigned char x,unsigned char x1,unsigned char x2)
{
lcdwc(0x30);
lcdwc(dizhi[y]+x);
if(x1<=9)
lcdwd(number[x1]);
else lcdwd(32);
if(x2<=9)
lcdwd(number[x2]);//执行这2个语句DDRAM地址计数器自动加1;
else lcdwd(32);
}
//显示任意字符 y为显示的行,x为显示的列,s为显示的字符
void zifu(unsigned char y,unsigned char x,unsigned char code *s)
{
unsigned char i=0;
lcdwc(0x30);
lcdwc(dizhi[y]+x);
x=x*2;
while(*s>0)
{ lcdwd(*s);
s++;
x++;
if(x==16)
lcdwc(dizhi[y]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -