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

一、模块化编程

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可以看到液晶屏每秒加一。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值