子函数的调用,求操作步骤

keil4,利用子函数从if(K1==0),简化程序,减少程序的冗长。

img

img


///////////

基于Monster 组和GPT的调写:

#include "reg52.h"

sbit K1 = P3^1;
sbit K2 = P3^0;
unsigned char i, j, y;

void delay(unsigned int i)
{
    while(i--);
}

unsigned code a[] = {0x00, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
unsigned code b[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void displayNum(unsigned char i, unsigned char j)
{
    P2 = 0x14;
    P0 = a[i];
    delay(1000);
    P2 = 0x10;
    P0 = b[j];
    delay(1000);
}

void displayBlank()
{
    P2 = 0x14;
    P0 = 0x6f;
    delay(1000);
    P2 = 0x10;
    P0 = 0x6f;
    delay(1000);
}

void main()
{
    while(1)
    {
        P2 = 0x10;
        P0 = 0x3f;
        K1 = 1;
        if(K1 == 0)
        {
            delay(1000);
            if(K1 == 0)
            {
                for(i = 0; i < 10; i++)
                {
                    for(j = 0; j < 10; j++)
                    {
                        for(y = 0; y < 10; y++)
                        {
                            displayNum(i, j);
                        }
                    }
                }
            }
        }
        displayBlank();
        K2 = 1;
        if(K2 == 0)
        {
            delay(1000);
            if(K2 == 0)
            {
                for(i = 0; i < 10; i++)
                {
                    for(j = 9; j < 10; j--)
                    {
                        for(y = 0; y < 10; y++)
                        {
                            displayNum(i, j);
                        }
                    }
                }
            }
        }
        displayBlank();
    }
}


  • 定义了两个显示数字的子函数displayNum和displayBlank。这些函数分别用于在数码管上显示数字和空白。通过这些函数的使用,可以将程序中的重复代码移动到单独的函数中,从而减少了程序的长度和复杂性。

#include "reg52.h"

sbit K1 = P3^1;
sbit K2 = P3^0;

void delay(unsigned int i)
{
    while(i--);
}

unsigned code a[] = {0x00, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
unsigned code b[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void displayNum(unsigned char i, unsigned char j)
{
    P2 = 0x14;
    P0 = a[i];
    delay(1000);
    P2 = 0x10;
    P0 = b[j];
    delay(1000);
}

void displayBlank()
{
    P2 = 0x14;
    P0 = 0x6f;
    delay(1000);
    P2 = 0x10;
    P0 = 0x6f;
    delay(1000);
}

void buttonPressed(unsigned char count, unsigned char reverse)
{
    unsigned char i, j, y;
    unsigned char end = (reverse) ? 255 : 10;
    unsigned char step = (reverse) ? -1 : 1;

    for(i = 0; i < count; i++)
    {
        for(j = 0; j != end; j += step)
        {
            displayNum(i, j);
        }
    }
}

void main()
{
    while(1)
    {
        P2 = 0x10;
        P0 = 0x3f;
        K1 = 1;
        if(K1 == 0)
        {
            delay(1000);
            if(K1 == 0)
            {
                buttonPressed(10, 0);
            }
        }
        displayBlank();
        
        P2 = 0x10;
        P0 = 0x3f;
        K2 = 1;
        if(K2 == 0)
        {
            delay(1000);
            if(K2 == 0)
            {
                buttonPressed(10, 1);
            }
        }
        displayBlank();
    }
}

在这个优化的代码示例中,我进一步简化了循环的逻辑。通过使用一个起始值和步进值,可以根据需要决定循环是正向还是反向的,并避免了内部的嵌套循环。

我还将反向循环的结束条件设置为255,以确保在循环中使用j != end的条件,这样可以在循环时进行自增或自减,并且不需要使用额外的变量来控制循环次数。

这个优化可以提高代码的简洁性和可读性,并减少了不必要的循环嵌套。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
当我们在编写程序时,可能会遇到某段代码需要被多处调用的情况。这时候,我们可以将这段代码封装成一个子函数,在需要调用的地方直接调用子函数即可。

下面是一个示例程序,该程序的作用是检测按键K1是否按下:

#include<reg51.h>

sbit K1 = P1^0; //按键K1连接在P1.0端口

void check_K1(void) //检测按键K1是否按下
{
    if(K1 == 0) //按键K1被按下
        {
            //执行按键被按下后的操作
        }
}

void main()
{
    while(1)
        {
            check_K1(); //调用check_K1()函数
        }
}

在上面的示例程序中,我们使用了一个名为check_K1()的子函数来检测按键K1是否按下。这个子函数只是一个简单的if语句,当按键K1被按下时,会执行相应的操作。在主函数main()中,我们使用while(1)循环调用check_K1()函数,每次循环都会检测按键K1是否按下。

使用子函数的好处是,我们可以将代码分成不同的模块,使程序结构更加清晰,易于组织和调试。此外,在代码重构时,我们可以直接修改子函数,而不需要对整个程序进行大规模的修改,减少了出错的可能性。

在keil4中,编写上述代码,应该是这样的:

上述代码定义了一个名为check_K1()的子函数,用于检测按键K1是否按下。主函数中使用while循环调用check_K1()函数,以持续检测按键状态。
如果我的回答解决了您的问题,请采纳!