首页 > 编程语言 >51 单片机[5]:模块化编程及LCD1602调试工具

51 单片机[5]:模块化编程及LCD1602调试工具

时间:2024-06-04 16:29:49浏览次数:28  
标签:P2 __ 文件 51 Delay 单片机 LCD LCD1602 include

一、模块化编程

1. 相关概念

传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路

模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等

.c文件:函数、变量的定义
.h文件:可被外部调用的函数、变量的声明

注意事项:

  1. 任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
  2. 使用到的自定义函数的.c文件必须添加到工程参与编译
  3. 使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)

2. 预编译

C语言的预编译以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译)。

预编译含义
#include <REGX52.H>把REGX52.H文件的内容搬到此处
#define PI 3.14定义PI,将PI替换为3.14
#define ABC定义ABC
#ifndef __XX_H__如果没有定义__XX_H__
#endif与#ifndef,#if匹配,组成“括号”

#ifndef __XX_H__可以防止重复编译。
此外还有#ifdef,#if,#else,#elif,#undef等。

3. 实例

目标: 使用#include "Delay.h"声明函数,然后调用。

#include <REGX52.H>< >表示在安装目录里面寻找.h文件。
#include "Delay.h"" "表示在程序里边寻找.h文件。

(1)创建Delay.c文件

新建一个文件

选择.c文件,命名为Delay,点击Add

把上一节的延时函数复制粘贴到Delay.c文件

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
(2)创建Delay.h文件

再添加一个文件

选择.h文件,同样命名为Delay,点击Add

可以看到,左侧边栏并没有出现新添加的文件

现在让它显示出来(不让它显示出来也行)。添加已有文件

进去之后,发现没有Delay.h文件。选择All files

就可以看到Delay.h文件,点击它,然后点击Add

在Delay.h文件中,先把框架写上:

#ifndef __DELAY_H__
#define __DELAY_H__



#endif

然后在框架里面声明Delay函数,即

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

现在,在main.c文件中,可以通过鼠标右键打开Delay.h文件

(3)简单测试一下

在main.c中编写程序,让D1小灯闪烁

#include <REGX52.H>
#include "Delay.h"

void main()
{
	while(1)
	{
		P2_0 = 0;
		Delay(500);
		P2_0 = 1;
		Delay(500);
	}
}

编译后,可以看到D1闪烁。

现在代码相较之前很简洁了。

(4)再试一下

目标: 数码管前三位分别显示1, 2, 3.

新建两个文件Digital.c和Digital.h

在Digital.c中,把上节的NumTable数码表和digital函数复制粘贴过来。由于P0等变量没有定义过,所以要在第一行加上#include <REGX52.H>;由于Delay(1);调用了Delay函数,所以还要再加上#include "Delay.h"

#include <REGX52.H>
#include "Delay.h"

unsigned char NumTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void digital(unsigned char location, number)
{
	switch(location)	
	{	
		case 1 : P2_4 = 1;P2_3 = 1;P2_2 = 1; break;
		case 2 : P2_4 = 1;P2_3 = 1;P2_2 = 0; break;
		case 3 : P2_4 = 1;P2_3 = 0;P2_2 = 1; break;
		case 4 : P2_4 = 1;P2_3 = 0;P2_2 = 0; break;
		case 5 : P2_4 = 0;P2_3 = 1;P2_2 = 1; break;
		case 6 : P2_4 = 0;P2_3 = 1;P2_2 = 0; break;
		case 7 : P2_4 = 0;P2_3 = 0;P2_2 = 1; break;
		case 8 : P2_4 = 0;P2_3 = 0;P2_2 = 0; break;
	}
	P0 = NumTable[number];
	Delay(1);
	P0 = 0x00;
}

在Digital.h中,声明一下digital函数

#ifndef __DIGITAL_H__
#define __DIGITAL_H__

void digital(unsigned char location, number);

#endif

在main.c中,编写主程序:

#include <REGX52.H>
#include "Delay.h"
#include "Digital.h"

void main()
{
	while(1)
	{
		digital(1,1);
		digital(2,2);
		digital(3,3);
	}
}

编译下载程序后可以看到,数码管前三位显示了1, 2, 3.

二、LCD1602液晶屏调试工具

1. 认识LCD1602

把LCD1602插入开发板右上角的短排口。
img
img

LCD1602只与数码管和LED冲突,其他器件不冲突。

教程中提供的LCD1602代码属于模块化的代码,使用者只需要知道所提供函数的作用和使用方法就可以很容易地使用LCD1602

img

2. 使用LCD1602

把LCD1602.c和LCD1602.h文件复制粘贴到工程目录中
img
并把两个文件添加到Keil5左侧边栏
img

在main.c中编写程序

#include <REGX52.H>
#include "LCD1602.h"


void main()
{
	LCD_Init();//初始化
	LCD_ShowChar(1,1,'A');
	while(1)
	{
		
	}
}

编译一下,发现有5个warning,可以不用管。
下载程序到开发板,可以看到显示了A。如果A显示得不明显,可以调节电阻旋钮来调整对比度。
img

LCD_ShowChar(1,1,'A');表示在第一行第一列显示字母A
LCD_ShowString(1, 3, "Hello");表示在第一行第三列显示字符串Hello
img

再尝试一下其他函数

/**
  * @brief  在LCD1602指定位置开始显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~65535
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}

LCD_ShowNum(1, 9, 520, 3);表示在第一行第九列显示三位数字520.
img

如果是LCD_ShowNum(1, 9, 520, 2);只会显示20,如果是LCD_ShowNum(1, 9, 520, 4);就会显示0520.

LCD_ShowSignedNum(2, 1, -3080, 4);会显示-3080,如果是LCD_ShowSignedNum(2, 1, -3080, 5);会显示-03080

LCD_ShowHexNum(2,1,0xa8,2);显示16进制数A8

显示2进制数的LCD_ShowBinNum(2,4,0xaa,8);要注意用不能直接打1010 1010,应该用16进制数代替。

img

3. 验证程序

#include <REGX52.H>
#include "LCD1602.h"

int Result;

void main()
{
	LCD_Init();
	Result=1+1;
	LCD_ShowNum(1, 1, Result, 3);
	while(1)
	{
		
	}
}

液晶屏显示002

进阶一下

把上个例子的Delay.c和Delay.h复制粘贴到项目目录,并添加进左侧边栏。

编写main.c:

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"

int Result = 0;

void main()
{
	LCD_Init();
	while(1)
	{
		Result++;
		Delay(1000);
		LCD_ShowNum(1, 1, Result, 3);
	}
}

k可以看到液晶屏每秒加一。

标签:P2,__,文件,51,Delay,单片机,LCD,LCD1602,include
From: https://blog.csdn.net/m0_55642878/article/details/139446845

相关文章

  • 全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯
     资料下载地址:全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯这是旧版退役拆解了新版 与电路图所示共设置4个按键短按开关台灯加减键调光长按进入菜单1.台灯加入PCAPWM调光STC12C5A60S2的PCAPWM非常好用设置简单无极调节......
  • 基于51单片机的RFID密码锁门禁系统设计资料(源码+原理图等)
    目录1、实物图  2、原理图3、PCB4、器件清单5、设计描述6、源码 7、资料清单资料下载地址:基于51单片机的RFID密码锁门禁系统设计资料(源码+原理图+论文等)​​​​​​​1、实物图  2、原理图3、PCB 4、器件清单5、设计描述 本设计采用STC89C52作......
  • 51单片机学习记录-06-LED点阵屏(74HC595移位寄存器)
    1 74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。2 74HC595原理图上升沿移位SERCLK,上升沿锁存RCLK点阵屏MATRIX函数sbitRCK=P3^5; //RCLKsbitSCK=P3^6; //SRCLKsbitSER=P3......
  • Leetcode 151.反转字符串中的单词
    ​此题是非常经典的字符串的颠倒问题,但这个更复杂一些,但也不其本质,我此次写的方式是用双指针问题完成的,虽然算不上什么好方法,但如果各位看官觉得满意的话,请各位给我个点个免费的赞吧,谢谢了_1.题目要求如图所示:2.接下来是做题的步骤:我们先把字符串的颠倒函数写好,如图......
  • LED车灯驱动IC高精度电流输出±3%以内降压恒流芯片AP5161
    概述AP5161是一款高精度降压型大功率LED恒流驱动芯片。适用于输入电压100V以内的大功率LED恒流驱动电源。专利的高端电流检测、固定频率、电流模PWM控制方式,具有优异的线性调整率和负载调整率。芯片采用的特有恒流控制方式,使得LED输出电流精度达到±3%以内。芯片内部集......
  • AP5163 是一款效率高,稳定可靠的 LED 灯恒流驱动控制芯片.
    AP5163特别内置了一个LDO、其输出电压为5V,最大可提供5ma电流输出。AP5163采用小SOT23-6封装。特别适合宽输入电压范围的应用,其输入电压范围从5.5V到36V。AP5163通过一个外接电阻设定输出电流,最大输出电流3.5A。电流检测精度最大可达±1%、外围只需很少的原件就可实......
  • LED工业照明灯降压恒流驱动ICAP5162芯片95%高效率输出精确电流±4%
    概述AP5162是一款降压、恒流、高效率的高亮度LED驱动器。AP5162特别适合宽输入电压范围的应用,输入电压范围从5.5V到36V,并且AP5162对输入电压具有高的抑制比。AP5162采用内置的低导通电阻的功率开关管,简化了芯片的外围电路,只需很少的外接元件就可实现降压、恒流驱动功......
  • LED灯降压恒流驱动芯片5~60v输出1.5A大电流AP51656
    产品描述AP51656是一款连续电感电流导通模式的降压恒流源,用于驱动一颗或多颗串联LED输入电压范围从5V到60V,输出电流最大可达1.5A。根据不同的输入电压和外部器件,可以驱动高达数十瓦的LED。内置功率开关,采用高端电流采样设置LED平均电流,通过DIM引脚可以接受模拟调光......
  • LED汽车尾灯驱动IC 3~36v输出电流AP5165B降压恒流芯片
    产品描述AP5165B是一款外围电路简单的连续电流模式的降压型LED恒流驱动芯片。在输入电压高于LED电压时,可以有效地用于驱动一颗或者多颗串联LED。输出电流可调,最大可达1A。适用于3-36V电压范围的非隔离式恒流LED驱动领域。AP5165B内置功率开关和一个高端电流检测电路,可......
  • LED射灯驱动IC降压恒流芯片高效率不易发烫AP5179
    产品描述AP5179是一款连续电感电流导通模式的降压恒流源,用于驱动一颗或多颗串联LED输入电压范围从5V到60V,输出电流最大可达2.0A。根据不同的输入电压和外部器件,可以驱动高达数十瓦的LED。内置功率开关,采用高端电流采样设置LED平均电流,通过DIM引脚可以接受模拟调光和很......