📄 proj_8.c
字号:
//ZC-51学习板实验源程序
//LCM1602液晶屏显示--液晶屏
//http://www.ednchina.com/blog/zhichengdz/
//E-mail: zhicheng_dz@163.com
#include <reg52.h>
#include <intrins.h>
sbit RSPIN = P1^0; //数据/命令选择端
sbit RWPIN = P1^1; //读写控制信号
sbit EPIN = P1^2; //使能信号
unsigned char XPOS,YPOS;
unsigned char chbuff;
void delay1(unsigned int t) //延时
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void lcdwaitidle(void) //读写检测.对控制器每次进行读写操作之前,都必须进行,
{ P0=0xff;
RSPIN=0;
RWPIN=1;
EPIN=1;
//while((P0&0x80)==0x80); //确保STA7 为0
while((P0&0x01)==0x01); //确保STA7 为0
EPIN=0;
}
void lcdwcn(unsigned char c) //不判忙直接写指令
{ RSPIN=0;
RWPIN=0;
chbuff=0;
if (c&0x01) chbuff=chbuff|0x80;
if (c&0x02) chbuff=chbuff|0x40;
if (c&0x04) chbuff=chbuff|0x20;
if (c&0x08) chbuff=chbuff|0x10;
if (c&0x10) chbuff=chbuff|0x08;
if (c&0x20) chbuff=chbuff|0x04;
if (c&0x40) chbuff=chbuff|0x02;
if (c&0x80) chbuff=chbuff|0x01;
P0=chbuff;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdwc(unsigned char c) //判忙后写指令
{ lcdwaitidle();
lcdwcn(c);
}
void lcdwd(unsigned char d) //写数据
{ lcdwaitidle();
RSPIN=1;
RWPIN=0;
chbuff=0;
if (d&0x01) chbuff=chbuff|0x80;
if (d&0x02) chbuff=chbuff|0x40;
if (d&0x04) chbuff=chbuff|0x20;
if (d&0x08) chbuff=chbuff|0x10;
if (d&0x10) chbuff=chbuff|0x08;
if (d&0x20) chbuff=chbuff|0x04;
if (d&0x40) chbuff=chbuff|0x02;
if (d&0x80) chbuff=chbuff|0x01;
P0=chbuff;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdpos(void) //确定当前光标位置
{ XPOS&=0x0f;
YPOS&=0x03;
if(YPOS==0x00)
lcdwc(XPOS|0x80);
else if(YPOS==0x01)
lcdwc((XPOS+0x40)|0x80);
}
void lcdreset() //LCM初始化
{ delay1(150); lcdwcn(0x38); //写指令38H
delay1(50); lcdwcn(0x38); //写指令38H
delay1(50); lcdwcn(0x38); //写指令38H
lcdwc(0x38); //显示模式设置,设置16X2 显示,5X7 点阵,8 位数据接口
lcdwc(0x08); //显示关闭
lcdwc(0x01); //显示清屏
lcdwc(0x06); //显示光标移动设置
lcdwc(0x0f);//(0x0c); //显示开及光标设置
}
void lcdfill(unsigned char n) //向1602写一满屏字符
{
for(YPOS=0;YPOS<2;YPOS++)
for(XPOS=0;XPOS<16;XPOS++)
{ lcdpos();
lcdwd(n); }
}
void lcdchar(unsigned char x,unsigned char y,unsigned char ch) //在1602指定位置写一个字符
{
XPOS=x; YPOS=y;
lcdpos();
lcdwd(ch);
}
void lcdwda(unsigned char x,unsigned char y,unsigned char *s) //在1602指定位置写一行字符串
{ YPOS=y;
for(XPOS=x;XPOS<16;XPOS++)
{ lcdpos();
if (*s=='\0') return;
lcdwd(*s);
s++;
//delay1(5000);//(400);
}
}
void main () //主程序
{
EPIN=0;
lcdreset(); //LCM初始化
lcdwda(0,0,"ZC-51 StudyBoard");
lcdwda(0,1," LCM1602 Exp. ");
while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -