51单片机-模块化编程
模块化编程
1.划分模块
c51里面一般都采用模块化的编程方式,比如一个延时函数,如果不采用模块化的设计,每创建一个工程文件都需要对此函数进行编写和声明,这样代码的利用率大大降低,而且代码饿耦合度也比较高,为此c51模块化采用 **.c 和 **.h两种格式的文件对重复率比较高的代码进行模块化设计,以演示函数为例:
delay.c
void delay(unsigned int xms){
unsigned char i,j;
while(xms--){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
dealy.h
#ifndef __DELAY_H__
#define __DELAY_H__
void delay(unsigned int xms);
#endif
此时只需在main.c中引用即可
#include<regx51.h>
#include "dealy.h"
void main(){
P2_0 = 1;
delay(200);
P2_0 = 1;
dealy(200);
}
便可以实现对led的闪烁功能
LCD1602模块控制显示屏显示字符串
#include<regx51.h>
#include "LCD1602.H"
void main(){
LCD_init();
LCD_ShowString(1,3,"hello word");
LCD_ShowString(2,3,"made by wiselee");
while(1);
}
显示结果为 hello word made by wiselee
附录 LCD1602的代码
LCD1602.C
#include <REGX52.H>
//寮曡剼閰嶇疆锛?
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0
//鍑芥暟瀹氫箟锛?
/**
* @brief LCD1602寤舵椂鍑芥暟锛?2MHz璋冪敤鍙欢鏃?ms
* @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 琛屼綅缃紝鑼冨洿锛?~2
* @param Column 鍒椾綅缃紝鑼冨洿锛?~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 鍦↙CD1602鎸囧畾浣嶇疆涓婃樉绀轰竴涓瓧绗?
* @param Line 琛屼綅缃紝鑼冨洿锛?~2
* @param Column 鍒椾綅缃紝鑼冨洿锛?~16
* @param Char 瑕佹樉绀虹殑瀛楃
* @retval 鏃?
*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
LCD_SetCursor(Line,Column);
LCD_WriteData(Char);
}
/**
* @brief 鍦↙CD1602鎸囧畾浣嶇疆寮€濮嬫樉绀烘墍缁欏瓧绗︿覆
* @param Line 璧峰琛屼綅缃紝鑼冨洿锛?~2
* @param Column 璧峰鍒椾綅缃紝鑼冨洿锛?~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]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
/**
* @brief 杩斿洖鍊?X鐨刌娆℃柟
*/
int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}
/**
* @brief 鍦↙CD1602鎸囧畾浣嶇疆寮€濮嬫樉绀烘墍缁欐暟瀛?
* @param Line 璧峰琛屼綅缃紝鑼冨洿锛?~2
* @param Column 璧峰鍒椾綅缃紝鑼冨洿锛?~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 鍦↙CD1602鎸囧畾浣嶇疆寮€濮嬩互鏈夌鍙峰崄杩涘埗鏄剧ず鎵€缁欐暟瀛?
* @param Line 璧峰琛屼綅缃紝鑼冨洿锛?~2
* @param Column 璧峰鍒椾綅缃紝鑼冨洿锛?~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 鍦↙CD1602鎸囧畾浣嶇疆寮€濮嬩互鍗佸叚杩涘埗鏄剧ず鎵€缁欐暟瀛?
* @param Line 璧峰琛屼綅缃紝鑼冨洿锛?~2
* @param Column 璧峰鍒椾綅缃紝鑼冨洿锛?~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 鍦↙CD1602鎸囧畾浣嶇疆寮€濮嬩互浜岃繘鍒舵樉绀烘墍缁欐暟瀛?
* @param Line 璧峰琛屼綅缃紝鑼冨洿锛?~2
* @param Column 璧峰鍒椾綅缃紝鑼冨洿锛?~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
本文来自博客园,作者:wiselee/,转载请注明原文链接:https://www.cnblogs.com/wiseleer/p/16314604.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!