飞龙在天 发表于 2022-11-15 17:27:21

1602移动显示

开天斧三实验扩展板。

神农鼎 发表于 2022-11-16 08:25:27

好,LCD1602有了,期待LCD12864:)

欢迎哈哈哈3 发表于 2024-6-5 21:31:55

你好,问下有用8位数据口驱动LCD1206的程序没?学习一下

欢迎哈哈哈3 发表于 2024-6-5 21:42:27

你好,问下有用8位数据口驱动LCD1602的程序没?学习一下{:lol:}

soma 发表于 2024-6-9 23:52:59

手上有1602学习下,怎么用

jingkaimori 发表于 2024-6-27 16:22:41

欢迎哈哈哈3 发表于 2024-6-5 21:42
你好,问下有用8位数据口驱动LCD1602的程序没?学习一下

数据手册在此,8位并口驱动LCD1602a的程序在第八章

zhangshiwei 发表于 2024-7-2 11:05:37

本帖最后由 zhangshiwei 于 2024-7-2 11:06 编辑

欢迎哈哈哈3 发表于 2024-6-5 21:42
你好,问下有用8位数据口驱动LCD1602的程序没?学习一下
LCD1602驱动函数:
#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++;   
      }   
    }               
}主函数:main.c

#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)
    {

    }   
}
1602 液晶,从它的名字我们就可以看出它的显示容量,就是可以显示 2 行,每行 16 个字符的液晶。它的工作电压是 4.5V~5.5V,对于这点我们设计电路的时候,直接按照 5V 系统设计,但是保证我们的 5V 系统最低不能低于 4.5V。在 5V 工作电压下测量它的工作电流是 2mA,大家注意,这个 2mA 仅仅是指液晶,而它的黄绿背光都是用 LED 做的,所以功耗不会太小的,一二十毫安还是有的。1602 液晶一共 16 个引脚,每个引脚的功能,我们都可以在它的数据手册上获得。而这些基本的信息,在我们设计电路和编写代码之前,必须先看明白。
https://pica.zhimg.com/80/v2-05007b16692f3c1aa61fac13ec109d8c_720w.webp?source=1def8aca
然后根据时序图写驱动函数。

欢迎哈哈哈3 发表于 2024-7-3 18:03:10

jingkaimori 发表于 2024-6-27 16:22
数据手册在此,8位并口驱动LCD1602a的程序在第八章

{:5_332:}程序很详细,很好,谢谢了

tingyu8675 发表于 2024-7-27 16:05:40

正在学习,程序已经正常运行~~
页: [1]
查看完整版本: 1602移动显示