📄 1602.c
字号:
/*======缩写说明=========
PB---判别
SF---是否
ZL---指令
SJ---数据
QD---确定
WZ---位置
========================*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void Delay5Ms(void);
sbit RS = P1^0; // P10口接4脚,1-数据寄存器,0-指令寄存器
sbit RW = P1^1; // P11口接5脚,1-读操作,0-写操作
sbit E = P1^2; // P12口接6脚,使能
/*=========================
读忙子程序 RS=0 RW=1 E=1
=========================*/
bit PB_busy(void)
{
uchar temp ;
bit busy=1;
RS=0;
RW=1;
E=1;
while(busy)
{
E = 0 ;
temp = P2 ;
E = 1 ; //读忙
temp = temp & 0x80;
if(temp) busy=1; //当检测到忙,则一直检测,程序进入循环
else busy=0; //等待不忙
}
return busy; //返回忙标志,可能有用
}
/*==========================
写指令子程序 RS=0 RW=0 E=1
============================*/
void Write_ZL(uchar ZL)
{
if( !PB_busy() ) //判断不忙则写指令
{
RS=0; RW=0;
P2 = ZL ;
E=1;
E=0;
}
}
/*==========================
写单个数据 RS=1 RW=0 E=1
============================*/
void Write_SJ(uchar SJ)
{
if( !PB_busy() )
{
RS=1; RW=0;
P2 = SJ ;
E = 1 ;
E = 0 ;
}
}
/*===============================
确定字符位置字程序 x---列 y---行
================================*/
void QD_WZ(uchar x,uchar y)
{
uchar address;
if(y==0) address = 0x80 + x ; //x,y都从0计起
else address = 0xc0 + x ;
Write_ZL(address);
}
/*===============================
写字符串子程序(可以大于于17个字符)
=================================*/
void Write_SJS(uchar X,uchar Y,uchar *SJS)
{
uchar i,l=0; //l为数组长度
while(SJS[l]>31) l++ ; //1602内存的字符都大于31(00011111), 求出字符串的长度
for(i=0;i<l;i++)
{
QD_WZ(X,Y);
Write_SJ(SJS[i]);
X++;
if(X>=16) //多于16个字符
{
Y^=1 ; //换行
X = 0; //从第一个开始
}
}
}
/*=====
初试化:
=======*/
void Reset(void)
{
uchar n;
for(n=0;n<3;n++) //3次,不检测忙信号(故未直接用函数)
{
RS=0;RW=0;E=1;
P2=0x38; //八位总线,双行显示,显示5X10的点阵字符
E=1;E=0;
Delay5Ms();
};
Write_ZL(0x38); //需要检测忙信号
Write_ZL(0x0e);
Write_ZL(0x0d); //关显示
Write_ZL(0x01);
Delay5Ms();
// Write_ZL(0x01); //显示清屏
Write_ZL(0x06); //光标设置,光标右移,文字不移动
Delay5Ms();
Write_ZL(0x0c); //开显示,设置光标
/*未用到指令5*/
}
// 短延时
void Delay5Ms(void)
{
uint c=5552;
while(c--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -