51单片机基础之1602显示器

发布者:GoldenHarmony最新更新时间:2022-10-11 来源: csdn关键字:51单片机  基础 手机看文章 扫描二维码
随时随地手机看文章

代码:


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


运行结果:

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

关键字:51单片机  基础 引用地址:51单片机基础之1602显示器

上一篇:51单片机基础之五线四相步进电机
下一篇:51单片机基础之点阵LED8X8

推荐阅读最新更新时间:2024-11-13 16:03

1天搞定单片机中断——基础知识大全
注意: Stc89c51/52单片机的P0口为开漏输出,若作为普通I/O口试,需要加上拉电阻,不然输出不了高电平。(注:P1、P2、P3都是准双向输出) 其中上拉电阻的作用: 1、加大普通IO口的驱动能力。 2、起到限流的作用。 3、抵抗电磁干扰。 1、单片机时钟时序单位(晶振周期/拍节、状态、机器周期、指令周期): 2、单片机最小系统组成5部分:单片机、晶振电路、复位电路、电源电路、下载电路 3、单片机引脚解释:单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈ 电源: ⑴ VCC - 芯片电源,接+5V; ⑵ VSS - 接地端; ⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端
[单片机]
1天搞定单片机中断——<font color='red'>基础</font>知识大全
基于51单片机可修改错误功能的计算器工作原理解析
utiliTIes.h #ifndefUTILITIES_H_INCLUDED #defineUTILITIES_H_INCLUDED typedefunsignedcharuchar,BYTE,uint8; typedefunsignedintuint,WORD,uint16; typedefunsignedlongulong,DWORD,uint32; typedefcharint8; typedefintint16; typedeflongint32; typedefunsignedchar*uchar_p; typedefunsignedint*uint_p; typedefunsignedlong*ulong_p;
[单片机]
基于<font color='red'>51单片机</font>可修改错误功能的计算器工作原理解析
EMC World现场解读1:数据中心现代化是数字化业务转型的基础
016年5月2日, EMC World 2016大会在美国拉斯维加斯正式拉开帷幕。本次大会的主题是 数据中心 现代化(Modernize)。三天的大会将分别围绕产业现代化(Modernizing the Industry)、数据中心现代化(Modernize Your Data Center)和业务现代化(Modernize Your Business)展开。其核心是要通过数据中心的现代化,满足第三平台业务对IT敏捷性、高效率和高速度的需求;满足在 数字化 转型过程中,用户对双模式—即传统应用和基于云计算的新应用(移动、社群、大数据)—对IT的需求,最终实现业务现代化。 实现IT基础架构现代化是第一步 结合EMC 全球用户的市
[嵌入式]
stm32时钟的基础理解
STM32是一个功能强大的微控制器,丰富的外设,强大的功能注定设计师最初必须注意它的功耗问题,所以产生了时钟,这很容易理解,就像我们的电脑,你会在使用时打开所有软件使用么,难道你上个淘宝,你要把什么视频软件,游戏,也一起打开么,显然不合理,费电,拖速度,stm32也是一样,(在笔者现在学到先在,虽然也没学多少)做什么都要打开相应时钟(就像用鼠标双击打开相应软件一样)。时钟分很多个,IO口的时钟,打开以一组为单位。外设有串口时钟,定时器时钟,外部中断复用时钟,看门狗时钟。 无论是什么功能都有相应时钟,一定要正确打开。 对寄存器AFIO_EVCR, AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的
[单片机]
51单片机C语言编程中对单片机绝对地址访问的两种方法
在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间。C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定。为了能够在C51程序中直接对任意指定的存储器地址进行操作,可以采用扩展关键字 at 、指针、预定义以及连接定位控制命令。 在这些方法中,本人认为最简单而有效的方法是用 _at_ 关键字来对指定变量存储器空间绝对地址来指定。一般格式如下: 数据类型 标识符 _at_ 地址常数 其中:
[单片机]
中国人工智能行业百花齐放,但基础技术与国外相比仍有差距
“不过,尽管中国企业布局频繁,但对技术开源的理解不如国外企业深刻,”向阳告诉21世纪经济报道记者,“在国外,无论微软、谷歌还是亚马逊,均开源了自己的平台,国内企业在这一块则相对欠佳。”下面就随手机便携小编一起来了解一下相关内容吧。 如果将2016年视为中国人工智能行业发展的序曲,那么,在2017年上半年,人工智能在国内奏出了前所未有的强音。 “我们前几年布局人工智能的时候,被人嘲笑为傻子。如今,这个行业终于开始开花结果了。”一位百度公司人士向21世纪经济报道记者感慨道。早在2013年1月,百度公司董事长兼CEO李彦宏便提出设立深度学习研究院,并亲自挂帅首任院长。彼时,中国科技圈沉浸于智能手机所带来的移动互联网想象空间里,鲜少有
[手机便携]
多模式51单片机心形流水灯+呼吸灯+蜂鸣器音乐
1.基础硬件DIY设计 电路硬件: STC89C52RC 蜂鸣器/24个LED/4个四角按键 1)整体原理图 2)PCB电路 3)3D_PCB TOP层 2.单片机程序设计 1)呼吸灯 //呼吸灯 while(1) { for(high=1;high cycle;high++) { P2=P1=P0=0XFF; delay2(high); P2=P1=P0=0X00; low=cycle-high; delay2(low); } for(low=1;low cycle;low++) { P2=P1=P0=0XFF;; high=cycle-low;
[单片机]
多模式<font color='red'>51单片机</font>心形流水灯+呼吸灯+蜂鸣器音乐
单片机中断源与中断申请标志基础详解
中断源 (1)外部中断0请求,由P3.2脚输入。通过IT0脚(TCON.0)来决定是低电平有效还是下跳变有效。一旦输入信号有效,就向CPU申请中断,并建立IE0标志。 (2)外部中断1请求,由P3.3脚输入。通过IT1脚TCON.2)来决定是低电平有效还是下跳变有效。一旦输入信号有效,就向CPU申请中断,并建立IE1标志。 (3) TF0:定时器T0溢出中断请求。当定时器0产生溢出时,定时器0中断请求标志位(TCON.5)置位(由硬件自动执行),请求中断处理。 (4) TF1:定时器1溢出中断请求。当定时器1产生溢出时,定时器1中断请求标志位(TCON.7)置位(由硬件自动执行),请求中断处理。 (5)  RI或TI:串
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved