📄 1602.c
字号:
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "1602.h"
void delayms(int ms)
{
int ii,jj;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<4338;jj++); //40MHz--1ms
}
/*********************************************
1602
**********************************************/
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
uchar bt(void)
{
uchar result;
DSFR = 0x00;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
delayms(1); //空操作
//空操作四个机器周期,给硬件反应时间
result=P0&0x80; //将忙碌标志电平赋给result
E=0;
DSFR=0xFF;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void write_com (uchar dictate)
{ //delayms(200);
while(bt()!=0); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(写指令时,
// 就是让E从0到1发生正跳变,所以应先置"0"
delayms(2); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
delayms(4); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
delayms(4); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void writeadd(uchar x)
{
write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void writedata(uchar y)
{
while(bt()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(写指令时,,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
delayms(4);
//空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
delayms(4); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void write_add_dat(uchar add,uchar dat)
{
writeadd(add);
writedata(dat);
}
void LcdInt(void)
{
delayms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delayms(5);
write_com(0x38);
delayms(5);
write_com(0x38); //3次写 设置模式
delayms(5);
write_com(0x0C); //显示模式设置:显示开,有光标,光标闪烁
delayms(5);
write_com(0x06); //显示模式设置:光标右移,字符不移
delayms(5);
write_com(0x01); // 清屏幕指令,将以前的显示内容清除
delayms(5);
}
void print(uchar *str)
{
while(*str!='\0')
{
writedata(*str);
str++;
}
}
void printstr(uchar x,uchar y,uchar *str)
{
if(y==0)
{
writeadd(0x00+x);
print(str);
}
else if(y==0)
{
writeadd(0x40+x);
print(str);
}
else
{
write_add_dat(0x01,'E');
write_add_dat(0x01,'R');
write_add_dat(0x02,'R');
write_add_dat(0x03,'O');
write_add_dat(0x04,'R');
write_add_dat(0x05,'!');
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -