📄 lcd.h
字号:
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define IN_DBUS() {DDRA=0x00;PORTA=0xff;}
#define OUT_DBUS() DDRA=0xff
#define LCDDAT PORTA
#define LCDDATIN PINA
#define DI1 PORTC|=0x01
#define DI0 PORTC&=~0x01
#define RW1 PORTC|=0x02
#define RW0 PORTC&=~0x02
#define E1 PORTC|=0x04
#define E0 PORTC&=~0x04
#define CS1_1 PORTC|=0x08
#define CS1_0 PORTC&=~0x08
#define CS2_1 PORTC|=0x10
#define CS2_0 PORTC&=~0x10
#define REST1 PORTC|=0x20
#define REST0 PORTC&=~0x20
uchar LCD_X,LCD_Y;
/*************LCD***************/
void writelcd(uchar dat)
{
E0;
RW0;
E1;
LCDDAT=dat; del(1);
E0;
}
void writelcdcon(uchar dat)
{
DI0;
CS1_1;CS2_1;
writelcd(dat);
}
void writelcddat(uchar dat)
{
DI1;
writelcd(dat);
}
void restlcd(void)
{
REST1;
delay(1);
REST0;
delay(10);
REST1;
}
void lcdon(void)
{
DI0;
CS1_1;CS2_1;
writelcd(0x3f);
}
void lcdoff(void)
{
DI0;
CS1_1; CS2_1;
writelcd(0x3E);
}
void fromx(uchar dat)
{
DI0;
CS1_1;CS2_1;
writelcd(dat|0xC0);
}
void sety(uchar dat)
{
DI0;
writelcd(0xB8|dat);
}
void setx(uchar dat)
{
if(dat<64)
{CS1_1;CS2_0;}
else
{CS1_0;CS2_1;dat-=64;}
DI0;
writelcd(0x40|dat);
}
void w8(uchar x,uchar y,uchar dat)
{
setx(x);
sety(y);
writelcddat(~dat);
WDR();
}
void clrlcd(void)
{
uchar i,j;
for(j=0;j<8;j++)
for(i=0;i<128;i++)
{
w8(i,j,0x0);
}
}
void clr_row(uchar row,uchar a,uchar b)
{
uchar i;
CS1_1,CS2_1;
for(i=a;i<b;i++)
w8(i,row,0);
}
uchar dis_en(uchar x,uchar y,uchar c)
{
uchar i;
const uchar *p;
//*取指针
if(c>='A'&&c<='Z')
{
p=&A_Z[(c-'A')*5];
}
else if (c>='a' && c<='z')
{
p=&a_z[(c-'a')*5];
}
else if (c>='0' && c<='9')
{
p=&num0_9[(c-'0')*5];
}
else
{
switch (c)
{
case '.':p=x_p;break;
case ':':p=x_mh;break;
case '_':p=x_ds;break;
case '^':p=x_shang;break;
case '~':p=x_xia;break;
case '/':p=x_xg;break;
default:p=space;break;
}
}
for(i=0;i<5;i++)
w8(x+i,y,p[i]);
return x+5;
}
//返回操作后的x(列)坐标值
uchar dis_en_row(uchar x,uchar y,uchar *p)
{
uchar i,cnt=x;
for(i=0;p[i]!=0;i++)
{
if(cnt>127) {cnt=0;y++;}
cnt=dis_en(cnt,y,p[i]);
}
return cnt;
}
uchar dis_num(uchar x,uchar y,uchar c)
{
uchar i;
for(i=0;i<5;i++)
{
w8(x+i,y,num0_9[(5*c)+i]);//num0_9[c*5+i]);
}
return x+5;
}
uchar dis_5(uchar x,uchar y,unit dat)
{
uchar num[5]={10};
uchar i,n=0,lock=0,ent=x;
for(i=0;i<5;i++)
{
num[i]=dat%10;
dat/=10;
}
for(i=5;i>1;i--)
{
if((num[i-1]>0&&num[i-1]<10)||(lock==1))
{
lock=1;
dis_num(x+n*5,y,num[i-1]);
n++;
ent+=5;
}
}
dis_num(x+n*5,y,num[0]);
return ent+5;
}
uchar disen(uchar x,uchar y,uchar ASD)
{
uchar i,j;
ASD=ASD-0x20;
for(i=0;i<2;i++)
for(j=0;j<8;j++)
{
w8(x+j,y+i,ASCII[(unit)ASD*2+i][j]);
}
return x+8;
}
uchar disen_row(uchar x,uchar y,uchar *ASD) //显示ASCLL字符串
{
uchar k=0,n;
while(*(ASD+k)!=0x00)
{
n=disen(x+8*k,y,ASD[k]);
k++;
}
return n;
}
uchar disnum(uchar x,uchar y,uchar ASD)
{
uchar i,j;
ASD=ASD+0x10;
for(i=0;i<2;i++)
for(j=0;j<8;j++)
{
// w8(x+j,y+i,ASCII[ASD*2+i][j]);
}
return x+8;
}
uchar dis5(uchar x,uchar y,unit dat)
{
uchar num[5]={10};
uchar i,n=0,lock=0,ent;
for(i=0;i<5;i++)
{
num[i]=dat%10;
dat/=10;
}
for(i=5;i>1;i--)
{
if((num[i-1]>0&&num[i-1]<10)||(lock==1))
{
lock=1;
ent=disnum(x+n*8,y,num[i-1]);
n++;
}
}
ent=disnum(x+n*8,y,num[0]);
return ent;
}
uchar dis_hz(uchar x,uchar y,const uchar *hz)
{
uchar i;
uchar t[32];
for(i=0;i<32;i++)
t[i]=hz[i];
for(i=0;i<16;i++)
w8(i+x,y,t[i]);
for(i=0;i<16;i++)
w8(i+x,y+1,t[i+16]);
return x+16;
}
//*显示一行汉字,从y开始显示
uchar dis_hz_row(uchar x,uchar row,const uchar **hz)
{
uchar i,j,n=x;
for(i=0;hz[i]!=NULL;i++)
{
dis_hz(i*16+x,row,hz[i]);
n+=16;
}
return n;
}
///*画点函数
void DRAW_DOT(uchar x,uchar y) //*128*64*
{
uchar y_date;
LCD_Y=y/8;y_date=y%8;y_date=0x01<<y_date;
LCD_X=x;
w8(LCD_X,LCD_Y,y_date);
}
uchar read_x(uchar row, uchar line)//*读制定行,列的数据
{
uchar c;
sety(line);
setx(row);
//*读取数据
// IN_DBUS(); /*设置为输入
DI1; //*数据模式*
RW1; //*读操作*
//*第一次读
E0;
del(1); //*延迟1us
E1;
del(1);
E0;
del(1);
//*第二次读*
E0;
del(1); //*延迟1us
E1;
del(5);
c=PIND;
E0;
del(1);
//***********
RW0;
OUT_DBUS();
return c;
}
void write_p(uchar x,uchar y,uchar i)
{
uchar c;
//*read_x里面用的参数就是第二屏幕的,置操作第二屏幕*
c=read_x((uchar)(x>>3),y);
if(i=='\0')
{
c&=~(1<<(x&7));
}
else if(i=='\1')
{
c|=(1<<(x&7));
}
else
{
c^=(1<<(x&7));
}
w8(y,(uchar)(x>>3),c);
}
void initlcd(void)
{
CS1_1; CS2_1;
restlcd();
lcdoff();
lcdon();
fromx(0);
clrlcd();
}
/*************LCD***************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -