历史上的今天
返回首页

历史上的今天

今天是:2025年10月11日(星期六)

正在发生

2022年10月11日 | 51单片机基础之1602显示器

2022-10-11 来源:csdn

代码:


main.c文件

 

#include "public.h"

#include "lcd1602.h"

 

/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

int a=111;

lcd1602_init();//LCD1602初始化

lcd1602_clear();//全屏

lcd1602_show_string(0,0,"Hello World!");//第一行显示

lcd1602_show_string(0,1,"0123456789");//第二行显示

while(1)

{

LcdSetCursor(12,1); //可以设置从哪个地方开始写

LCDNumPrint(a); //可以显示变量,这个设置的是三个数,可以改

}

}


lcd1602.c文件

 

#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!='')//字符串是以''结尾,只要前面有内容就显示

{

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++;

}

}

}

/*设置显示RAM起始地址,亦即光标位置*/

void LcdSetCursor(u8 x,u8 y)

{

        u8 addr;

        if(y == 0)

                addr = 0x00 + x;

        else

                addr = 0x40 + x;

        lcd1602_write_cmd(addr | 0x80);

}

/*液晶输出数字目前是三位数*/

void LCDNumPrint(int num)

{

  lcd1602_write_data(num / 100 + 0x30);//num的百位

        lcd1602_write_data(num % 100 /10 + 0x30);//num的十位

        lcd1602_write_data(num % 10 + 0x30);//num的个位

}


lcd1602.h文件

 

#ifndef _lcd1602_H

#define _lcd1602_H

 

#include "public.h"

 

//LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位

#define LCD1602_4OR8_DATA_INTERFACE 0 //默认使用8位数据口LCD1602

 

//管脚定义

sbit LCD1602_RS=P2^6;//数据命令选择

sbit LCD1602_RW=P2^5;//读写选择

sbit LCD1602_E=P2^7; //使能信号

#define LCD1602_DATAPORT P0 //宏定义LCD1602数据端口

 

 

//函数声明

void lcd1602_init(void);

void lcd1602_clear(void);

void lcd1602_show_string(u8 x,u8 y,u8 *str);

void LCDNumPrint(int num);

void LcdSetCursor(u8 x,u8 y);

#endif


public.c文件

 

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

}


public.h文件

 

 

#ifndef _public_H

#define _public_H

 

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

typedef unsigned long u32;

 

void delay_10us(u16 ten_us);

void delay_ms(u16 ms);

 

#endif


运行结果:

此代码可以实现字符常量数字还有变量数字的显示。 

推荐阅读

史海拾趣

Cliff Electronic Components公司的发展小趣事

由于字数限制,我将先为您提供一个关于Cliff Electronic Components公司的发展故事,如您需要更多内容,请再次询问。

Cliff Electronic Components的崛起与转型

在1977年,一个名为Cliff Electronic Components Limited的公司在英国悄然成立。初创时期,它主要为音乐行业提供连接器,满足了当时市场上对于音频设备连接的需求。随着市场的发展和技术的进步,公司很快意识到,仅靠单一产品线难以满足日益多样化的市场需求。

在公司成立的初期,Cliff面临着巨大的市场压力。当时,电子行业正经历着快速的技术革新,竞争对手层出不穷。为了在市场上站稳脚跟,Cliff决定对其产品线进行大刀阔斧的改革和扩展。他们不仅继续深耕音频连接器领域,还开始涉足交流电源连接器、直流电源连接器、馈通连接器等多种电子连接器产品。

进入80年代,随着个人电脑的普及和电子设备的小型化趋势,Cliff迎来了新的发展机遇。公司迅速调整战略,开始研发和生产适用于个人电脑的各种连接器。这一转型使得Cliff的产品线更加丰富,也为其赢得了更多的市场份额。

为了满足客户对于高品质产品的需求,Cliff不断加大研发投入,引进先进的生产设备和技术。他们在产品设计和制造工艺上不断创新,力求为客户提供更加可靠、高效的连接器解决方案。这种对品质的不懈追求,使得Cliff逐渐在市场上树立起了良好的口碑。

进入90年代,随着全球化的加速和电子行业的飞速发展,Cliff开始积极拓展国际市场。他们参加各种国际电子展会,与全球的客户和合作伙伴建立联系。通过与国际知名企业的合作,Cliff不仅提升了自身的品牌影响力,还进一步拓展了其产品的应用范围。

随着时间的推移,Cliff逐渐成为了一个在国际上享有盛誉的电子连接器品牌。他们始终坚持创新、品质和服务至上的理念,赢得了客户的广泛认可和赞誉。今天,当我们提到Cliff时,人们首先想到的是他们高品质的电子连接器和专业的客户服务。

若您想要探索更多内容,随时可以继续输入。请注意,由于Cliff Electronic Components公司的发展历程可能涉及多个方面,以上内容主要聚焦于其产品线扩展和市场拓展的方面。如果您对其他方面如技术研发、企业文化等有进一步的兴趣,可以再次输入以获取更多信息。

若您想要更多关于Cliff Electronic Components的故事,请随时告知。

智烽维(CDA)公司的发展小趣事

在超级电容器领域不断取得突破的同时,智烽维也在积极探索新的技术领域。2018年,公司成功实现了锂离子电容器的研发突破。这一成果不仅填补了公司在这一领域的空白,也为公司未来的发展开辟了新的道路。锂离子电容器以其高能量密度、高功率密度和长寿命等特点,在新能源汽车、智能电网等领域具有广阔的应用前景。

西博臣(CYBERSEN)公司的发展小趣事

广州西博臣科技有限公司(简称西博臣)成立于2001年,从创立之初就专注于湿度传感器的研发和生产。公司是国内最早从事高分子湿度传感器研发并进行规模化生产的厂家之一,凭借其独特的技术实力和对行业的深刻理解,逐渐在市场中崭露头角。

德索五金(dosinconn)公司的发展小趣事

发展历程:2016年,公司荣获国家高新技术企业认证,并累计获得了30余项专利。这些荣誉的获得不仅彰显了公司在技术创新方面的实力,也为企业赢得了更多的市场机会。

成果与影响:技术沉淀和荣誉的获得使德索五金电子在连接器制造领域树立了良好的品牌形象,也为公司的长远发展提供了坚实的技术支持。

以上五个故事框架简要概述了德索五金电子在电子行业中的发展历程和关键成就。每个故事都突出了公司在不同阶段的发展重点和取得的成果,为读者提供了关于德索五金电子成长历程的全面了解。

BK Precision公司的发展小趣事

为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。

大毅科技公司的发展小趣事

为了进一步提升产品质量和竞争力,大毅科技积极申请并获得了多项国际品质认证,如ISO9001、ISO14001、TS16949等。这些认证不仅证明了大毅科技在品质管理方面的卓越能力,还为公司打开了通往国际市场的大门。随着认证的不断增多,大毅科技的产品开始出口到全球各地,与索尼、雅马哈等知名企业建立了长期合作关系。

问答坊 | AI 解惑

求用89S52作的电子体温计的源程序。

本人在“电子制作”08第一期上看到标题为“基于89S52单片机的电子体温计。”但上面没有给任何程序。 那位大侠有??可否发上来? 温度传感器是:DS18B20.还有个122*64点阵的液晶显示。。 Help~~~~…

查看全部问答>

谁知道如何用AutoCAD制作元件的PCB封装?

有资料或者可以总结一点经验的请告知…

查看全部问答>

wince 开机logo

大家好!     最近想在wince启动时显示logo界面,不知道怎么操作,望大家指点具体操作办法,多谢了!!!…

查看全部问答>

SMBUS的SLAVE地址

最近需要写个读写SMBUS设备的寄存器的程序,好象挂在SMBUS上的各类设备都有自己固定的SLAVE ADDRESS,所以想问下是否有相关的资料记录了各类设备预先分配好的地址,如果有相关资料的话,是否可以提供下哪里下载?比如SPD的SLAVE ADDRESS为A0,A2,A4 ...…

查看全部问答>

求三星AT命令集

求三星AT命令集和Konia邮箱zenggyang2005@163.com…

查看全部问答>

TI在中国设立生产基地

    前几天收一封到邮件,说TI在中国成都设立生产基地了,看来TI要发力了,以后批量订货估计就很方便了。     TI 在中国设立生产制造基地, 显著提升产能 尊敬的客户:我们衷心地感谢您对 TI 多 ...…

查看全部问答>

如何用PLL做主时钟

我想把PLL做主时钟用,请问SysCtlClockSet函数中的参数应该怎么设置?…

查看全部问答>