📄 1602drive.c
字号:
///////////////////////1602驱动函数//////////////////////////////////////
//////////////////////////////////////////////////////////////
// 函数原型:print(ucahr *string);
// 输出字符串,超过16个字符时自动移入第二行
// printone(uchar x,uchar y,ucahr Data);
// 在指定的位置(x,y)输出一个字符
// lcm_init(void);
// 要调用本函数时,必须在main()初始化阶段调用 lcm_init() 初始化 1602
//////////////////////////////////////////////////////////////////////////
#include "myreg51.h"
#define E P3_5
#define RW P3_6
#define RS P3_7
#define Data_port P1
void delayms(uint time) //延时为5ms的整数倍
{
uint _5ms=300;
while(time--)
{
while(_5ms--);
}
}
void checkbusy(void) //读状态
{ //每次写指令,读写数据之前均需检测忙信号
Data_port=0xff;
RS=0;
RW=1;
E=0;
E=0;
E=1;
while(Data_port&0x80);
}
void Writedata(uchar d) //写数据
{
checkbusy();
Data_port=d;
RS=1;
RW=0;
E=0;
E=0;
E=1;
}
void Writecmd(uchar cmd) //写命令
{
checkbusy();
Data_port=cmd;
RS=0;
RW=0;
E=0;
E=0;
E=1;
}
void lcm_init(void)
{
delayms(3);
Data_port=0;
Writecmd(0x38); //必要的三次命令
delayms(1);
Writecmd(0x38);
delayms(1);
Writecmd(0x38);
delayms(1);
Writecmd(0x38);
Writecmd(0x08);
Writecmd(0x01);
Writecmd(0x06);
Writecmd(0x0c);
Writecmd(0x01);
delayms(1);
}
void printone(uchar x,uchar y,uchar d) //x的范围为0-15
{
uchar a;
y&=0x01;
x&=0x0F;
if(y)x=x|0x40; //关键部分!!!
a=x|0x80;
Writecmd(a);
Writedata(d);
}
void print(uchar *string)
{
uchar i=0,y=0,j=0;
Writecmd(0x01);
for(;string[i]!='\0'&&i<=15;i++)
{
printone(i,y,string[i]);
}
j=i;
if(j>=15)
{
i=0;
for(;string[j+i]!='\0'&&i<=15;i++)
{
printone(i,1,string[i+j]);
}
delayms(5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -