文章目录
- 前言
- 一、模块化
-
- 什么是模块化
- 模块化使用
- 预编译
- 二、LCD1602
-
- 介绍LCD1602
- LCD1602常用于测试的api
- 实际操作
- 如何测试
前言
介绍模块化以及LCD1602的使用方法和其api的使用
一、模块化
什么是模块化
简单来说,就是把不同功能的代码放在不同独立的.c文件当中(还需要相应的.h头文件去声明其方法),以便于我们查找修改,也可以提高代码的复用。
模块化使用
模块化的注意事项
例如把延时函数放在一个Delay.c文件中,然后使用一个Delay.h头文件声明其内部函数,那么在主函数mian.c文件中,只需要#include “Delay.h”,就可以直接调用Delay.c文件中的延时函数。
代码如下:
Delay.c
void Delayms(unsigned char s) //@12.000MHz { while(s--){ unsigned char data i, j; i = 12; j = 169; do { while (--j); } while (--i); } }
Delay.h
// 防止重定义 #ifndef __DELAY_MS_ #define __DELAY_MS_ void Delayms(unsigned char s); #endif
main.c
#include <REGX52.H> #include "Delay.h" void main(){ Delayms(200); while(1){ } }
不过需要都放在根目录可以找到的路径下
编译是没有问题的
预编译
补充(以下都是防止重定义常用的预编译):
- #ifdef 表示如果已经定义过什么,就运行其于#endif之间的代码
- #ifndef 表示如果没有定义过什么,就运行其于#endif之间的代码
二、LCD1602
介绍LCD1602
LCD1602官方模组如下
本质相当于是一个简易显示屏,大小为16*2的,可以用于显示字符数字,可以通过其对我们的操作进行验证。
LCD1602常用于测试的api
使用这些api来显示相关内容
实际操作
代码调用如下(需引用)
LCD1602.c(所有api即方法注释)
#include <REGX52.H> //引脚配置: sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7; #define LCD_DataPort P0 //函数定义: /** * @brief LCD1602延时函数,12MHz调用可延时1ms * @param 无 * @retval 无 */ void LCD_Delay() { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } /** * @brief LCD1602写命令 * @param Command 要写入的命令 * @retval 无 */ void LCD_WriteCommand(unsigned char Command) { LCD_RS=0; LCD_RW=0; LCD_DataPort=Command; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } /** * @brief LCD1602写数据 * @param Data 要写入的数据 * @retval 无 */ void LCD_WriteData(unsigned char Data) { LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } /** * @brief LCD1602设置光标位置 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @retval 无 */ void LCD_SetCursor(unsigned char Line,unsigned char Column) { if(Line==1) { LCD_WriteCommand(0x80|(Column-1)); } else if(Line==2) { LCD_WriteCommand(0x80|(Column-1+0x40)); } } /** * @brief LCD1602初始化函数 * @param 无 * @retval 无 */ void LCD_Init() { LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵 LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关 LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动 LCD_WriteCommand(0x01);//光标复位,清屏 } /** * @brief 在LCD1602指定位置上显示一个字符 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @param Char 要显示的字符 * @retval 无 */ void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char) { LCD_SetCursor(Line,Column); LCD_WriteData(Char); } /** * @brief 在LCD1602指定位置开始显示所给字符串 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param String 要显示的字符串 * @retval 无 */ void LCD_ShowString(unsigned char Line,unsigned char Column,char *String) { unsigned char i; LCD_SetCursor(Line,Column); for(i=0;String[i]!=' ';i++) { LCD_WriteData(String[i]); } } /** * @brief 返回值=X的Y次方 */ int LCD_Pow(int X,int Y) { unsigned char i; int Result=1; for(i=0;i<Y;i++) { Result*=X; } return Result; } /** * @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'); } } /** * @brief 在LCD1602指定位置开始以有符号十进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:-32768~32767 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */ void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length) { unsigned char i; unsigned int Number1; LCD_SetCursor(Line,Column); if(Number>=0) { LCD_WriteData('+'); Number1=Number; } else { LCD_WriteData('-'); Number1=-Number; } for(i=Length;i>0;i--) { LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0'); } } /** * @brief 在LCD1602指定位置开始以十六进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~0xFFFF * @param Length 要显示数字的长度,范围:1~4 * @retval 无 */ void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i,SingleNumber; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { SingleNumber=Number/LCD_Pow(16,i-1)%16; if(SingleNumber<10) { LCD_WriteData(SingleNumber+'0'); } else { LCD_WriteData(SingleNumber-10+'A'); } } } /** * @brief 在LCD1602指定位置开始以二进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 * @param Length 要显示数字的长度,范围:1~16 * @retval 无 */ void LCD_ShowBinNum(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(2,i-1)%2+'0'); } }
LCD1602.h(声明函数)
#ifndef __LCD1602_H__ #define __LCD1602_H__ //用户调用函数: void LCD_Init(); void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char); void LCD_ShowString(unsigned char Line,unsigned char Column,char *String); void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length); void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); #endif
mian.c
#include <REGX52.H> #include "LCD1602.h" void main(){ // 调用LCD1602的接口 LCD_Init(); LCD_ShowChar(1,1,'A'); // 第一行第一列显示A LCD_ShowString(1,3,"hello"); LCD_ShowNum(1,9,123,3); // 第一行第9列开始显示123,最大显示3位 LCD_ShowSignedNum(2,1,-66,2); LCD_ShowHexNum(2,4,0xa8,2); LCD_ShowBinNum(2,8,0x3f,8); while(1){ } }
如何测试
以测试Delay函数是否生效为例
测试代码如下
#include <REGX52.H> #include "LCD1602.h" #include "Delay.h" int count = 0; // 用count来查看延时函数是否生效 void main(){ LCD_Init(); // 先进行初始化 // 每过一秒,count就会+1,将其显示在LCD1602,即可通过LCD1602来观察延时函数是否生效 while(1){ Delayms(1000); LCD_ShowNum(1,1,count,3); // 在第一行第一列开始输出count的值,最大三位数 count++; } }