找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 531|回复: 9
打印 上一主题 下一主题
收起左侧

关于C语言按键加减函数

[复制链接]
跳转到指定楼层
楼主
ID:55689 发表于 2024-9-29 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位前辈先进,写的这个函数,是按键有动作标志时对num做+-1运算并用限值做循环加减,实际调用函数不能改变数值,用函数内部语句能实现功能,请这个函数是有什么问题吗
void NumAddSub (u8 min, u8 max, char num)
{
    if (key1_flag) {  //按键标志位         
        num-- ;
        if (num < min) num = max;
        key1_flag = 0;
    }
    if (key2_flag) {  //按键标志位
        num++;
        if (num> max) num = min;
        key2_flag = 0;
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:105698 发表于 2024-9-29 12:46 | 只看该作者
key1_flag = 0;和 key2_flag = 0;可以删了。第一行u8max应该是u8 max吧?
回复

使用道具 举报

板凳
ID:55689 发表于 2024-9-29 13:35 | 只看该作者
是的,有个空格,已修改。标志位复位是等待下一次按键动作,为啥要删呢另外。请问管理员怎么把帖子移到24小时问答区,还是到那边重新提问

回复

使用道具 举报

地板
ID:192020 发表于 2024-9-29 17:51 | 只看该作者
按键问题?是不是key1_flag 和key2_flag不能正常置1?得把按键和主程序放上来才好分析,或者在判断内加一些GPIO翻转来确定是不是进到判断里了
回复

使用道具 举报

5#
ID:34149 发表于 2024-9-29 20:01 | 只看该作者

void NumAddSub (u8 min, u8 max, char num)
{
改成
void NumAddSub (u8 min, u8 max)
{
static char num;
回复

使用道具 举报

6#
ID:55689 发表于 2024-9-30 09:59 | 只看该作者
谢谢各位热心指教,问题已解决
把它改成带输出的函数 u8 NumAddSub (u8 min, u8 max, char num)
调用如   number =  NumAddSub (2, 8, number);
先前也试过这个函数,是用这个函数做为显示函数做形参,显示的数值不能正常+-,
加上 number =  NumAddSub (2, 8, number);再用 number 做显示形参就正常了,
请高手帮解释一下原因。
回复

使用道具 举报

7#
ID:192020 发表于 2024-9-30 10:22 | 只看该作者
kxyz 发表于 2024-9-30 09:59
谢谢各位热心指教,问题已解决
把它改成带输出的函数 u8 NumAddSub (u8 min, u8 max, char num)
调用如   ...

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
传值调用:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
以上复制的,你用的是传值调用,当然不会改变number的值,可以改为
void NumAddSub (u8 min, u8 max, char *num)
{
    if (key1_flag) {  //按键标志位         
        *num-- ;
        if (*num < min) *num = max;
        key1_flag = 0;
    }
    if (key2_flag) {  //按键标志位
        *num++;
        if (*num> max) *num = min;
        key2_flag = 0;
    }
}
调用时NumAddSub(2,8,&number)
回复

使用道具 举报

8#
ID:23640 发表于 2024-9-30 11:04 | 只看该作者
kxyz 发表于 2024-9-30 09:59
谢谢各位热心指教,问题已解决
把它改成带输出的函数 u8 NumAddSub (u8 min, u8 max, char num)
调用如   ...

你传进去的是变量,相当于复制了一个变量进函数内部,在函数内部改变后这个变量外部是不会变化的,正确的做法是传指针进函数。
回复

使用道具 举报

9#
ID:1109793 发表于 2024-9-30 11:37 | 只看该作者
kxyz 发表于 2024-9-30 09:59
谢谢各位热心指教,问题已解决
把它改成带输出的函数 u8 NumAddSub (u8 min, u8 max, char num)
调用如   ...

带什么输出啊,你这个number不是在函数外使用的?不用传进去,直接定义全局变量,在函数里直接改不行?
min和max是会变化的?不变的话直接#define一个应该也可以了。如此一个参数都不需要了。
回复

使用道具 举报

10#
ID:55689 发表于 2024-9-30 15:22 | 只看该作者
本帖最后由 kxyz 于 2024-10-1 10:07 编辑

回楼上,函数功能本意是多次调用按键+-数值并限值范围,比如更改月份 NumAddSub (1, 12,yue),更改日期 NumAddSub (1, 31,ri),再显示出来
回复

使用道具 举报

11#
ID:866313 发表于 2024-9-30 23:04 | 只看该作者
kxyz 发表于 2024-9-30 15:22
回楼上,函数功能本意是多次调用按键+-数值并限值范围,比如更改月份 NumAddSub (1, 12,yue),更改月份 Num ...

复习一下C语言中的指针这个知识点,应该就知道为什么调用 NumAddSub(1,12,yue) 无法更改 yue 的值了
指针
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表