1.模块化编程
.c文件:函数、变量的定义
.h文件:可被外部调用的函数、变量的声明
(1)注意事项
1.任意自定义的变量、函数在调用之前必须有定义或声明
2.使用到的自定义函数的.c文件必须添加到工程参与编译
3.使用的.h文件必须放在编译器可寻找到的地方
(2)预编译
#define PI 3.14--------------->定义PI。将PI替换为3.14
#ifndef __XX_H__----------->如果没有定义__XX_H__,就编译下面的内容
#ifdef __XX_H__----------->如果定义了__XX_H__,就编译下面的内容
例如:
#ifdef ABC
DHGFJ
#endif
此时就是DHGFJ这个的内容不会进行编译
如果开头加上#define ABC,那么DHGFJ就会参与编译,同理就可知#ifndef __XX_H__的作用
#ifndef ABC//ABC没有定义则编译下面的
#define ABC//定义ABC,使其存在,可编译
函数的声明
#endif
#endif--------------------------->与#ifndef,#if匹配,组成括号
#define A---------------------->定义A
等等
(3)示例
创建如上的.c文件和.h文件,名称可以大写,小写
在主函数中如下编写(以LED闪烁为例)
#include <REGX52.H>//<>是在安装目录里面寻找文件
#include "delay.h"//“”是在自己的程序目录里面寻找文件
void main()
{
while(1)
{
P2_0=1;
delay(5000);
P2_0=0;
delay(5000);
}
}
在delay.c中,放入延时函数
第一种(使用#ifndef)
在头文件,delay.h中
#ifndef __delay_H__
#define __delay_H__
void delay(unsigned int xms);
#endif
第二种(使用#ifdef)
#define __delay_H__
#ifdef __delay_H__
void delay(unsigned int xms);
#endif
上一篇数码管的动态显示就可以如上进行操作,同志们可以自己去尝试下!!!要自己动手去尝试
注意在创建Nixie.c文件的时候需要加上#include <REGX.H> 的头文件,因为用到了位操作
2.LCD1602
(1)相应函数
函数 | 作用 |
LCD_Init(); | 初始化 |
LCD_ShowChar(1,1,'A'); | 显示一个字符 |
LCD_ShowString(1,3,"Hello"); | 显示字符串 |
LCD_ShowNum(1,9,123,3); | 显示十进制数字 |
LCD_ShowSignedNum(1,13,-66,2); | 显示有符号十进制数字 |
LCD_ShowHexNum(2,1,0xA8,2); | 显示十六进制数字 |
LCD_ShowBinNum(2,4,0xAA,8); | 显示二进制数字 |
(2)示例
LCD1602.c文件和LCD1602.h文件参考江协科技的,可以在评论区领取!!51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili
第一种,打印一个字符
主函数代码,LCD1602.C和LCD1602.H的代码不需要管,只要在目录中打开即可,如果你不是这个型号的板子,那就需要将LCD1602.C中的引脚改掉,如下图所示。
#include <REGX52.H>
#include "LCD1602.H"
void main()
{
LCD_Init();//初始化
LCD_ShowChar(1,1,'A');//在第一行第一列显示A
while(1)
{
}
}
效果如下:
第二种,显示字符串
在LCD1602.c文件中标明了范围,如下图
主函数代码展示
效果如下:
第三种 ,显示十进制数字
主函数代码如下
#include <REGX52.H>
#include "LCD1602.H"
void main()
{
LCD_Init();//初始化
LCD_ShowNum(1,3,123,3);
//第一行第三列,数字为123,长度为3位
//如果为长度为4,就会显示0123
while(1)
{
}
}
效果如下:
第四种,显示有符号十进制数字
#include <REGX52.H>
#include "LCD1602.H"
void main()
{
LCD_Init();//初始化
LCD_ShowSignedNum(1,3,-66,2);
//第一行第三列,数字为-66,长度为2位
//长度不包括符号
while(1)
{
}
}
效果如下:
第五种,显示十六进制数字
#include <REGX52.H>
#include "LCD1602.H"
void main()
{
LCD_Init();//初始化
LCD_ShowHexNum(1,3,0xA8,2);
//第一行第三列,数字为0xA8,长度为2位
while(1)
{
}
}
效果如下:
第六种,显示二进制数字
#include <REGX52.H>
#include "LCD1602.H"
void main()
{
LCD_Init();//初始化
LCD_ShowBinNum(1,3,0xAA,8);
//不能直接写二进制的数字,要用十六进制的来代替
//第一行第三列,长度为8位
while(1)
{
}
}
效果如下:
(3)应用,简易60s秒表
Delay.c中
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
Delay.h中
#ifndef __Delay_H__
#define __Delay_H__
void Delay(unsigned int xms);
#endif
LCD1602.c和LCD1602.h省略
主函数
#include <REGX52.H>
#include "LCD1602.H"
#include "Delay.h"
void main()
{
int x=0;
LCD_Init();//初始化
LCD_ShowString(1,1,"Stopwatch:");
while(1)
{
x++;
Delay(1000);
LCD_ShowNum(1,11,x,2);
if(x==60)
{
x=0;
}
}
}
效果如下:
视频有暂停
普中51单片机LCD1602简易秒表