矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 4696|回复: 26

矩阵按键延时函数和switch(key)语句冲突

[复制链接]
     
发表于 2020-11-6 11:26:02 | 显示全部楼层 |阅读模式
按书示例编程出现以下错误:
compiling aj_2.c...
AJ_2.C(85): warning C290: missing return value
linking...
Program Size: data=13.0 xdata=0 code=294
"aj_2" - 0 Error(s), 1 Warning(s).
示例编程:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar disnum,temp,key,num;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
delay(uchar);    //函数声明
uchar keyscan();
void main()
{       
        disnum=16;
        wela=1;
        P0=0XFE;  //第一个数码管位选
        wela=0;
        while(1)
        {
        num=keyscan();          //用num读取矩阵键盘扫描函数的返回值
        P0=table_du[num];  //送段选num
        dula=1;
        dula=0;
        }       
}

uchar keyscan()    //矩阵键盘扫描函数
{
    P3=0xf0;  //让P3.0、P3.1、P3.2、P3.3等于0,P3.4、P3.5、P3.6、P3.7等于1
        temp=P3;  //用temp读取P3口当前的值
        temp=temp&0xf0;  //把temp的值和0xf0作与运算,即保持高4位变,低4位为0
        if(temp!=0xf0)    //如果此时的temp不等于0xf0,说明有按键被按下了
        {
                delay(10);      //延时约10ms
                if(temp!=0xf0)  //再次判断是否真的有按键按下(即消除前沿抖动)
                {
                        temp=P3;        //如果有按键按下,temp重新读取P3口的值
                        temp=temp|0X0f;  //作按位或,即保持高4位不变,低4位为1
                        P3=temp;        //把temp的值赋给P3口
                        key=P3;         //然后用key读取P3口的值,作为按键的键值
                        switch(key)   //让每一个键值和数码管显示的数对应起来
                        {
                                case 0xee:disnum=0;  //当key的值为0xee时,disnum的值为0
                                                        break;
                                case 0xde:disnum=1;  //当key的值为0xde时,disnum的值为1
                                                        break;
                                case 0xbe:disnum=2;
                                                        break;
                                case 0x7e:disnum=3;
                                                        break;
                                case 0xed:disnum=4;
                                                        break;
                                case 0xdd:disnum=5;
                                                        break;
                                case 0xbd:disnum=6;
                                                        break;
                                case 0x7d:disnum=7;
                                                        break;
                                case 0xeb:disnum=8;
                                                        break;
                                case 0xdb:disnum=9;
                                                        break;
                                case 0xbb:disnum=10;
                                                        break;
                                case 0x7b:disnum=11;
                                                        break;
                                case 0xe7:disnum=12;
                                                        break;
                                case 0xd7:disnum=13;
                                                        break;
                                case 0xb7:disnum=14;
                                                        break;
                                case 0x77:disnum=15;
                                                        break;
                        }
                }
        }
return disnum;  //返回disnum作为函数值
}

delay(uchar x)  //延时函数
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);
}
把延时语句删除,没有消除前沿抖动部分,运行正常按顺序显示0-F。
软件Keil uVision4,硬件51单片机最小系统板 STC89C52 开发板扩展按键,数码管等其它编程示例运行正常。
请教各位老师什么情况出现开始的错误谢谢!!!
     
发表于 2020-11-6 15:15:49 | 显示全部楼层
把  delay(uchar);    //函数声明
改为  void delay(uchar);    //函数声明

把 delay(uchar x)  //延时函数
{
       ....
}
改为
void delay(uchar x)  //延时函数
{
       ....
}

评分

1

查看全部评分

回复 支持 3 反对 0

使用道具 举报

     
 楼主| 发表于 2020-11-6 12:13:16 | 显示全部楼层
在编辑生成过程出现问题,应该和硬件没有关系
回复 支持 反对

使用道具 举报

     
发表于 2020-11-6 12:16:49 | 显示全部楼层
我喜欢硬件去抖动,读进去来什么就是什么,不需要延时读2次
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-6 12:52:17 | 显示全部楼层
iffi123 发表于 2020-11-6 12:16
我喜欢硬件去抖动,读进去来什么就是什么,不需要延时读2次

谢谢,TB买的按键扩展后还行,没有加软件去抖前按键动作基本没有抖动,刻意在按键按下或抬起减缓按键动作,才发生抖动误操作。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-6 13:09:09 | 显示全部楼层
pdshyh 发表于 2020-11-6 12:52
谢谢,TB买的按键扩展后还行,没有加软件去抖前按键动作基本没有抖动,刻意在按键按下或抬起减缓按键动作 ...

单片机反应慢
回复 支持 反对

使用道具 举报

     
发表于 2020-11-6 13:19:28 | 显示全部楼层
延时放那个地方没啥用。temp=P3;  delay(10); key = P3; if (key == temp){ 键值判断 } 这样才有延时消抖的效果
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-6 13:50:27 | 显示全部楼层

单片机应该是一个周期微妙,按键抖动看介绍10毫秒以内?刚刚接触
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-6 14:30:16 | 显示全部楼层
world_all 发表于 2020-11-6 13:19
延时放那个地方没啥用。temp=P3;  delay(10); key = P3; if (key == temp){ 键值判断 } 这样才有延时消 ...

谢谢,指教
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-6 16:02:39 | 显示全部楼层
chhds 发表于 2020-11-6 15:15
把  delay(uchar);    //函数声明
改为  void delay(uchar);    //函数声明

谢谢chhds 老师, 延时函数加 void问题解决,DA转换MCP4822能否给一个简单应用c51编程示例,只会比葫芦画瓢。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-6 16:28:16 | 显示全部楼层
不是错误,是警告而已。
你那个延时函数么有用void修饰,可能你那个编译器默认没有修饰的情况下是要返回值的(比如 int),所以呢,就报警了,缺少返回值。
声明和定义的地方加个void修饰一下应该就好了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-6 16:36:24 | 显示全部楼层
夏国特 发表于 2020-11-6 16:28
不是错误,是警告而已。
你那个延时函数么有用void修饰,可能你那个编译器默认没有修饰的情况下是要返回值 ...

谢谢指教,刚刚接触,前面的示例有的有有的没有void都没问题还是不熟悉,这个警告不处理掉生成不了hex文件。
回复 支持 反对

使用道具 举报

     
发表于 2020-11-6 16:41:40 | 显示全部楼层
那不就是个警告么,一般不理会,愿意加Void或者加个返回值也行 , 按说一样可以生成HEX,用的什么版本编译器? Keil U3,u4应该都可以。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-6 17:14:18 | 显示全部楼层
IRF540 发表于 2020-11-6 16:41
那不就是个警告么,一般不理会,愿意加Void或者加个返回值也行 , 按说一样可以生成HEX,用的什么版本编译 ...

谢谢,用的是Keil uVision4,翻译是:AJ_2.C(85):警告C290:缺少返回值,也知道是延时函数部分,我把Void加在矩阵键盘扫描函数中的延时函数前了还加错为aoid
回复 支持 反对

使用道具 举报

     
发表于 2020-11-7 15:16:08 | 显示全部楼层
pdshyh 发表于 2020-11-6 16:02
谢谢chhds 老师, 延时函数加 void问题解决,DA转换MCP4822能否给一个简单应用c51编程示例,只会比葫芦画 ...

MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参考
MCP4822.zip (67.4 KB, 下载次数: 3)

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 12:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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