📄 lcmtemp.c
字号:
/*==================================*/
/* 读状态,等待空闲 */
/*==================================*/
void read_1602_status(void)
{
LCM1602_DATA=0xFF;
LCM1602_RS=0;
LCM1602_RW=1;
LCM1602_E=0;
LCM1602_E=0;
LCM1602_E=1;
while(LCM1602_DATA&busy); //检测忙信号
}
/*==============================================================*/
/* LCM初始化 */
/*==============================================================*/
void initialize_1602(void)
{
write_1602_command(0x38,0); //三次显示模式设置,不检测忙信号
delay1602(10);
write_1602_command(0x38,0);
delay1602(10);
write_1602_command(0x38,0);
delay1602(10);
write_1602_command(0x38,1); //显示模式设置,开始要求每次检测忙信号
write_1602_command(0x08,1); //关闭显示
write_1602_command(0x01,1); //显示清屏
write_1602_command(0x06,1); // 显示光标移动设置
write_1602_command(0x0C,1); // 显示开及光标设置
}
/*==================================================================================*/
/* 按指定位置显示一个字符 */
/*==================================================================================*/
void display_1602_onechar(unsigned char x, unsigned char y, unsigned char d)
//x表示列、y 表示行
{
y &= 0x1;
x &= 0xF; //限制x不能大于15,y不能大于1
if (y) x |= 0x40; //当要显示第二行时地址码+0x40;
x |= 0x80; // 算出指令码
write_1602_command(x,0); //这里不检测忙信号,发送地址码
write_1602_data(d);
}
/*================================================================================*/
/* 按指定位置显示一串字符 */
/*================================================================================*/
void display_1602_listchar(unsigned char x, unsigned char y, unsigned char *d)
{
unsigned char ListLength;
ListLength=0;
y &= 0x1;
x &= 0xF; //限制x不能大于15,y不能大于1
while (d[ListLength]>=0x20&&ListLength<16) //若到达字串尾则退出
{
if (x <= 0xF) //x坐标应小于0xF(15)
{
display_1602_onechar(x, y, d[ListLength]); //显示单个字符
x++;
}
ListLength++;
}
}
//===============光标开关==================
/*void cursor_1602(unsigned char work)
{
if(work==1)write_1602_command(0x0f,1);
else if(work==0)write_1602_command(0x0c,1);
}
*/
//=========================================
//================清屏=====================
/*void clear_1602()
{
write_1602_command(0x01,0);
}
*/
//=========================================
//==============延时=======================
void delay1602(unsigned char t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<200;j++);
}
//=========================================
/*======================================================================================================================*/
/* 在指定的位置显示数字num */
/*======================================================================================================================*/
/*void display_1602_num(unsigned char x,unsigned char y,long int num)
{
long int n=num; //复制num以便操作
unsigned char cnum[]={' ',' ',' '}; //字符串cnum用于存放num各位数字的
char i,l;
if(num<0)n=-num; //若num<0,n取反
while(1) //计算数字长度l
{
if(n>0){n/=10;l++;}
else break;
}
if(num>=0)n=num;
else n=-num;
if(num<0){cnum[x]='-';x++;} //若num<0,则在x处写入负号,然后在x+1处显示数字
for(i=l-1;i>=0;i--) //num各位数存入cnum,最高位放在cnum[x];
{
cnum[x+i]=n%10+48;
n/=10;
}
display_1602_listchar(0,y,cnum); //显示num
} */
/*=======================================================================================================================*/
/*===========================================================================*/
/*函数功能:循环左(右)移动屏幕上的所有字符 */
/*参数说明:time为每移动一格时所需要的时间,direction为移动方向:0为左移,1为右移*/
/*===========================================================================*/
/*void movesreen_1602_rl(unsigned int time,unsigned char direction)
{
unsigned int i=0;
for(i=0;i<16;i++)
{
if(direction==0)
write_1602_command(0x18,1);
else if(direction==1)
write_1602_command(0x1c,1);
for(i=0;i<time;i++)
delay1602(10);
}
}
/*======================================================================*/
/* 以左移动的方式在第一行显示长于16字节的字符串 */
/*======================================================================*/
/*void movedata_1602_left(unsigned char *d)
{
unsigned int i=0,j=0,k=15,x=0,L=0;
for(;j<15;j++)
{
for(i=0;i<=j;i++)
{
display_1602_onechar(15-j+i,0,d[i]);
}
delay1602(100);
}
i=0;
while(d[i+15]>=0x20) //若到达字串尾则退出,后16字符交给下一个循环处理
{
for(x=0;x<16;x++,L++)
display_1602_onechar(x, 0, d[L+i]); //显示单个字符
delay1602(100);
L-=16;
i++;
};
for(i=0;i<16;i++)//处理剩下的16个字符
{
write_1602_command(0x18,1);
delay1602(100);
}
}
/*=======================================*/
/* 以逐行上移的方式显示文章 */
/*=======================================*/
/*void movedata_1602_up(unsigned char *d)
{
unsigned int i=0,j=0,k=0,work=0;
unsigned char Data1[16],Data2[16];
for(j=0;work==0;j+=16)
{
for(i=0;i<16;i++)
{
Data1[i]=d[i+j];
Data2[i]=d[i+16+j];
if(work)Data2[i]=' ';
if(Data2[i]<0x20){work=1;Data2[i]=' ';}
//最后一行没有字符的地方填满空格
}
display_1602_listchar(0,0,Data1);
display_1602_listchar(0,1,Data2);
for(k=0;k<5;k++)delay1602(100);
}
display_1602_listchar(0,0,Data2);
display_1602_listchar(0,1," ");
for(k=0;k<5;k++)delay1602(100);
write_1602_command(0x01,1);//显示完最后一行后清0
}
/*================================================*/
/* 以翻页的方式显示文章 */
/*================================================*/
/*void turnpage_1602(unsigned char *d)
{
unsigned int i=0,j=0,k=0,work=0;
unsigned char Data1[16],Data2[16];
for(j=0;work==0;j+=32)
{
for(i=0;i<16;i++)
{
Data1[i]=d[i+j];
Data2[i]=d[i+16+j];
if(work==1)Data2[i]=' ';
if(work==2)Data1[i]=' ';
if(Data2[i]<0x20){work=1;Data2[i]=' ';}
if(Data1[i]<0x20){work=2;Data1[i]=' ';}
}
display_1602_listchar(0,0,Data1);
display_1602_listchar(0,1,Data2);
for(k=0;k<5;k++)delay1602(100);
}
write_1602_command(0x01,1);//显示完最后一行后清0
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -