51单片机学习:LCD1602液晶显示实验

发布日期:2023-03-11
51单片机学习:LCD1602液晶显示实验

电工优优今天要和大家分享的单片机相关信息,接下来我将从51单片机学习:LCD1602液晶显示实验这个方面来介绍。

实验名称:LCD1602液晶显示实验接线说明:实验现象:下载程序后,LCD1602上显示字符信息注意事项:***************************************************************************************/#include "public.h"#include "lcd1602.h"

/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){lcd1602_init();//LCD1602初始化lcd1602_show_string(0,0,"Hello World!");//第一行显示lcd1602_show_string(0,1,"0123456789");//第二行显示while(1){}}

#include "lcd1602.h"

/******************************************************************************** 函 数 名 : lcd1602_write_cmd* 函数功能 : LCD1602写命令* 输 入 : cmd:指令* 输 出 : 无*******************************************************************************/#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCDvoid lcd1602_write_cmd(u8 cmd){LCD1602_RS=0;//选择命令LCD1602_RW=0;//选择写LCD1602_E=0;LCD1602_DATAPORT=cmd;//准备命令delay_ms(1);LCD1602_E=1;//使能脚E先上升沿写入delay_ms(1);LCD1602_E=0;//使能脚E后负跳变完成写入}#else //4位LCDvoid lcd1602_write_cmd(u8 cmd){LCD1602_RS=0;//选择命令LCD1602_RW=0;//选择写LCD1602_E=0;LCD1602_DATAPORT=cmd;//准备命令delay_ms(1);LCD1602_E=1;//使能脚E先上升沿写入delay_ms(1);LCD1602_E=0;//使能脚E后负跳变完成写入LCD1602_DATAPORT=cmd<<4;//准备命令delay_ms(1);LCD1602_E=1;//使能脚E先上升沿写入delay_ms(1);LCD1602_E=0;//使能脚E后负跳变完成写入}#endif

/******************************************************************************** 函 数 名 : lcd1602_write_data* 函数功能 : LCD1602写数据* 输 入 : dat:数据* 输 出 : 无*******************************************************************************/#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCDvoid lcd1602_write_data(u8 dat){LCD1602_RS=1;//选择数据LCD1602_RW=0;//选择写LCD1602_E=0;LCD1602_DATAPORT=dat;//准备数据delay_ms(1);LCD1602_E=1;//使能脚E先上升沿写入delay_ms(1);LCD1602_E=0;//使能脚E后负跳变完成写入}#elsevoid lcd1602_write_data(u8 dat){LCD1602_RS=1;//选择数据LCD1602_RW=0;//选择写LCD1602_E=0;LCD1602_DATAPORT=dat;//准备数据delay_ms(1);LCD1602_E=1;//使能脚E先上升沿写入delay_ms(1);LCD1602_E=0;//使能脚E后负跳变完成写入LCD1602_DATAPORT=dat<<4;//准备数据delay_ms(1);LCD1602_E=1;//使能脚E先上升沿写入delay_ms(1);LCD1602_E=0;//使能脚E后负跳变完成写入}#endif

/******************************************************************************** 函 数 名 : lcd1602_init* 函数功能 : LCD1602初始化* 输 入 : 无* 输 出 : 无*******************************************************************************/#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCDvoid lcd1602_init(void){lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动lcd1602_write_cmd(0x01);//清屏}#elsevoid lcd1602_init(void){lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动lcd1602_write_cmd(0x01);//清屏}#endif

/******************************************************************************** 函 数 名 : lcd1602_clear* 函数功能 : LCD1602清屏* 输 入 : 无* 输 出 : 无*******************************************************************************/void lcd1602_clear(void){lcd1602_write_cmd(0x01);}

/******************************************************************************** 函 数 名 : lcd1602_show_string* 函数功能 : LCD1602显示字符* 输 入 : x,y:显示坐标,x=0~15,y=0~1;str:显示字符串* 输 出 : 无*******************************************************************************/void lcd1602_show_string(u8 x,u8 y,u8 *str){u8 i=0;

if(y>1||x>15)return;//行列参数不对则强制退出

if(y<1) //第1行显示{while(*str!='')//字符串是以''结尾,只要前面有内容就显示{if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示{lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置}else{lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置}lcd1602_write_data(*str);//显示内容str++;//指针递增i++;}}else //第2行显示{while(*str!=''){if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示{lcd1602_write_cmd(0x80+0x40+i+x);}else{lcd1602_write_cmd(0x80+i+x-16);}lcd1602_write_data(*str);str++;i++;}}}

#include "public.h"

/******************************************************************************** 函 数 名 : delay_10us* 函数功能 : 延时函数,ten_us=1时,大约延时10us* 输 入 : ten_us* 输 出 : 无*******************************************************************************/void delay_10us(u16 ten_us){while(ten_us--);}

/******************************************************************************** 函 数 名 : delay_ms* 函数功能 : ms延时函数,ms=1时,大约延时1ms* 输 入 : ms:ms延时时间* 输 出 : 无*******************************************************************************/void delay_ms(u16 ms){u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}