• 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位LCD
    void 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位LCD
    void 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位LCD
    void 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后负跳变完成写入        
    }
    #else
    void 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位LCD
    void lcd1602_init(void)
    {
        lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
        lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
        lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
        lcd1602_write_cmd(0x01);//清屏    
    }
    #else
    void 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!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
            {
                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!='\0')
            {
                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--);
    }

    纷传单片机学习资料放在纷传小程序里了,需要的可以加入圈子有资料百度网盘下载地址及提取码。

  • 相关阅读:
    Netty Review - 核心组件扫盲
    (附源码)ssm智慧社区管理系统 毕业设计 101635
    深度学习入门基于python的理论与实现-第三章神经网络(个人向笔记)
    Js逆向教程-14反调试
    ZephyrOS--添加自定义STM32开发板
    【消息中间件】为什么选择RocketMQ及SpringBoot整合使用案例
    安卓系列全机型刷写原生 去除wifi打叉 去除感叹号方法解析
    Producer
    blender快捷键
    使用 pm2 启动 nodejs 服务
  • 原文地址:https://blog.csdn.net/qq_63964231/article/details/126917371